μC/OS之OSTaskDel()

本文详细解析了RTOS中任务删除函数OSTaskDel的工作流程,包括优先级判断、就绪表及等待表更新、任务调度阻塞等关键步骤。通过具体代码展示了如何安全地删除任务,并保持系统的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://blog.youkuaiyun.com/xiaocaichonga/article/details/7463753


  1. INT8 OSTaskDel (INT8U prio)  
  2. {  
  3.    OS_TCB *ptcb;         /*建立两个局部指针,分别用来指向TCB,和EVENT*/  
  4.    OS_EVENT *pevent;  
  5.      
  6.      
  7.    if(prio == OS_IDLE_PRIO) /*判断是否为空闲任务,判断任务优先级是否有效*/  
  8.    {  
  9.       return (OS_TASK_DEL_IDLE);  
  10.    }  
  11.    if(prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF)  
  12.    {  
  13.       return (OS_PRIO_INVALID);  
  14.    }  
  15.      
  16.      
  17.    OS_ENTER_CRITICAL(); /*关中断,因为以下的操作将涉及到一些其他任务也可能访问到的资源*/  
  18.    if (OSIntNesting > 0)  /*查看是否处于中断服务子程序状态,删除*/  
  19.    {  
  20.       OS_EXIT_CRITICAL();  
  21.       return (OS_TASK_DEL_ISR);  
  22.    }  
  23.      
  24.      
  25.    if (prio == OS_PRIO_SELF)  /*查看是否要删除正在执行的任务*/  
  26.    {  
  27.       prio = OSTCBCur->OSTCBPrio;  
  28.    }  
  29.      
  30.    if((ptcb = OSTCBPrioTbl[prio] != (OS_TCB *)0  
  31.    {  
  32.       if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) /*判断任务是否在就绪表中,若在则删除*/  
  33.       {  
  34.          OSRdyGrp &= ~ptcb->OSTCBBitY;  
  35.       }  
  36.         
  37.         
  38.         
  39.       if((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0)  /*判断任务是否在邮箱、消息队列或信号量等待表中,若在则删除*/  
  40.       {  
  41.          if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0)  
  42.          {  
  43.             pevent->OSEventGrp &= ~ptcb->OSTCBBitY;  
  44.          }  
  45.       }  
  46.         
  47.       ptcb->OSTCBDly = 0;                /*防止被OSTmieTick()调用,使其进入就绪状态*/                 
  48.       ptcb->OSTCBStat = OS_STAT_RDY;      /*防止被OSTaskPesume()调用,使其进入就绪状态,因OSTaskPesume()中有个条件!=OS_STAT_RDY*/  
  49.         
  50.       OSLockNesting++; /*关闭任务调度功能,因为此时被删除的任务已经处于休眠状态,不可被任何任务调度了*/  
  51.                        /*如果没有关闭任务调度功能,万一在后来的开中断后,进行了任务切换,那么该任务就占用了内存而无法删除了*/  
  52.                          
  53.       OS_EXIT_CRITICAL(); /*开中断,以便服务中断事件,减小中断响应时间,*/  
  54.         
  55.       OSDummy();    /*这是因为中断允许指令会强制CPU禁止中断直到下一个指令结束!如果没有该指令,则继续执行下条指令,而下条指令是*/  
  56.                     /*关中断,导致没有机会响应中断服务程序*/  
  57.                       
  58.       OS_ENTER_CRITICAL(); /*中断服务程序执行完毕,返回删除任务函数,继续执行任务剩下部分的删除*/  
  59.       OSLockNesting--;     /*允许任务调度*/  
  60.         
  61.       OSTaskDelHook(ptcb); /*删除用户为扩展TCB而附加的数据域*/  
  62.       OSTaskCtr--;          /*将任务个数减小1*/  
  63.       OSTCBPrioTbl[prio] = (OS_TCB *)0; /*将TCB优先级表中对应为置位NULL*/  
  64.         
  65.       if (ptcb->OSTCBPrev == (OS_TCB *)0)   /*将任务的TCB从双向TCB链表中删除*/  
  66.       {  
  67.          ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0; /*被删除任务TCB在TCB链表表头的情况*/  
  68.          OSTCBList = ptcb->OSTCBNext;  
  69.       }  
  70.       else  
  71.       {  
  72.          ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext; /*在表中的情况*/  
  73.          ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;  
  74.       }                                                /*并没有考虑表尾情况,因为表尾为空任务*/  
  75.         
  76.       ptcb->OSTCBNext = OSTCBFreeList;                 /*TCB返回到空TCB链表*/  
  77.       OSTCBFreeList = ptcb;  
  78.       OS_EXIT_CRITICAL();  
  79.         
  80.       OSSched();                                       /*删除完毕调度任务*/  
  81.       return (OS_NO_ERR);  
  82.    }       
  83.    else  
  84.    {  
  85.       OS_EXIT_CRITICAL();  
  86.       return (OS_TASK_DEL_ERR);  
  87.    }  
  88. }  
  89.   
  90.   
  91. 小结:OSTaskDel()做了哪些事:  
  92.      ①更新5个表中的相关信息;  
  93.      ②阻塞两个函数的调度  
  94.      ③更新记录任务数的变量;  
  95.      ④删除对TCB扩充的数据域;  
  96.  步骤:  
  97.      ①判断优先级是否为空闲进程,优先级是否有效;  
  98.      ②判断任务删除是否在中断服务子程序中进行;  
  99.      ③判断所要删除的任务是否存在;  
  100.      ④更新就绪表中的信息;更新等待表中的信息;  
  101.      ⑤阻塞OSTmieTick(),OSTaskPesume()函数调用;  
  102.      ---主要做的就是将任务无法进入就绪状态-----  
  103.      ----此时该任务成休眠状态------------  
  104.      ⑥关闭任务的调度功能,并运行中断,以便响应中断,减小中断响应;  
  105.      ⑦关闭中断继续执行,并打开任务的调度功能。  
  106.      ⑧更新TCB优先级表,TCB链表,空闲TCB链表,任务数  
  107.      ⑨删除TCB中扩展功能申请的数据域  
  108.      ----此部分是更新各个表中的信息-------  
  109.      10.任务调度  
  110.        
  111.      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值