新闻中心

EEPW首页>嵌入式系统>设计应用> 基于μC/OS-II的中断下半部设计方案

基于μC/OS-II的中断下半部设计方案

作者: 时间:2011-08-08 来源:网络 收藏

  2.2 下管理函数OSDoSirq()的实现

  这是实现的核心部分。其代码如下:


 首先,通过使用OSIntNesting++以防止softirq的重入,设置softirq_stat的值为S0FTIRQ_RUNNING以标识softirq在执行。通过检查softirq_pending的值来判断是否还有就绪的softirq等待执行。

  然后,利用INTS_0N()显示允许,并执行getHighPrioSirq()函数快速地判断已就绪最高优先级的softirq的序号。getHighPrioSirq()利用了PendingMap[]数组实现了以空间换时间的思想,能够快速计算出一个32位无符号整数中最低一位“1”的序号。PendingMap口是有256个INT32U类型数据的数组,PendingMap[temp]的值就是以二进制表示的8位无符号整数temp中最低一位“1”的序号。getHighPrioSirq()判断一个32位整型无符号数中最低一位“1”的序号,最多只要经过4次与操作和移位操作。所以,getHighPrioSirq()是一个非常快速的函数,不会给处理器带来明显的负担。

  softirq[]是服务函数指针数组,它内含32个数据对应不同的32个softirq。(*softirq[num])()会将PC设为第num个服务函数的入口地址,从而执行这个服务函数。执行完成后立即关闭中断并清除这个softirq的就绪标志。

  当所有的就绪softirq执行完成后,设置softirq_stat为SOFTIRQ_NONE,执行OSIntNesting一一,并调度下半部出口函数OSSirqExit()离开中断下半部。

  2.3 中断下半部出口函数OSSirqExit()的实现

  OSSirqExit()将首先判断OSLockNesting的值,若为O,则执行OSStartHighRdy()调度执行已就绪的最高优先级的任务;若非0,则执行OSResumeCur()调度执行被中断的任务,如图3所示。以上两个函数都会从对应任务的堆栈中恢复出任务的上下文,使得处理器返回到任务空间。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