网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

RTOS为什么用PendSV进行线程调度?

时间:2023-03-01 10:47

人气:

作者:admin

标签:

导读:有些操作系统在“心跳”中断(SysTick中断)里进行线程切换,如果处理器正在执行一个ISR,此时SysTick异常到来,且SysTick优先级高,抢占了正在运行的用户ISR,SysTick ISR是不能进行线程切...

有些操作系统在“心跳”中断(SysTick中断)里进行线程切换,如果处理器正在执行一个ISR,此时SysTick异常到来,且SysTick优先级高,抢占了正在运行的用户ISR,SysTick ISR是不能进行线程切换的,因为SysTick ISR运行完后要返回上一层用户ISR,此时仍然处于异常模式,不能进入线程模式,强行进入线程模式会导致Fault异常。如下图,延时到了第二个SysTick ISR才线程切换,实时性降低。在这种情况下,SysTick ISR中切换任务,这会导致任务切换延后。

pYYBAGP-vBmABjqgAACZDOEhLTs867.png

极端的情况下,SysTick中断和用户中断步调一致,会导致任务切换严重滞后。如下图所示:

pYYBAGP-vC-ARgIWAACHJ2Iqn98501.png

有朋友说了,既然SysTick中断抢占了用户中断不能调度线程,那么在用户ISR即将退出时进行调度就好了呀,确实比上面的情况要好一些,但这就需要在所有中断的末尾都要检查是否需要切换,增加用户中断程序复杂度。

也有朋友说了,把SysTick中断优先级调到最低是不是也可以呢,当然可以,调低了优先级,避免了嵌套,就算用户中断期间产生SysTick中断,但是SysTick中断不能运行,用户中断结束后,SysTick中断“咬尾”,这样是没问题的,可是有一点SysTick的优先级就无法提高了。

鉴于上述原因,我们想到了PendSV异常,这个异常比较特殊,可以理解为一个软中断(软异常),代码中操作寄存器就可以触发此中断,我们把它的优先级调整到最低,当SysTick ISR抢占了用户中断后,发现需要任务调度,就设置寄存器触发PendSV异常,因为它优先级最低,不能响应,等到用户中断执行完立即自动响应,进行任务切换,如下图所示。

poYBAGP-vECAXPiBAAC198jzyNM802.png

一般情况下:

1、PendSV中断优先级设置为最低,用于线程调度。

2、SysTick中断优先级根据自己需求设置,如果想让心跳更准确就调高一些,如果想让用户中断相应更迅速就调低一些。

3、可以和PendSV一样都设置为最低。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信