关于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
1楼-- · 2019-07-20 17:06
 精彩回答 2  元偷偷看……
charlefu
2楼-- · 2019-07-20 22:56
charlefu 发表于 2017-3-22 14:38
这都翻译的是神马鬼。闭着眼睛把文档翻译一下就完了?问题是原文档这个情景描述和CRITICAL SECTION没关系啊 ...

而且你说的“后者只是关闭了调度,所以只会被中断打断,打断完后由于调度被关闭,临界区的代码不会被更高优先级的线程打断”这句话,我想说的是,如果中断是在(3)的位置发生,立即打断,转去执行中断函数这个过程,只要转去执行中断函数不就是意味着破坏临界区了吗?这这地方又该如何理解?
ytuljj
3楼-- · 2019-07-21 02:18
嗯嗯,谢谢你的讲解。那个我还是觉得不太对,想和你再探讨一下,你别介意。我举个例子嘛,假设上面的(3)正在为某个资源在外部内中申请一块内存,外部内存分配涉及FSMC的8080并口时序嘛,这期间突然来了个外部中断,如果使用延时发布OS_CFG_ISR_POST_DEFERRED_EN = 1这种方式,还是会中断出去的,中断执行完毕返回时,虽然会恢复退出中断之前CUP个寄存器保存在该任务堆栈中的数据,但是,已经错过FSMC的8080的并口时序,显然分配内存会失败的,也就是保护临界代码是没有实现的,这样的例子很多的啊,再比如读取SD卡的数据,因为使用SDIO协议或者SPI协议,也是有着时序的问题再里面,固然任务中断前的数据以及状态等参数可以从该任务的任务堆栈中恢复,时序是“不等人”的,,这个,你怎么看
ytuljj
4楼-- · 2019-07-21 03:07
 精彩回答 2  元偷偷看……

一周热门 更多>