1、任务控制块
typedef struct os_tcb{
OS_STK *OSTCBStkPtr;//指向任务堆栈栈顶的指针
#if OS_TASK_CREATE_EXT_EN
void *OSTCBExtPtr;//指向任务控制块扩展的指针
OS_STK *OSTCBStkBottom;//指向任务堆栈栈底的指针
INT32U OSTCBStkSize;//任务堆栈的长度
INT16U OSTCBOpt;//创建任务时的选择项
INT16U OSTCBId;//目前该区域未被使用
#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;//任务的当前状态标志
INT8U OSTCBPrio;//任务的优先级
INT8U OSTCBX;//用于快速访问就绪表的数据
INT8U OSTCBY;//用于快速访问就绪表的数据
INT8U OSTCBBitX;//用于快速访问就绪表的数据
INT8U OSTCBBitY;//用于快速访问就绪表的数据
#if OS_TASK_DEL_EN
BOOLEANOSTCBDelReq;//请求删除任务时用到的标志
#endif
}OS_TCB;
OSTCBStat 说明
OSTCBStat用来存放任务的当前状态:
OS_STAT_RDY | 任务处于就绪态
OS_STAT_SEM | 任务处于等待信号量
OS_STAT_MBOX |任务处于等待消息邮箱
OS_STAT_Q | 任务处于等待消息队列
OS_STAT_SUSPEND | 任务处于被挂起
OS_STAT_MUTEX 任务处于互斥型信号量状态
OS_STK 说明
OS_STK在OS_CPU.H文件中定义:
typedef unsigned int OS_STK;
OS_STK就是无符号整形。OS_STK是任务堆栈的每个数据项的类型,对于不同的硬件系统是不同的,在做移植的时候就需要修改。
OSTCBPrio 说明
每个任务有唯一的优先级,因此uC/OS-II 以优先级作为事件的标志,作为任务管理的主键。任务的优先级可以是0-63,但优先级62和63被统计任务和空闲任务占用,用户任务的优先级可以选择0-61,数字越低,优先级越高。
2、任务控制块实体
任务控制块的实体声明如下:
OS_TCB OSTCBTbl[OS_MAX_TASKS+OS_N_SYS_TASKS]
该代码在ucos_ii.H 中,OS_MAX_TASKS为最多的用户任务数,OS_N_SYS_TASKS为系统任务数,一般情况下为2。因此,在内存中分配了OS_MAX_TASKS+OS_N_SYS_TASKS个任务控制块,这些任务控制块占用了(OS_MAX_TASKS+OS_N_SYS_TASKS)*sizeof(OS_TCB)个内存空间。
宏OS_MAX_TASKS在OS_CFG.H中定义,OS_CFG.H是整个操作系统的配置文件。宏OS_MAX_TASKS在ucos_ii.h中定义,它的值与另一个宏OS_TASK_STAT_EN有关,代码如下:
if OS_TASK_STAT_EN > 0
#define OS_N_SYS_TASKS 2
#else
#define OS_N_SYS_TASKS 1
#endif
OS_TASK_STAT_EN>0即表示系统具有统计任务的时候,OS_N_SYS_TASKS 值则为2,否则为1。OS_TASK_STAT_EN在OS_CFG.H中定义,意义为系统是否具有统计任务,OS_TASK_STAT_EN默认值是1,表示有统计任务,如果确实不需要统计任务,可以把OS_TASK_STAT_EN值设置为0,这是系统任务只有空闲任务,因此OS_N_SYS_TASKS的值就是1,反之,系统如果有系统任务,再加上空闲任务,那么系统任务的数量就是2。
来源:CSDN
原文:https://blog.csdn.net/wangran1996/article/details/68069695
版权声明:本文为博主原创文章,转载请附上博文链接!