|
本帖最后由 seanwaye 于 2017-6-1 16:33 编辑
各位朋友好:
最近调试代码遇到个问题:
假设Task_A和Task_B两任务的优先级分别为high和low,这两个任务都需要使用互斥信号量mutex,这个互斥信号量在中断服务函数里面释放,代码简略示意如下:
Task_A()
{
.............
while(1)
{
OSMutexPend ( &mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &err );
.........
OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err ); //延时100ms }
}
Task_B()
{
............
while(1)
{
OSMutexPend ( &mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &err );
.........
OSTimeDlyHMSM ( 0, 0, 0, 50, OS_OPT_TIME_HMSM_STRICT, &err ); //延时50ms }
}
void xxxx_IRQHandler()
{
OS_ERR p_err;
OSIntEnter();
............
OSIntExit();
OSMutexPost ( &mutex, OS_OPT_POST_NONE, &p_err );
}
问题是: 在这个中断服务函数释放互斥信号量后,一直都是Task_A运行,Task_B一直得不到运行,如果不加互斥信号量任务A和B都能轮流运行的,所以任务应该是不存在被高优先级剥夺了运行权限的可能的,
后来我把任务A改成这样:
Task_A()
{
............
while(1)
{
OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err ); //延时100ms
OSMutexPend ( &mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &err );
.........
OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err ); //延时100ms }
}
也就是在任务A的死循环开头加了个100ms的延时,这时候又变成了一直是任务B运行,任务A一直拿不到信号量,感觉很不可思议,所以发帖出来请各位朋友帮忙分析下大概是什么原因。
这个代码是基于ucosIII3.05版本的。
|
|