理解优先级反转是什么现象:
优先级反转发生的原因就是因为多种任务执行的时候因为没有信号量执行不了,或者因为延时让出了cpu的使用权,导致其他的优先级低的任务先执行了。这就是优先级反转的现象
举个例子:例子很关键
extern OS_SEM MY_SEM; //创建的信号量
void Task_1(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while(1)
{
OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
OSSemPend(&MY_SEM, 0, OS_OPT_PEND_BLOCKING, 0, &err);
printf("HIGH Task Running!\n");
OSSemPost(&MY_SEM, OS_OPT_POST_ALL, &err);
OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
void Task_2(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while(1)
{
printf("Middle Task Running!\n");
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
void Task_3(void *p_arg)
{
OS_ERR err;
unsigned int times;
(void)p_arg;
while(1)
{
OSSemPend(&MY_SEM, 0, OS_OPT_PEND_BLOCKING, 0, &err);
printf("Low Task Running!\n");
for(times = 0; times < 5000000; times++)
OSSched();
OSSemPost(&MY_SEM, OS_OPT_POST_ALL, &err);
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
注释:任务优先级由高到低 1>2>3,信号量初始值为1
可以看到任务1上来就调用了延时,导致任务2执行,然后任务3执行并且消耗了信号量
此时任务3开启了一定时间的cpu使用权切换,由于此时任务1还是没有信号量,所以还是执行不了
但是任务2没有被限制,所以可以一直执行,等这段时间结束, 任务三补充了信号量+1,此时才会
被任务1(因为他自己的延时也结束了 并且也在需要信号量的状态当中),此时任务1才会执行一
次。
这样就可以看出来任务没有按照优先级顺序执行,而是因为任务调用了延时或者因为没有信号量
影响后执行顺序发生了变化。
这就是优先级反转现象。!!!!