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

[复制链接]
 楼主| ATmega32L 发表于 2008-4-2 17:56 | 显示全部楼层 |阅读模式
uCOS-II移植模板为何要多用一个OSPendSV中断?<br />感觉没必要多用一个中断。<br /><br />因为CORTEX-M3&nbsp;中断自动保护局部变量寄存器,<br />使得切换任务全部都是在C环境下,OSCtxSw与OSIntCtxSw也就可以完全一样。<br />切换任务都是C环境下调用OSCtxSw,不必保存局部变量寄存器。<br />(实际上就是C环境下调用汇编规则,汇编可以任意使用局部变量寄存器而不必保存)<br /><br />OSCtxSw(OSIntCtxSw):<br />R4-R11入栈(非局部变量寄存器入栈)<br />XPSR,PC,LR入栈<br />关中断<br />OSTCBCur-&gtOSTCBStkPtr=SP<br />OSTaskSwHook<br />OSTCBCur=OSTCBHighRdy<br />OSPrioCur=OSPrioHighRdy<br />SP=OSTCBHighRdy-&gtOSTCBStkPtr<br />恢复中断<br />R4-R11&nbsp;出栈(非局部变量寄存器入栈)<br />XPSR,PC,LR出栈<br />函数返回<br /><br /><br />
zlgarm 发表于 2008-4-3 09:09 | 显示全部楼层

OSPendSV是专用的任务切换中断

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

本版积分规则

144

主题

376

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

144

主题

376

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部