任务状态
uC/OS-III的任务有5个状态,可以相互转换:
任务控制块
任务控制块OS_TCB是一个结构体,这个结构体的成员变量很多,用来保存任务的信息,我们使用OSTaskCreat()函数创建任务的时候就会给任务分配一个任务控制块。
struct os_tcb{
CPU_STK *stkPtr;
void *ExtPtr;
...
}
任务堆栈
- 定义任务堆栈
#define TASK_STK_SIZE 64 //任务堆栈大小
CPU TASK_STK[TASK_STK_SIZE]; //定义任务堆栈
- 任务堆栈使用
我们使用OSTaskCreat()函数创建任务时就可以把创建的任务堆栈传递给任务。
OSTaskCreat(
...
(CPU_STK*) &TASK_STK[0], //任务堆栈基地址
(CPU_STK_SIZE) TASK_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE) TASK_STK_SIZE, //任务堆栈大小
...)
创建任务的时候会初始化任务的堆栈,完成初始化堆栈的函数是OSTaskStInit(),用户不能调用这个函数,这个函数是被OSTask()在创建任务的时候调用的。
任务就绪表
uC/OS-III会将就绪的任务放在任务就绪表中,任务就绪表包括优先级位映射表OSPrioTbl[]和就绪任务列表OSRadyList[]
- 优先级位映射表
优先级位映射表用于保存目前有哪些优先级中的任务就绪,当某一个任务就绪以后就会将该任务对应的优先级位置1,表明该优先级下有任务处于就绪状态。
关于优先级的操作有三个函数
- OS_PrioGetHighest() 获取就绪中最高优先级任务
- OS_PrioInsert() 将某个任务在任务就绪表中相应位置1
- OS_PrioRemove() 将某个任务在任务就绪表中相应位清0
- 就绪任务列表
任务就绪列表用来记录每一个优先级下所有就绪的任务,OSRdyList[]在os.h中定义,数组元素的类型为OS_RDY_LIST,为一个结构体,定义如下:
struct os_rdy_list{
OS_TCB *HeaderPtr; //链表头指针
OS_TCB *TailPtr; //链表尾指针
OS_OBJ_QTY NbrEntries; //此优先级下的任务数量
};
uC/OS-III支持时间片轮转调度,一个优先级下有多个任务,任务就绪列表就是用来管理同一优先级下的多个任务的。比如OSRdyList[0] 用来管理优先级0下的所有任务。
任务就绪列表的操作函数有:
任务调度
任务调度就是让就绪表中优先级最高的任务获得CPU的使用权,高优先级的任务可以抢占低优先级的任务。任务调度器有两种:
-
任务级调度器OSSched()
-
中断级调度器OSIntExit()
除了任务级调度器和中断级调度器,还有时间片轮转调度器。
uC/OS-III中允许一个任务运行一段时间后让出CPU的使用权,让同一优先级的下一个任务运行。