打印
[ZLG-MCU]

uCOS-II移植模板为何要多用一个OSPendSV中断?

[复制链接]
3004|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ATmega32L|  楼主 | 2008-4-2 17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uCOS-II移植模板为何要多用一个OSPendSV中断?
感觉没必要多用一个中断。

因为CORTEX-M3 中断自动保护局部变量寄存器,
使得切换任务全部都是在C环境下,OSCtxSw与OSIntCtxSw也就可以完全一样。
切换任务都是C环境下调用OSCtxSw,不必保存局部变量寄存器。
(实际上就是C环境下调用汇编规则,汇编可以任意使用局部变量寄存器而不必保存)

OSCtxSw(OSIntCtxSw):
R4-R11入栈(非局部变量寄存器入栈)
XPSR,PC,LR入栈
关中断
OSTCBCur->OSTCBStkPtr=SP
OSTaskSwHook
OSTCBCur=OSTCBHighRdy
OSPrioCur=OSPrioHighRdy
SP=OSTCBHighRdy->OSTCBStkPtr
恢复中断
R4-R11 出栈(非局部变量寄存器入栈)
XPSR,PC,LR出栈
函数返回


相关帖子

沙发
zlgarm| | 2008-4-3 09:09 | 只看该作者

OSPendSV是专用的任务切换中断

   楼主介绍的方法是ARM7切换任务的典型方法。因为ARM7的中断不能在实际意义上嵌套,它追求的是“任务优先、尽快切换任务的原则”,是“就地切换”的方法,这种方法在Cortex-M3上也可以使用,但效率低,不能发挥Cortex-M3的技术优势。
   OSPendSV是专为Cortex-M3切换任务用的。因为Cortex-M3的中断可硬件嵌套,它追求的是“中断优先,尽快响应中断”。假设使用ARM7的“就地切换”方法,当前任务关中断后把新任务切换好,再重开中断,又假如这时有3级的中断嵌套,每级中断都要切换到不同的任务,那么当前任务的1次切换+3级中断的3次任务切换,要切换4次,最后跑的新任务也只不过是其中的一个!在Cortex-M3中,把所有任务切换的事情都放在最低中断优先级的OSPendSV中,前面的4次切换,只要切换1次就行。

(zlgarm_zsg)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

376

帖子

0

粉丝