WinCE OAL中的Startup.s介绍

系统 1827 0

原文地址:http://blog.csdn.net/nanjianhui/archive/2009/01/31/3855686.aspx

作者:ARM-WinCE

应该说Startup.s是OAL最开始的入口,就像EBOOT中的Startup.s一样,它也是WinCE内核最开始运行的代码。一般在BSP中,EBOOT的Startup.s和OAL的Startup.s的功能应该是一样的,但是还是会有些区别,很多情况取决于BSP的开发者,两个Startup.s之间可以共享很多代码,也可以部分共享或者彼此独立。

OAL中的Startup的起始位置定义如下:

LEAF_ENTRY      Startup

主要就是初始化CPU,对于ARM来说,大致步骤如下:

1. 设置CPU为supervisor模式

2. 禁用IRQ和FIQ中断

3. 关闭MMU和指令数据Cache

4. 刷新Cache和TLB,清空write buffer

5. 确认启动原因,可能是EBOOT跳转过来启动,冷启动,热启动,Watchdog复位等

6. 配置GPIO来点亮LED

7. 配置Memory控制器及时序

8. 配置中断控制器,清除所有中断

9. 初始化RTC

10. 配置CPU的电源管理

11. 设置CPU的时钟及相关的外设的时钟

12. 将OEMAddressTable的起始地址写入r0寄存器

13. 跳转到Kernelstart中

程序最后会跳转到KernelStart中,在Private目录下的armstart.s中,这里仍然是汇编,大致步骤如下:

1. 基于传入的OEMAddresstable初始化一级页表

2. 使能MMU和Cache

3. 为每一种ARM模式建立堆栈

4. 调用ARMInit函数获得kernel.dll的入口,该函数在arminit.c中定义

5. 返回kernel.dll的入口为NKStartup,在mdarm.c中定义,跳转到kernel.dll入口开始运行

6. 在NKStartup中读取CPU的ID判断ARMv6架构,初始化内核的全局变量

7. 调用OEMInitDebugSerial初始化调试串口

8. 调用OEMInit初始化相关的外设接口

9. 调用OEMCacheRangeFlush刷新Cache和TLB

10. 调用KernelFindMemory来划分对象存储空间和程序内存空间

11. 调用kernelstart函数,它与最开始的kernelstart不同,它在armtrap.s中定义

到此应该说CPU相关的初始化基本完成了,下面就是要开始WinCE内核的初始化了,大致步骤如下:

1. 跳转到armstrap.s中的kernelstart继续执行

2. 调用KernelInit函数,在nkinit.c中定义,主要完成API集的初始化,内核Heap的初始化,内存池的初始化,进程和线程的初始化,最后是映射文件的初始化

3. 在执行完KernelInit之后,会跳转到FirstSchedule进行第一次系统调度,到此内核已经运行起来了。

这里把整个的初始化过程介绍了一下,实际上Startup.s只是WinCE启动最开始的部分,完成CPU级别的初始化,这段代码都是汇编,调试起来也简单也困难,简单是因为都是顺序执行的,只是初始化CPU,困难是因为没有好的调试手段,一般在这里都是通过点LED的方式来判断程序执行的位置。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/joyzml/archive/2010/04/25/5526442.aspx

WinCE OAL中的Startup.s介绍


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论