μC/OS-II的内核结构
z 在文件OS_CFG.H中,OS_TASK_STAT_EN是设为1的。
z 在文件OS_CFG.H中,OS_LOWEST_PRIO是设为63的。
z 在文件OS_CFG.H中,最多任务数OS_MAX_TASKS是设成大于2的。
以上两个任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。换句话说,OSTCBList总是指向最后建立的那个任务。链的终点指向空字符NULL(也就是零)。
因为这两个任务都处在就绪态,在就绪任务表OSRdyTbl[]中的相应位是设为1的。还有,因为这两个任务的相应位是在OSRdyTbl[]的同一行上,即属同一组,故OSRdyGrp中只有1位是设为1的。
μC/OS-Ⅱ还初始化了4个空数据结构缓冲区,如图F3.8所示。每个缓冲区都是单向链
表,允许μC/OS-Ⅱ从缓冲区中迅速得到或释放一个缓冲区中的元素。注意,空任务控制块
在空缓冲区中的数目取决于最多任务数OS_MAX_TASKS,这个最多任务数是在OS_CFG.H文件
中定义的。μC/OS-Ⅱ自动安排总的系统任务数OS_N_SYS_TASKS(见文件μC/OS-Ⅱ.H)。控
制块OS_TCB的数目也就自动确定了。当然,包括足够的任务控制块分配给统计任务和空闲
任务。指向空事件表OSEventFreeList和空队列表OSFreeList的指针将在第6章,任务间
通讯与同步中讨论。指向空存储区的指针表OSMemFreeList将在第7章存储管理中讨论。
3.12 μC/OS-Ⅱ的启动
多任务的启动是用户通过调用 OSStart()实现的。然而,启动μC/OS-Ⅱ之前,用户至少
要建立一个应用任务,如程序清单L3.24所示。
程序清单L3.24初始化和启动μC/OS-Ⅱ
voidmain(void)
{
OSInit();/* 初始化uC/OS-II*/
.
.
通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;
.
.
OSStart();/* 开始多任务调度!OSStart()永远不会返回 */
}

图3.7调用OSInit()之后的数据结构

图3.8空缓冲区
OSStart()的代码如程序清单L3.25所示。当调用OSStart()时,OSStart()从任务就绪表中找出那个用户建立的优先级最高任务的任务控制块[L3.25(1)]。然后,OSStart()调用高优先级就绪任务启动函数 OSStartHighRdy()[L3,25(2)],(见汇编语言文件 OS_CPU_A.ASM),这个文件与选择的微处理器有关。实质上,函数OSStartHighRdy()是将任务栈中保存的值弹回到 CPU 寄存器中,然后执行一条中断返回指令,中断返回指令强制执行该任务代码。见9.04.01节,高优先级就绪任务启动函数 OSStartHighRdy()。那一节详细介绍对于 80x86微处理器是怎么做的。注意,OSStartHighRdy()将永远不返回到 OSStart()。
程序清单 L3.25 启动多任务.
voidOSStart(void)
{
INT8Uy;
INT8Ux;
if(OSRunning==FALSE){
y=OSUnMapTbl[OSRdyGrp];
x=OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy=(INT8U)((y3)+x);
OSPrioCur=OSPrioHighRdy;
OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];(1)
OSTCBCur=OSTCBHighRdy;
OSStartHighRdy();(2)
}
}
多任务启动以后变量与数据结构中的内容如图 F3.9 所示。这里笔者假设用户建立的任务优先级为 6,注意,OSTaskCtr指出已经建立了 3 个任务。OSRunning已设为“真” ,指出多任务已经开始, OSPrioCur和 OSPrioHighRdy存放的是用户应用任务的优先级, OSTCBCur和 OSTCBHighRdy二者都指向用户任务的任务控制块。
3.13 获取当前μC/OS-Ⅱ的版本号
应用程序调用OSVersion()[程序清单L3.26]可以得到当前μC/OS-Ⅱ的版本号。
OSVersion()函数返回版本号值乘以100。换言之,200表示版本号2.00。
程序清单L3.26得到μC/OS-Ⅱ当前版本号
INT16UOSVersion(void)
{
return(OS_VERSION);
}
为找到μC/OS-Ⅱ的最新版本以及如何做版本升级,用户可以与出版商联系,或者查看
μC/OS-Ⅱ得正式网站WWW.uCOS-II.COM

图3.9调用OSStart()以后的变量与数据结构
3.14 OSEvent()函数
读者或许注意到有4个OS_CORE.C中的函数没有在本章中提到。这4个函数是
OSEventWaitListInit(),OSEventTaskRdy(),OSEventTaskWait(),OSEventTO()。这几个
函数是放在文件OS_CORE.C中的,而对如何使用这个函数的解释见第6章,任务间的通讯与
同步。
评论