我知道的:
临界段通过关中断的方式,禁止了任务调度,虽然降低了实时性,但保护了全局变量不被修改。
解释一下:
int a;// 全局变量
void taska(void) void taskb(void)
{ {
while(1) while(1)
{ {
a = 5; // 1 a = 8; // 3
a++; // 2 .....
......... }
} }
}
当程序运行到1句时,a = 5,此时被高优先级任务b抢占,全局变量a=8;当回到任务a时,a++就变成9了,一般不是用户所希望的。
所以taska中的全局变量应该保护一下,方法有很多,可以用开关中断的方法,于是改成如下任务:
void taska(void)
{
while(1)
{
OS_ENTER_CRITICAL();
a = 5; // 1
a++; // 2
OS_EXIT_CRITICAL();
.........
}
}
这样修改a的时就不会被其他任务修改;这是容易理解的。
说了这么多,进入正题:
引用ucos内核os_core.c文件的一句程序
OS_ENTER_CRITICAL();
OSIdleCtr = 0L; /* Clear idle counter */
OS_EXIT_CRITICAL();
疑问:为何赋值0也要保护,就算赋值前OSIdleCtr被修改,但是再回来还是会被赋值0,所以我认为此处的临界段处理是多余的。请问诸位我理解对吗? |