关于UCOSIII直接发布和延迟发布保护临界段代码的疑惑

2019-07-20 15:57发布

最近在看《嵌入式实时操作系统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)执行期间发生的是中断,则临界区代码被打断,没有起到保护作用;如果是高优先级的任务就绪,发生任务切换,则临界区代码不被打断
上面的两种发布模式,分析的结果,好像都无法有效的保护临界区,请问一下我的分析哪里出问题了?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
charlefu
2019-07-20 22:56
charlefu 发表于 2017-3-22 14:38
这都翻译的是神马鬼。闭着眼睛把文档翻译一下就完了?问题是原文档这个情景描述和CRITICAL SECTION没关系啊 ...

而且你说的“后者只是关闭了调度,所以只会被中断打断,打断完后由于调度被关闭,临界区的代码不会被更高优先级的线程打断”这句话,我想说的是,如果中断是在(3)的位置发生,立即打断,转去执行中断函数这个过程,只要转去执行中断函数不就是意味着破坏临界区了吗?这这地方又该如何理解?

一周热门 更多>