μC/OS-Ⅱ初始化
在调用μC/OS-Ⅱ的任何其它服务之前,μC/OS-Ⅱ要求用户首先调用系统初始化函数OSIint()。OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构(。
OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为1,则OSInit()还得建立统计任务OSTaskStat()并且让其进入就绪态。OSTaskStat的优先级总是设为OS_LOWEST_PRIO-1。
图表示调用OSInit()之后,一些μC/OS-Ⅱ变量和数据结构之间的关系。
以上两个任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。换句话说,OSTCBList总是指向最后建立的那个任务。链的终点指向空字符NULL(也就是零)。
因为这两个任务都处在就绪态,在就绪任务表OSRdyTbl[]中的相应位是设为1的。还有,因为这两个任务的相应位是在OSRdyTbl[]的同一行上,即属同一组,故OSRdyGrp中只有1位是设为1的。
μC/OS-Ⅱ还初始化了4个空数据结构缓冲区,如图所示。每个缓冲区都是单向链表,允许μC/OS-Ⅱ从缓冲区中迅速得到或释放一个缓冲区中的元素。注意,空任务控制块在空缓冲区中的数目取决于最多任务数OS_MAX_TASKS,这个最多任务数是在OS_CFG.H文件中定义的。μC/OS-Ⅱ自动安排总的系统任务数OS_N_SYS_TASKS(见文件μC/OS-Ⅱ.H)。
μC/OS-Ⅱ的启动
多任务的启动是用户通过调用OSStart()实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用任务,如程序清单L3.24所示。
void main (void) |
{ |
OSInit(); /* 初始化uC/OS-II */ |
. |
. |
通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务; |
. |
. |
OSStart(); /* 开始多任务调度!OSStart()永远不会返回 */ |
} |
OSStart()的代码如下。当调用OSStart()时,OSStart()从任务就绪表中找出那个用户建立的优先级最高任务的任务控制块(1)。然后,OSStart()调用高优先级就绪任务启动函数OSStartHighRdy()(2),这个文件与选择的微处理器有关。实质上,函数OSStartHighRdy()是将任务栈中保存的值弹回到CPU寄存器中,然后执行一条中断返回指令,中断返回指令强制执行该任务代码。注意,OSStartHighRdy()将永远不返回到OSStart()。
|
void OSStart (void) |
{ |
INT8U y; |
INT8U x; |
|
if (OSRunning == FALSE) { |
y = OSUnMapTbl[OSRdyGrp]; |
x = OSUnMapTbl[OSRdyTbl[y]]; |
OSPrioHighRdy = (INT8U)((y << 3) + x); |
OSPrioCur = OSPrioHighRdy; |
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; (1) |
OSTCBCur = OSTCBHighRdy; |
OSStartHighRdy(); (2) |
} |
} |
UCOS_II基础入门:
扫一扫关注微信公众号,获取更多实时的嵌入式资讯,嵌入式学习指导方法,汽车电子最新资讯等。。