一. 任务的基本概念
任务控制块:关联了任务代码的程序控制块,它记录了任务的各个属性;
任务堆栈:用来保存任务的工作环境。
任务程序代码:就是任务的执行部分。
2. 任务的状态
睡眠状态:任务在没有配备任务控制块或被剥夺了作务控制块时的状态。
就绪状态:配备了任务控制块并在任务就绪表中进行了就绪登记。
运行状态:处于就绪状态的任务如果经调试器判断获得了CPU的使用权。
等待状态:正在运行的任务,需要等待一段时间,会把CPU让出来,从而进入等待状态。
中断服务状态:正在运行的任务响应中断申请就会中止运行而去执行中断服务程序,这时的状态叫做中断服务状态。
3. 任务的优先级
最多64个任务,也就是最多有64个优先级。0~63
在配置文件OS_CFG.H中定义了一个用来表示最低优先级别的常数OS_LOWEST_PRIO,所以系统可用的优先级别为0~OS_LOWEST_PRIO。
但是一般OS_LOWEST_PRIO会自动赋给空闲任务,OS_LOWEST_PRIO - 1会自动赋给统计任务。
二. 任务的堆栈
注意处理器所支持的堆栈增长的方向:
//向下的堆栈 OSTaskCreate(Task1, (void *) 0, &Task1_Stk[TASK_STK_SIZE - 1], TASK1_PRIO); //向上的堆栈 OSTaskCreate(Task1, (void *) 0, &Task1_Stk[0], TASK1_PRIO);
三. 任务控制块及其链表
typedef struct os_tcb { OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */ #if OS_TASK_CREATE_EXT_EN > 0 void *OSTCBExtPtr; /* Pointer to user definable data for TCB extension */ OS_STK *OSTCBStkBottom; /* Pointer to bottom of stack */ INT32U OSTCBStkSize; /* Size of task stack (in number of stack elements) */ INT16U OSTCBOpt; /* Task options as passed by OSTaskCreateExt() */ 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_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_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_VERSION >= 251) && (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 INT16U OSTCBDly; /* Nbr ticks to delay task or, timeout waiting for event */ INT8U OSTCBStat; /* Task status */ INT8U OSTCBPrio; /* Task priority (0 == highest, 63 == lowest) */ INT8U OSTCBX; /* Bit position in group corresponding to task priority (0..7) */ INT8U OSTCBY; /* Index into ready table corresponding to task priority */ INT8U OSTCBBitX; /* Bit mask to access bit position in ready table */ INT8U OSTCBBitY; /* Bit mask to access bit position in ready group */ #if OS_TASK_DEL_EN > 0 BOOLEAN OSTCBDelReq; /* Indicates whether a task needs to delete itself */ #endif } OS_TCB;ucos需要两个链表:
一条空任务块链表,其中所有任务控制块还未分配给任务。由OSInit()创建。
一个任务块链表,其中所有任务控制块已分配给任务。由OSTaskCreate()创建。
创建时,系统会将空任务控制块链表头指针OSTCBFreeList指向的任务控制块分配给该任务。四. 任务就绪表及任务调度
可以看出一个元素可以表达8个任务的就绪状态。
还有一个变量表示哪个组个元素就绪了:
优先级也就绪表的位置关系:
任务切换的工作分成两步:第一步是获得待运行任务的TCB指针;第二步是进行断点数据的切换。
任务切换的工作是靠OSCtxSw()来完成的。
五. 任务的创建
六. 任务的挂起和恢复