uc/os-ii介绍

来源:互联网 发布:长笛 知乎 编辑:程序博客网 时间:2024/04/27 14:29

us/os-ii 是一个基于优先级抢占式实时操作系统。

在实时系统中,把应用程序设计过程分割为多个任务,每个任务有自己的优先级(优先级是任务的的唯一标识),他们在操作系统的调度下协调运行。

ucos-ii需要硬件提供一个稳定的时钟源,周期性发生中断,才能正常工作,进行相应的任务调度。OSTimeTick让延时时间到的任务就绪,否则使任务延时数减1。OSIntExit找到最高优先级就绪的任务,使其恢复运行,通过OSIntCtxsw进行任务调度。

 

 (1)任务管理

1.1 任务管理数据结构

OS_TCB:任务控制块(TCB)记录着任务的各种信息:任务的堆栈指针,任务的延时时间,任务的状态,时间等待标志,和任务优先级等信息。

ucos-ii将任务控制块分为两个链表来管理,这就是空闲任务表(单向)和就绪任务链表(双向)。OSTCBFreeList指向空闲链表的表头,OSTCBList指向就绪链表的表头。创建任务时,就是将OSTCBFreeList指向的那个任务控制块分给新任务,并将它移到就绪链表中,OSTCBFreeList指向空闲链表的下一个任务块。系统创建的第一个任务就是空闲任务,这个任务一直处于就绪态,它的优先级最低,只有其他任务被阻塞的时候才能得到运行。

为了通过优先级方便的查找任务的控制块,ucosii有一个任务优先级指针表:OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO+1];

在任务的创建和切换时等过程中都会涉及到堆栈的操作。任务堆栈有两种,一种地址向下增长,一种地址向上增长。

uc/os-ii中的堆栈定义如下:OS_STK TaskStk[OS_MAX_TASKS][TASK_STK_SIZE];

内核在进行任务调度时,必须知道哪个任务在运行,哪个任务是就绪时最高优先级的任务。因此uc/os-ii开发者设计了一种高效的多任务调度方法:就绪组和就绪表。。

OSRdyGrp和 OSRdyTbl[OS_RDY_TBL_SIZE]

优先级prio的任务就绪,设置就绪表和就绪表

OSRdyGrp |=osMapTbl[prio>>3];

OSRdyTbl[prio>>3] |=OSMapTbl[prio&0x07];

获取就绪任务中的最高级优先级

y=OSUnMapTbl[OSRdyGrp]

OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);

OSInit 系统的初始化,初始化各种全局变量,任务控制块和任务就绪组列表以及初始化空闲事件列表。并创建空闲任务和统计任务。

 1.2 任务相关函数:

OSTaskCreate    OSTaskDel     OSTaskSuspend        OSTaskResume

1.3 特殊的任务: OS_Taskle 和 OS_TaskStat(计算CPU利用率)

 1.4OSStart  多任务启动。执行高优先级任务。

1.5 任务切换函数:OS_Sched---OS_TASK_SW