新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > μC/OS-II的内核结构

μC/OS-II的内核结构

作者: 时间:2016-10-08 来源:网络 收藏

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

同步。


上一页 1 2 3 4 5 6 7 8 9 下一页

关键词:

评论


相关推荐

技术专区

关闭