嵌入式实时操作系统uC/os-II(八)-任务的初始化和启动

  1. uC/OS-II的初始化

函数OSInit()将对uC/OS-II的所有全局变量和数据结构(就绪链表、事件链表)进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永久的就绪态。

                                        嵌入式实时操作系统uC/os-II(八)-任务的初始化和启动

                                                                           图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()

  1. 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.

                                                      嵌入式实时操作系统uC/os-II(八)-任务的初始化和启动

                                                                                           图2-18 调用函数OSStart()后的数据结构

OSStartHighRdy()在多任务系统启动函数OSStart()中调用。完成的功能是:设置系统运行标志位OSRunning=TRUE,将就绪表中最高优先级别任务的栈指针LoadSP中,并强制中断返回。

                                                                                           表 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()