微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > μC/OS-II的内核结构

μC/OS-II的内核结构

时间:10-08 来源:互联网 点击:

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章,任务间的通讯与

同步。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top