嵌入式实时操作系统uC/os-II(八)-任务的初始化和启动
- uC/OS-II的初始化
函数OSInit()将对uC/OS-II的所有全局变量和数据结构(就绪链表、事件链表)进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永久的就绪态。
图2-17 uC/OS-II 初始化后的数据结构
由上图可知,初始化函数OSInit()对数据结构进行初始化时,主要是创建包括空任务控制块链表在内的5个空数据缓冲区。同时,为了可以快速地查询任务控制块链表中的各个元素,初始化函数OSInit()还创建了一个数组OSTCBPrioTbl[]。在这个数组中,按任务的优先级别顺序把任务控制块的指针存放在对应的元素中。
初始化之后各全局变量的情况见表2-3.
表2-3 初始化之后全局变量的情况
变 量 |
值 |
变量说明 |
OSPrioCur |
0 |
类型为INT8U,正在运行的任务的优先级 |
OSPrioHighRdy |
0 |
类型为INT8U,具有最高优先级别的就绪任务的优先级 |
OSTCBCur |
NULL |
类型为OS_TCB *,指向正在运行任务控制块的指针 |
OSTCBHighRdy |
NULL |
类型为OS_TCB *,指向最高级优先级就绪任务控制块的指针 |
OSTime |
0L |
类型为INT32U,表示系统当前时间 |
OSIntNesting |
0 |
类型为INT8U,存放中断嵌套的层数(0-255) |
OSLockNesting |
0 |
类型为INT8U,调用OSSchededLock的嵌套层数 |
OSCtxSwCtr |
0 |
类型为INT32U,上下文切换次数 |
OSTaskCtr |
2 |
类型为INT8U,已经建立的任务数 |
OSRunning |
FALSE |
类型为BOOLEAN,内核是否正在运行的标志 |
OSCPUUsage |
0 |
类型为INT8S,存放CPU利用率的变量 |
OSIdleCtrMax |
0L |
类型为INT32U,表示每秒空闲任务计数的最大值 |
OSIdleCtrRun |
0L |
类型为INT2U,表示空闲任务计数器每秒的计数值 |
OSIdleCtr |
0L |
类型为INT32U,空闲任务计数器 |
OSStatRdy |
FALSE |
类型为BOOLEAN,统计任务是否就绪的标志 |
OSIntExitY |
0 |
类型为INT8U,用于函数OSInitExit() |
- uC/OS-II的启动
uC/OS-II 进行的管理是从启动函数OSStat()开始的。其源码如下:
void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) {
y = OSUnMapTal[OSRdyGrp]; //获得优先级别的D5D4D3 位
x = OSUnMapTal[OSRdyTbl[y]]; //获得优先级别的D2D1D0 位
OSPrioHighRdy = (y<<3)+x; //获得就绪任务的优先级别
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy(); /* Execute target specific code to start task */
}
}
调用函数OSStart()之后,uC/OS-II立即进入多任务管理阶段,这时的数据结构如图2-18所示。而各个变量的变化见表2-4.
图2-18 调用函数OSStart()后的数据结构
OSStartHighRdy()在多任务系统启动函数OSStart()中调用。完成的功能是:设置系统运行标志位OSRunning=TRUE,将就绪表中最高优先级别任务的栈指针Load到SP中,并强制中断返回。
表 2-4 初始化之后各个全局变量的值
变 量 |
值 |
变量说明 |
OSPrioCur |
5 |
类型为INT8U,正在运行的任务的优先级 |
OSPrioHighRdy |
5 |
类型为INT8U,具有最高优先级别的就绪任务的优先级 |
OSTCBCur |
|
类型为OS_TCB *,指向正在运行任务控制块的指针 |
OSTCBHighRdy |
|
类型为OS_TCB *,指向最高级优先级就绪任务控制块的指针 |
OSTime |
0L |
类型为INT32U,表示系统当前时间 |
OSIntNesting |
0 |
类型为INT8U,存放中断嵌套的层数(0-255) |
OSLockNesting |
0 |
类型为INT8U,调用OSSchededLock的嵌套层数 |
OSCtxSwCtr |
0 |
类型为INT32U,上下文切换次数 |
OSTaskCtr |
3 |
类型为INT8U,已经建立的任务数 |
OSRunning |
TRUE |
类型为BOOLEAN,内核是否正在运行的标志 |
OSCPUUsage |
0 |
类型为INT8S,存放CPU利用率的变量 |
OSIdleCtrMax |
0L |
类型为INT32U,表示每秒空闲任务计数的最大值 |
OSIdleCtrRun |
0L |
类型为INT2U,表示空闲任务计数器每秒的计数值 |
OSIdleCtr |
0L |
类型为INT32U,空闲任务计数器 |
OSStatRdy |
FALSE |
类型为BOOLEAN,统计任务是否就绪的标志 |
OSIntExitY |
0 |
类型为INT8U,用于函数OSInitExit() |