创建任务时,会给它分配一个任务控制块OS_TCB。任务控制块是一种数据结构,当任务被抢占时,用它来维护任务的状态。当任务重新获得对CPU的控制时,任务控制块允许任务在它停止的地方继续执行。注意到,我对OS_TCB中的字段进行了组织,以允许在维护成员的逻辑分组的同时对数据结构进行打包。
OS_TCB在创建任务时初始化。下面是对OS_TCB数据结构中的每个字段的描述:
typedef struct os_tcb {
OS_STK *OSTCBStkPtr; //任务当前堆栈指针
#if OS_TASK_CREATE_EXT_EN
void *OSTCBExtPtr; //指向用户可定义任务控制块扩展的指针。这允
//许您或用户的用户扩展任务控制块,而不必更
//改的源代码。
OS_STK *OSTCBStkBottom; //指向任务堆栈底部的指针
INT32U OSTCBStkSize; //保存堆栈大小的变量,以元素的数量而不是字
//节的数量表示
INT16U OSTCBOpt; //一个保存“选项”的变量,可以传递给函数
//OSTaskCreateExt()
INT16U OSTCBId; // a variable that is used to hold an
//identifier for the task
#endif
struct os_tcb *OSTCBNext; //TCB节点的后继
struct os_tcb *OSTCBPrev; //TCB节点前驱
#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
OS_EVENT *OSTCBEventPtr; //指向事件控制块的指针
#endif
#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
void *OSTCBMsg; //指向发送给任务的消息的指针
#endif
INT16U OSTCBDly; //当任务需要被延迟一定数量的时钟滴答声或任务需
//要为事件超时而付出代价时使用。即可以容忍的时
//间
INT8U OSTCBStat; //指示任务状态,当OSTCBStat为0时,任务就可以
//运行了
INT8U OSTCBPrio; //任务的优先级
//OSTCBX、OSTCBY、OSTCBBitX和OSTCBBitY用于加速使任务准备运行的过程,或使任务
//等待事件(避免在运行时计算这些值)。这些字段的值在创建任务或更改任务的优先级时
//计算
INT8U OSTCBX;
INT8U OSTCBY;
INT8U OSTCBBitX;
INT8U OSTCBBitY;
#if OS_TASK_DEL_EN
BOOLEAN OSTCBDelReq; //指示任务是否请求删除当前任务
#endif
} OS_TCB;