首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

 首先,通过使用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所示。以上两个函数都会从对应任务的堆栈中恢复出任务的上下文,使得处理器返回到任务空间。

返回列表