μC/OS-II的内核结构
eeList的指针将在第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章,任务间的通讯与
同步。
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
