结构体OS_TCB

任务控制块的数据结构如下:
  1. typedef struct os_tcb {  
  2.     OS_STK        *OSTCBStkPtr;        /* Pointer to current top of stack                              */  
  3.   
  4. #if OS_TASK_CREATE_EXT_EN > 0  
  5.     void          *OSTCBExtPtr;        /* Pointer to user definable data for TCB extension             */  
  6.     OS_STK        *OSTCBStkBottom;     /* Pointer to bottom of stack                                   */  
  7.     INT32U         OSTCBStkSize;       /* Size of task stack (in number of stack elements)             */  
  8.     INT16U         OSTCBOpt;           /* Task options as passed by OSTaskCreateExt()                  */  
  9.     INT16U         OSTCBId;            /* Task ID (0..65535)                                           */  
  10. #endif  
  11.   
  12.     struct os_tcb *OSTCBNext;          /* Pointer to next     TCB in the TCB list                      */  
  13.     struct os_tcb *OSTCBPrev;          /* Pointer to previous TCB in the TCB list                      */  
  14.   
  15. #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)  
  16.     OS_EVENT      *OSTCBEventPtr;      /* Pointer to event control block                               */  
  17. #endif  
  18.   
  19. #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)  
  20.     void          *OSTCBMsg;           /* Message received from OSMboxPost() or OSQPost()              */  
  21. #endif  
  22.   
  23. #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)  
  24. #if OS_TASK_DEL_EN > 0  
  25.     OS_FLAG_NODE  *OSTCBFlagNode;      /* Pointer to event flag node                                   */  
  26. #endif      
  27.     OS_FLAGS       OSTCBFlagsRdy;      /* Event flags that made task ready to run                      */  
  28. #endif  
  29.   
  30.     INT16U         OSTCBDly;           /* Nbr ticks to delay task or, timeout waiting for event        */  
  31.     INT8U          OSTCBStat;          /* Task status                                                  */  
  32.     INT8U          OSTCBPrio;          /* Task priority (0 == highest, 63 == lowest)                   */  
  33.   
  34.     /* OSTCBX,OSTCBBitX,OSTCBY,OSTCBBitY 的作用是加快任务切换速度,对Prio进行了预处理               */  
  1.     INT8U          OSTCBX;             /* Bit position in group  corresponding to task priority (0..7) */  
  2.     INT8U          OSTCBY;             /* Index into ready table corresponding to task priority        */  
  3.     INT8U          OSTCBBitX;          /* Bit mask to access bit position in ready table               */  
  4.     INT8U          OSTCBBitY;          /* Bit mask to access bit position in ready group               */  
  5.   
  6. #if OS_TASK_DEL_EN > 0  
  7.     BOOLEAN        OSTCBDelReq;        /* Indicates whether a task needs to delete itself              */  
  8. #endif  
  9. } OS_TCB;  

