Windows CE内核启动分析

移植或者创建一个BSP,也许需要先熟悉Windows CE的 内核 启动过程.

只有理解了整个启动过程,才能更好的开发驱动程序。

目录

基于ARM的Windows CE内核启动分析1

1.startup.s

2.KernelStart

2.1 ARMInit()

2.1.1 OALIntrInit

2.1.2 OALTimerInit

2.1.2.1 Variable Tick Scheduler

2.2 KernelInit()

2.3 FirstSchedule



1.startup.s

内核入口点startup.S,内核从这里启动.因为内核经过bootloader加载,内核运行时候,已经由bootloader完成了硬件的基本初始化(关闭watchdog, pll设置等等)所以,startup.S的任务比较简单,只是将oemaddrtab_cfg.inc里面的g_oalAddressTable数组地址作为参数,传递给KernelStart,这个数组用来描述和实现物理地址到虚拟地址的映射.

(. + 8)是流水线处理.KernelStart()位于

PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s

2.KernelStart

ARMInit()位于本目录的mdarm.c文件.

KernelInit()位于PRIVATE\WINCEOS\COREOS\NK\KERNEL\kwin32.c中.

FirstSchedule()位于armtrap.s的一个label.

主要关注ARMInit()和KernelInit(),前一个进行目标板的初始化,后一个负责内核的初始化.FirstSchdule()开始调度第一个程序.

2.1 ARMInit()

先看看ARMInit()它的几个关键性动作如下:

KernelRelocate()是进行重定位.KernelFindMemory()是查找系统可用内存,并分成应用内存和object store两部分.这2个函数都已由MS自己实现.我们需要添加的函数是名字以OEM开头的函数.

OEMInitDebugSerial()初始化一个调试口,我们一般使用一个串口来作为调试口,这个函数需要自己实现,在 PLATFORM\SMDK2440A\Src\Kernel\Oal\debug.c中定义这个函数.比如可以将串口0设置为调试口,在这个函数中对串口0进行初始化.

OEMInit()是一个比较重要的函数,

OALCacheGlobalsInit()在PLATFORM\COMMON\SRC\ARM\COMMON\CACHE\init.s中实现,这部分代码以PQOAL的形式提供.

OALIntrInit()初始化中断.

OALTimerInit()初始化定时器TIMER4,作为系统时钟(tick),

configGPIO()初始化gpio口,设置相关寄存器.

InitDisplay()初始化LCD.有时候,我们希望在oal启动和内核加载期间显示一副等待图片或者显示LOGO,为达到这个目的,需要先初始化LCD.

OALKitlStart()准备启动KITL.

此外,在ARMInit还会通过调试口打印一些基本信息,开始时候打印”Windows CE Kernel for ARM….”字样, 中间打印处理器类型等等信息.结束时候打印” ARMInit done.”

2.1.1 OALIntrInit

调用OALIntrMapInit()初始化2个数组g_oalSysIntr2Irq,g_oalIrq2SysIntr,这2个数组表征irq和逻辑中断SysIntr的映射关系.

然后初始化中断寄存器,

最后,留一个接口给oem: BSPIntrInit(),如果oem需要在这个阶段初始化一些中断,可以定义这个函数并实现.

2.1.2 OALTimerInit

这个函数比较重要. 都知道所有WinCE系统都需要一个定时器来提供一个heartbeat,

这里定时器用来作进程调度,时间片选,没有这个定时器,系统的进程无法完成,进程通过这个定时器判定什么时候执行哪个进程。

g_oalTimer包含各种系统时钟相关的变量.

curridlehigh, curridlelow,这2个32位的DWORD变量合起来实现一个64位的计数器,反映了系统处于空闲模式(Idle mode)的时间。一般在OEMIdle()函数内更新。用户程序通过调用GetIdleTime()函数可以得到这个值。

初始化内核函数指针:pQueryPerformanceFrequen cy, pQueryPerformanceCounter .通过这两个函数实现高精度的计时器. 这两个函数的原型也已经由PQOAL实现.

初始化TIMER4作为系统时钟.TIMER4是一个16bit的定时器.此函数将TIMER4设置成为自动转载模式.

2.1.2.1 Variable Tick Scheduler

可变的系统时钟节拍,这个是WinCE5.0中增加的新的性能.

每一次定时器中断时候,内核分析所有线程后决定切换到哪个线程运行.假如所有线程都在等待状态,系统将进入idle状态.在这个状态的时候,任何中断都会唤醒系统重新开始调度.一般系统大部分时间是处于idle状态的,内核会调用OEMIdle()进入idle状态,我们已经知道这个状态会被任何中断唤醒. 在以前的版本中,系统中断(即上面的TIMER4中断)每毫秒产生一次,查看系统是否需要重新调度. 为了节电,不希望中断那么频繁.于是WinCE5.0中,在调用OEMIdle()之前会先调用pOEMUpdateRescheduleTime (). 通过这个函数重新设置侠义次系统时钟中断的时间.

2.2 KernelInit()

再看看KernelInit()函数

不过多关注KernelInit().

2.3 FirstSchedule

位于armtrap.s的一个label.开始第一个线程调度.整个内核开始运行.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows CE.NET(简称CE.NET)是微软公司开发的一种嵌入式操作系统平台。它的内核模块是系统的核心部分,负责处理系统的基本功能和提供必要的服务。下面是关于Windows CE.NET内核模块的一些详细介绍: 1. 内核架构:Windows CE.NET的内核模块采用了可微内核架构,它拥有轻巧且高度可定制的特性。内核负责管理和调度系统资源,包括进程、线程、内存、设备驱动等。它提供了一个稳定且高效的运行环境。 2. 实时性:内核模块具备实时性能,可以满足实时应用的需求。它支持低延迟、高可预测性的任务调度,使得任务能够在规定的时间内完成。 3. 多任务管理:内核模块支持多任务管理,可以同时运行多个任务,并为它们提供资源共享和保护机制。通过任务调度,内核模块可以合理分配系统资源,提高系统的性能和效率。 4. 内存管理:内核模块负责管理系统的内存资源,包括内存分配、释放、保护等。它可以有效地管理内存碎片化问题,并提供虚拟内存机制,充分利用有限的内存空间。 5. 设备驱动支持:内核模块提供了丰富的设备驱动支持,可以与各种硬件设备进行通信和交互。它支持多种通信接口,包括串口、并口、USB、以太网等,为应用程序提供了丰富的硬件支持。 6. 安全性:内核模块提供了安全机制,可以对系统进行安全管理和保护。它提供了访问控制、数据加密、身份验证等功能,确保系统的安全性和可靠性。 通过以上介绍,可以看出Windows CE.NET的内核模块在嵌入式系统中具有重要作用。它为系统提供了高效、稳定的运行环境,并与各种硬件设备进行良好的兼容。它的实时性能、多任务管理和内存管理等功能,使得系统可以同时运行多个任务,并提供快速响应和高性能。内核模块的安全功能也保护了系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值