wince -- 6.0和5.0的区别
WINCE6.0与以前的版本最大的区别莫过于它能支持多达32K的应用程序,每个程序的内存都能达到2G,但这些似乎与BSP无关。BSP只需要关心以下几个方面:
1.
OAL与KERNEL不再链接到一起成KEREN.EXE, WINCE6.0中kernel只是一个DLL,它被OAL.EXEL(运行时刻为KERN.EXE)加载,而OAL与KERNEL之间通过两个函数表来初始化自己的函数,得到对方的函数。
2.
KITL从OAL中分离出来,成为一个单独的DLL,KITL.DLL.
3. MapCallerPtr
一类与内存映射相关的函数不再支持也不需要。
4.
SetKMode也不再需要,因为DRIVER是在KERNEL态运行的。
而第1点也不需要全部自己做,实际上WINCE的开发人员已经帮我们做好了大部内容,只需要包含oal.h这个文件,将编译器报告为重定义的全局变量不再定义即可,OAL中链接时报告找不到变量时即可检查是不是g_pOemGlobal中的成员,如果包含了oal.h还说没有定义则直接对
g_pOemGlobal中的成员赋值即可,例如协处理器相关的成员就没有在oal.h中定义,就直接对其赋值
g_pOemGlobal->fSaveCoProcReg = 1。 而参照帮助中的内容即可将KITL分离出来。MapCallerPtr,
SetKMode 相关的东西,直接MASK掉就行了。
将老的CEC文件转化成PBXCML文件似乎是挺麻烦的,但可以先不理它,用系统已经有的PLATFORM的定义来新建PROJECT,把我们自己的代码拷到它的目录直接调试。BOOTLOADER可以直接用5.0的,5.0和6.0的BOOTLOADER好像是可以互用的。
每个模块该链什么库,可以参考已有的BSP,这样用不到几天就可以PORTING到6.0了。
NKCallIntChain函数:把IRQ转换为SysIntr,值得留意的是pIntChainTable[],是IRQ所对应的ISR处理程序的入口,其中最主要的是其成员函数pfnHandler。pfnHandler的填充,是在HookIntChain里面,这个函数是ISR在初始化的时候调用的。在这个函数里面,如果pIntChainTable为空,则返回SYSINTR_CHAIN,如果pIntChainTable[]不为空,则调用pfnHandler得到一个sysintr值,然后返回之。
OEMInterruptHandler函数:arm处理器中断服务例程ISR,通过查询硬件的中断寄存器,得到硬件IRQ号,并把IRQ转换为SYSINTR。在此函数中首先调用NKCallIntChain(IRQ)函数,将寻找中断链,找到并调用此IRQ对应的ISR(可安装的ISR),如果存在,则返回一个合法的逻辑中断,否则返回SYSINTR_CHAIN,那么此时怎么处理没被处理的这个IRQ呢?OEMInterruptHandler函数接着调用OAL层的一个函数 OALIntrTranslateIRQ来查询静态映射表(IRQ->SYSINTR),找到就返回一个合法的逻辑中断。
可见,arm处理器支持IISR是在ISR中得到体现的,至于NKCallIntChain函数我们不必关心,它是一个内核函数。