μC/OS-II最小资源分配单元是任务。
任务状态
μC/OS-II中任务有5种状态,分别为睡眠态,就绪态,运行态,就绪态,等待状态,中断服务态。睡眠态指任务还没有创建或者创建后被删除。就绪态是指任务准备运行,等待CPU使用权。运行态指获得CPU使用权,任务执行。等待状态是指正在运行的任务调用等待或延时函数时进入的状态。中断服务态是指运行态被打断,进入中断服务程序。
任务控制块
任务控制块是一个数据结构,用于保存任务的参数和状态。
typedef struct os_tcb {
//OS_STK定义为32位无符号数据,该行定义当前任务所分配的堆栈的栈顶指针
//(该栈顶指针是指任务切换后自动保存的r0-r15等一系列数据后的堆栈指针)
//对于堆栈,ucos可以对每一个任务分配任意大小的堆栈
OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */
#if OS_TASK_CREATE_EXT_EN > 0//如果使能了扩展任务控制块,则定义以下数据
//扩展任务块的指针,扩展任务快的引入,使得可以在不改变ucos源码的情况下,
//加入扩展功能,此外如果需要使用该功能,则需在OS_CFG.H(ucos配置文件)
//中将OS_TASK_CREATE_EXT_EN 置1,允许建立任务函数扩展
void *OSTCBExtPtr; /* Pointer to user definable data for TCB extension */
//指向任务堆栈的栈底(就是数据最后进入的地址),如果堆栈增长方式是递增的,那么他执向堆栈的最高地址
//反之指向最低地址,该参数在使用OSTaskStkChk函数时需要调用
OS_STK *OSTCBStkBottom; /* Pointer to bottom of stack */
//该参数是任务堆栈的大小,对于堆栈大小是指栈中所能容纳的指针数目,而不是字节数目,假设堆栈容量为1000,
//如果地址宽度为32位,那么堆栈包含4000个字节。但是其容量是1000
INT32U OSTCBStkSize; /* Size of task stack (in number of stack elements) */
//选择项,支持3种选择e:
//OS_TASK_OPT_STK_CHK,该参数用于告知TaskCreateExt函数在建立任务时对堆栈进行检查(不定义这个ucos不会进行检查)
//OS_TASK_OPT_STK_CLR,在任务建立 时将任务栈清零,至于在需要使用栈检验功能时才将栈清零
//OS_TASK_OPT_SAVE_FP,通知任务需要做浮点运算
INT16U OSTCBOpt; /* Task options as passed by OSTaskCreateExt() */
//用于存储任务的识别码,现在还没使用,感觉他会发展成为linux的pid
INT16U OSTCBId; /* Task ID (0..65535) */
#endif
//任务控制块双向链表所需变量,分别指向给任务的后一个任务控制块和前一个任务控制块
struct os_tcb *OSTCBNext; /* Pointer to next TCB in the TCB list */
struct os_tcb *OSTCBPrev; /* Pointer to previous TCB in the TCB list */
#if OS_EVENT_EN || (OS_FLAG_EN > 0)
//如果使能了事件,定义指向事件控制块的指针。
OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */
#endif
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
//如果定义了队列,消息邮箱,信号量系统资源,则使用该指针指向所要传递的消息
void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost() */
#endif
#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
#if OS_TASK_DEL_EN > 0
//指向事件标志节点的指针
OS_FLAG_NODE *OSTCBFlagNode; /* Pointer to event flag node */
#endif
//准备运行的事件标志任务
OS_FLAGS OSTCBFlagsRdy; /* Event flags that made task ready to run */
#endif
//任务延时时间,或者等待事件发生的超时时间,在时钟每发生一次中断的时候,时钟街拍函数OSTimeTick
//将通过任务控制块的链表访问该变量,并将其减1,刷新变量
INT16U OSTCBDl