- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-04-30 07:46:22
荣誉版主
- 积分
- 2319
|
发表于 2024-3-26 16:41:18
|
显示全部楼层
本帖最后由 tzz1983 于 2024-3-26 17:26 编辑
只用中断切任务的OS是不需要嵌套计数器的, 比如FreeRTOS的设计中,就没有嵌套计数器.
中断切换任务的原理是,PendSv为最低优先中断, 除PendSv之外的中断如果想要切换任务,就触发PendSv中断, 退出当前中断后才能进入PendSv中断, 也就是说, 除了PendSv以外,别的中断只是提交请求,没有真的切换(延时切换,由PendSv代劳). 所以中断切换任务永远不会发生嵌套问题,硬件自动搞定了.用中断的方式就和没有OS一样.
uC/OS出现的年份早一些,支持更多的切换方式,本身源码就包含嵌套计数器, 有两个目的,一是防止嵌套中断时直接返回任务级. 二是,OS可以由此知道当前代码是否为中断例程,OS服务针对此有不同的处理方式.
从嵌套的中断直接返回任务是严重的BUG,如果是M3, 你将会被硬件Faults伺候
函数切换任务的本质是用代码操作直接跳转到另一个任务。
在中断里用函数切换任务,分两种情况,如果是嵌套,正确的操作是返回到之前的那个中断,切换任务将由最后一个将要退出的中断来完成。
如果不是嵌套中断,则自已就是最后退出的那个中断,可以直接切换任务。
通过判断嵌套计数器非0值来判断当前是否为嵌套中断
|
|