irq与逻辑中断号的对应关系的建立.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
irq与逻辑中断号的对应关系的建立

WINCE5.0的中断深入了解 1.总体了解流程 首先描述wince5.0?(2440BSP)的中断流程: 流程1.创建事件a?创建线程IST?用InterruptInitialize〈系统中断号绑定线程IST〉?线程IST进入等待事件a状态(挂起状态)。 流程2.外部引发中断??OEMInterruptHandler屏蔽中断?把物理中断转换成系统中断,其他?重新使能中断。(ISR过程)?操作系统根据系统中断号触发事件a。 流程3.挂起的IST线程等待到事件a进入就绪状态,得到执行时间后开始执行中断服务代码,?最后调用InterruptDone重新使能当前的中断。 你需要为你的设备驱动写好中断处理请求(ISR)和中断服务线程(IST),并牢记这些事件的顺序: 1).当一个中断发生,处理器跳转到核心的中断处理程序(exception handler ); 2).这个中断处理程序禁止所有同级或低优先级的其他中断,然后为当前的IRQ调用对应的ISR; 3).ISR中会按照中断标识的形式,返回一个逻辑中断号给中断处理程序,并会置位板级设备中断; 4).中断处理程序重新使能所有的中断,而目前的中断已经在上一步中置位了,然后就触发对应的IST事件; 5).IST就绪,服务于中断设备,然后完成对中断的处理; 6).IST调用InterruptDone函数,该函数将顺序调用OAL层的OEMInterruptDone函数,它将重新使能当前的中断。 1.1物理中断和逻辑中断的对应关系如何建立 这个函数用将物理中断号来获取逻辑中断号: KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, g_PwrButtonIrq, sizeof(UINT32), g_PwrButtonSysIntr, sizeof(UINT32), NULL)) 其中:UINT32 g_PwrButtonIrq = IRQ_EINT0; 从help里面查出,KernelIoControl函数最终是调用OEMIoControl函数。 在D:\WINCE500\PLATFORM\COMMON\SRC\COMMON\IOCTL里找到它的定义了,关键代码: // Execute the handler ? ? rc = g_oalIoCtlTable.pfnHandler( ? ?? ???code, pInBuffer, inSize, pOutBuffer, outSize, pOutSize ? ? );在SMDK2440\Src\Kernel\Oal\ioctl.c中可以找到: const OAL_IOCTL_HANDLER g_oalIoCtlTable[] = { #include ioctl_tab.h }; 在SMDK2440\Src\Inc\ioctl_tab.h文件中,找到这个表的定义。这个命令对应的函数是OALIoCtlHalRequestSysIntr。 PLATFORM\COMMON\SRC\COMMON\IOCTL\ioctl.c找到这个函数定义: // Find if it is new or old call type ? ? if (inpSize sizeof(UINT32) pInpData[0] == -1) { ? ?? ???// Second UINT32 contains flags, third and subsequents IRQs ? ?? ???sysIntr = OALIntrRequestSysIntr(inpSize/sizeof(UINT32) - 2, pInpData[2], pInpData[1]); }?else {? ?? ??? ? ?? ???// This is legacy call, first UINT32 contains IRQ ? ?? ???sysIntr = OALIntrRequestSysIntr(1, pInpData, 0); ? ? } 在WINCE500\PLATFORM\COMMON\SRC\COMMON\INTR\BASE\map.c找到OALIntrRequestSysIntr定义: irq = pIrqs[0]; sysIntr = g_oalIrq2SysIntr[irq]; 在同一个文件中定义:static UINT32 g_oalIrq2SysIntr[OAL_INTR_IRQ_MAXIMUM]; 对这个表格赋值仅有两个地方:VOID OALIntrStaticTranslate(UINT32 sysIntr, UINT32 irq) { ? ? OALMSG(OAL_FUNCOAL_INTR, ( ? ?? ???L+O

文档评论(0)

aicencen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档