ucos 中的 OS_PRIO_SELF

           

今天在看ucosii 中关于删除任务的函数 OSTaskDel 时看到

 

if (prio == OS_PRIO_SELF) {                                 /* See if requesting to delete self    */
     prio = OSTCBCur->OSTCBPrio;                             /* Set priority to delete to current   */
    }

这样一段代码,一开始不太理解,自己仔细想了想,下面说一下自己的理解。

我先查了一下 OS_PRIO_SELF 是在uCOS_II.H中定义的:

#define  OS_PRIO_SELF           0xFF                    /* Indicate SELF priority                      */

 

即 OS_PRIO_SELF 是一个全局变量,且值是0xFF 。那么这个数字有什么用那?

我是这样理解的,这个常量使用在有关ucos中任务处理的函数上的,用它来代表一个任务自己的优先级,你可能要问了OS_PRIO_SELF的值不是0xff 吗,他怎么代表当前任务自己的优先级那。是这样的,在每一个函数内部都有我上面用红的字体表示出的代码,把当前真实的优先级赋给prio。这样当你不知道当前任务的优先级时,你就可以用OS_PRIO_SELF来代替了。反正它函数内部有转换成真正的优先级的代码。

这样对我们编程者来说更方便。

例如:你想用OSTaskDel ()这个函数删除当前的任务,一种方法是你给函数传当前任务的优先级(前提是你自己知道)即OSTaskDel (24)【假设当前任务的优先级就是24 】,另一种方法是直接写 OSTaskDel (OS_PRIO_SELF )。反正在函数内部会把真正的当前任务优先级赋给prio的。


    

 OSTaskDelReq(LED_TASK_Prio);

OSTaskDelReq(LCD_TASK_Prio);
请求将任务TaskLed和TaskLCD删除,记住,这里只是请求而不是删除。那么在任务TaskLed和TaskLCD执行的时候,将同时调用这个方法判断是否有任务删除请求,如果有那么将执行删除操作:

 if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ) 

                        //#define OS_TASK_DEL_REQ          62   当前任务收到来自其他任务的删除请求;

OSTaskDel(OS_PRIO_SELF);

也就是说,删除任务是分两步来执行,第一步为请求删除任务,第二步才是删除任务。这样做的好处是在系统设计的时候避免直接删除导致任务有些资源没有释放而导致系统运行不正常。
删除任务之后,任务TaskLed和TaskLCD将处于睡眠状态,将不会被系统调度。这个时候可以看到LED0不再闪烁,LCD也不会循环显示。

posted @ 2014-07-15 13:30  SuperThinker  阅读(4)  评论(0编辑  收藏  举报  来源