OAL点点滴滴(二)
2007-03-18 21:26:03 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�

核心提示:正如CE的帮助文档所言,创建OAL是一个非常复杂的任务,OAL点点滴滴(二),而通常的办法是复制原有的相同平台的OAL代码,然后修改来适应平台的特殊要求,此函数返回IRQ对应的SYSINTRulRet = OEMTranslateIrq(ucCurrentInterrupt);......PICEnableInterr
正如CE的帮助文档所言,创建OAL是一个非常复杂的任务,而通常的办法是复制原有的相同平台的OAL代码,然后修改来适应平台的特殊要求。也就是说对于没有特殊要求的平台,复制原有相同平台的OAL代码就足够了。由于OAL的复杂性在这篇文章中我只讲解常用的部分。
一、实现ISR
1.ISR的概念
ISR(interrupt service routine)是处理IRQs(interrupt request line)的程序。Windows CE用一个ISR来处理所有的IRQ请求。当一个中断发生时,内核的异常处理程序先调用内核ISR,内核ISR禁用所有具有相同优先级和较低优先级的中断,然后调用已经注册的OAL ISR程序,一般ISR有下列特征:
执行最小的中断处理,最小的中断处理指能够检验、答复产生中断的硬件,而把更多的处理工作留给IST(interrupt service thread)。
当ISR完成时返回中断ID(中断ID大部分是预定义的)。
2. X86平台的ISR结构
X86平台的ISR保存在%_WINCEROOT%PUBLICCOMMONOAKCSPI486OALfwpc.c中,函数名为PeRPISR。下面分析一下此函数的主要代码:
ULONG PeRPISR(void)
{
ULONG ulRet = SYSINTR_NOP; ///返回值,既中断ID(以SYSINTR_为前缀)
UCHAR ucCurrentInterrupt; ///当前中断号
if (fIntrTime) ////// fIntrTime 用于测试SR和IST的延时时间,测试工具为ILTiming.exe。
......
ucCurrentInterrupt = PICGetCurrentInterrupt(); ////返回当前中断IRQ
///IRQ0,IRQ0为系统时钟(system tick)中断,具体见“二、实现系统时钟”
if (ucCurrentInterrupt == INTR_TIMER0)
......
if (dwRebootAddress) ////是否需要重启动
RebootHandler();
......
if(ucCurrentInterrupt == INTR_RTC) ////IRQ8,real-time clock的中断
......
else if (ucCurrentInterrupt <= INTR_MAXIMUM) ///如果中断小于 INTR_MAXIMUM
{
ulRet = NKCallIntChain(ucCurrentInterrupt); ////调用中断链
if (ulRet == SYSINTR_CHAIN) ///如果中断链未包含中断
////在IRQ 和SYSINTR之间转换,此函数返回IRQ对应的SYSINTR
ulRet = OEMTranslateIrq(ucCurrentInterrupt);
......
PICEnableInterrupt(ucCurrentInterrupt, FALSE); ///启用除当前中断以外的所有中断
} ///else if
OEMIndicateIntSource(ulRet); ///通知内核已经发生SYSINTR中断
}
从以上代码不难看出ISR的任务就是返回以“SYSINTR_”为前缀的中断ID,如果不需要进一步执行IST,那么就返回SYSINTR_NOP。
- ››OAL点点滴滴(二)
- ››OAL点点滴滴(一)
赞助商链接