任务控制块初始化函数

  1. INT8U   OS_TCBInit(INT8U prio, OS_STK * ptos, OS_STK * pbos, INT16U id, INT32U stk_size, void * pext, INT16U opt){  
  2.   
  3.   
  4. #if OS_CRITICAL_METHOD == 3                     <span style="white-space:pre">  </span>/* Allocate storage for CPU status register <span style="white-space:pre">   </span>*/  
  5.     OS_CPU_SR           cpu_sr;<span style="white-space:pre">                   </span>/// typedef unsigned<span style="white-space:pre">   </span>int<span style="white-space:pre">    </span>OS_CPU_SR;  
  6. #endif  
  7.     OS_TCB              *ptcb;  
  8.       
  9.       
  10.     OS_ENTER_CRITICAL();<span style="white-space:pre">                          </span>/* OS_TCB *OSTCBFreeList(原型)   
  1. <span style="white-space:pre">                                      </span>初始化时 OSTCBFreeList= & <span style="font-family: Arial, Helvetica, sans-serif;">OSTCBTbl[0]<span style="white-space:pre">         </span>*/</span>  
  1.     ptcb = OSTCBFreeList;                           /* Get a free TCB from the free TCB list<span style="white-space:pre">  </span>*/  
  2.     if( ptcb != ( OS_TCB * ) 0 ){<span style="white-space:pre">                     </span>///从缓冲池申请一个OS_TCB块  
  3.         OSTCBFreeList           = ptcb->OSTCBNext;       /* Update pointer to free TCB list      */  
  4.         OS_EXIT_CRITICAL();<span style="white-space:pre">                       </span>///链表的操作,以及对缓冲池的操作  
  5.         ptcb->OSTCBStkPtr        = ptos;             /* Load Stack pointer in TCB            */  
  6.         ptcb->OSTCBPrio          = (INT8U) prio;         /* Load task priority into TCB          */  
  7.         ptcb->OSTCBStat          = OS_STAT_RDY;          /* Task is ready to run             */  
  8.         ptcb->OSTCBDly           = 0;                /* Task is not delayed              */  
  9.   
  10.   
  11.   
  12. #if OS_TASK_CREATE_EXT_EN > 0                        ///若允许扩展则对下列变量初始化,否则赋给自身,防止编译器警告///  
  13.         ptcb->OSTCBExtPtr        = pext;             /* Store pointer to TCB extension       */  
  14.         ptcb->OSTCBStkSize       = stk_size;         /* Store stack size                 */  
  15.         ptcb->OSTCBStkBottom = pbos;                 /* Store pointer to bottom of stack     */  
  16.         ptcb->OSTCBOpt           = opt;              /* Store task options               */  
  17.         ptcb->OSTCBId            = id;               /* Store task ID                */  
  18. #else  
  19.         pext                = pext;         <span style="white-space:pre">  </span>/* Prevent compiler warning if not used  */  
  20.         stk_size            = stk_size;  
  21.         pbos                = pbos;  
  22.         opt             = opt  
  23.         id              = id;  
  24. #endif  
  25.       
  26.   
  27. #if OS_TASK_DEL_EN > 0   
  28.         ptcb->OSTCBDelReq        = OS_NO_ERR;              
  29. #endif  
  30.                                         ///对prio进行预处理,                        
  31.         ptcb->OSTCBY             = prio >> 3;          /* Pre-compute X,Y,BitX,and BitY        */  
  32.         ptcb->OSTCBBitY          = OSMapTbl[ptcb->OSTCBY];  
  33.         ptcb->OSTCBX             = prio & 0x07;  
  34.         ptcb->OSTCBBitX          = OSMapTbl[ptcb->OSTCBX];  
  35.           
  36. #if OS_EVENT_EN > 0  
  37.         ptcb->OSTCBEventPtr      = ( OS_EVENT * ) 0;     /* Task is not pending on an event      */  
  38. #endif  
  39.   
  40. #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) && (OS_TASK_DEL_EN > 0)  
  41.         ptcb->OSTCBFlagNode      = ( OS_FLAG_NODE * )0;      /* Task is not pending on an event flag     */  
  42. #endif  
  43.   
  44. #if ( OS_MBOX_EN || ( OS_Q_EN && ( OS_MAX_QS >=2 ) ))  
  45.         ptcb->OSTCBMsg           = ( void * )0;          /* No message received              */  
  46. #endif  
  47.   
  48. #if OS_VERSION > 204  
  49.         OSTaskCreateHooK(ptcb);                               
  50. #endif  
  51.           
  52.         OSTaskCreateHook(ptcb);                     /* Call User defined hook           */  
  53.           
  54.         OS_ENTER_CRITICAL();  
  55.         OSTCBPrioTbl[prio]           = ptcb;  
  56.         ptcb->OSTCBNext               = OSTCBList;  
  57.         ptcb->OSTCBPrev               = ( OS_TCB * ) 0;  
  58.         if( OSTCBList != ( OS_TCB * ) 0 ){  
  59.             OSTCBList->OSTCBPrev = ptcb;  
  60.         }  
  61.         OSTCBList                = ptcb;  
  62.         OSRdyGrp                |= ptcb->OSTCBBitY;  /* Make task ready to run           */  
  63.         OSRdyTbl[ptcb->OSTCBY]       <span style="white-space:pre">  </span>|= ptcb->OSTCBBitX;  
  64.         OS_EXIT_CRITICAL();  
  65.         return ( OS_NO_ERR );  
  66.     }  
  67.     OS_EXIT_CRITICAL();  
  68.     return ( OS_NO_MORE_TCB );  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值