最近在看《嵌入式实时操作系统uC/OS-III》一书,想深入研究了一下UCOSIII,在中断管理的直接发布和延迟发布模块遇到了一个问题想不通,想请教一下各位前辈,还望不吝赐教:
直接发布和延迟发布中都有一个值得关注的话题,那就是临界代码段的保护,也就是保护处于OS_CRITICAL_ENTER与OS_CRITICAL_EXIT之间的代码,之间的代码是原子性质的、连续的、不可被打断的(比如从SD卡中读数据),直接发布采用关中断的方式进行保护,延迟发布采用调度器上锁的方式保护。我的疑惑如下:
void AppTask(void *p_arg)
{
...... (1)
OS_CRITICAL_ENTER(); (2)
....... (3)
OS_CRITICAL_EXIT(); (4)
...... (5)
}
OS_CFG_ISR_POST_DEFERRED_EN = 0;
直接发布:上述(2)执行完毕后中断关闭----->假若:在(3)执行期间发生中断,结果是临界区代码不被打断;在(3)执行期间更高优先级的任务就绪,结果是发生任务调度(4)执行完毕 后,中断被开启并发生任务切换,期间发生中断则跳转执行中断函数。
结果:如果在临界区(3)执行期间发生的是中断,则临界区代码不被打断,起到保护作用;如果是高优先级的任务就绪,发生任务切换,则临界区代码被打断
OS_CFG_ISR_POST_DEFERRED_EN = 1;
延迟发布:上述(2)执行完毕后调度器上锁,假设在(3)执行期间发生中断,结果临界区代码被打断转而执行中断函数;在(3)执行期间更高优先级的任务就绪,结果不会发生任务调度。
结果:如果在临界区(3)执行期间发生的是中断,则临界区代码被打断,没有起到保护作用;如果是高优先级的任务就绪,发生任务切换,则临界区代码不被打断
上面的两种发布模式,分析的结果,好像都无法有效的保护临界区,请问一下我的分析哪里出问题了?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>