6 uCOS-II操作系统
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6
任务(task)
一个任务通常是一个无限的循环:
void mytask(void *pdata) {
do init while (1) {
do something; waiting; do something;
}
}
2019年7月4日1时36分
嵌入式系统概论
7
任务(task)
μC/OS-Ⅱ可以管理多达64个任务。
OSRdyTbl[prio>>3] |=OSMapTbl[prio & 0x07];
假设优先级为12——1100b
OSRdyGrp
|=0x02;
OSRdyTbl[1] |=0x10;
2019年7月4日1时36分
嵌入式系统概论
29
使任务脱离就绪态
将任务就绪表OSRdyTbl[prio>>3]相应元素 的相应位清零,而且当OSRdyTbl[prio>>3] 中的所有位都为零时,即全组任务中没有 一个进入就绪态时,OSRdyGrp的相应位才 为零。
2019年7月4日1时36分
嵌入式系统概论
8
中断处理
用户中断服务子程序框架:
1、保存全部CPU寄存器; 2、调用OSIntEnter或OSIntNesting直接加1; 3、执行用户代码做中断服务; 4、调用OSIntExit(); 5、恢复所有CPU寄存器; 6、执行中断返回指令;
2019年7月4日1时36分
全世界有数百种产品在 应用: 医疗器械 移动电话 路由器 工业控制 GPS 导航系统 智能仪器 更多
2019年7月4日1时36分
嵌入式系统概论
5
临界段(Critical Sections)
目的:为了实现资源共享。
实现方法:进入临界段时关中断,退出临界段时 开中断。这使得μC/OS-Ⅱ能够在临界段代码时避 免被其它任务或中断服务所中断。
INT8U
OSTCBBitX; /*用于加速进入就绪态的过程*/
INT8U
OSTCBBitY; /*用于加速进入就绪态的过程*/
2019年7月4日1时36分
嵌入式系统概论
22
任务就绪表(Ready List)
每个任务的就绪态标志都放入就绪表中的, 就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。
优先级为0-63 优先级号越低,任务的优先级越高。 每个任务的优先级不能相同。
保留优先级:
高优先级:0、1、2、3 低优先级:OS_LOWEST_PRIO-3、
OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及 OS_LOWEST_PRI0
用户可以有多达56个应用任务。
在OSRdyGrp中,任务按优先级分组,8个任务 为一组。OSRdyGrp中的每一位表示8组任务中 每一组中是否有进入就绪态的任务。任务进 入就绪态时,就绪表OSRdyTbl[]中的相应元 素的相应位也置位。
2019年7月4日1时36分
嵌入式系统概论
23
任务就绪表
2019年7月4日1时36分
嵌入式系统概论
嵌入式系统概论
20
任务控制块(TCB)
任务控制块 OS_TCB是一个数据结构,保存 该任务的相关参数,包括任务堆栈指针,状 态,优先级,任务表位置,任务链表指针等。
一旦任务建立了,任务控制块OS_TCBs将被 赋值。
所有的任务控制块分为两条链表,空闲链表 和使用链表。
2019年7月4日1时36分
OSTCBCur
= OSTCBHighRdy;
OSStartHighRdy();
} 2019年7月4日1时36分
嵌入式系统概论
19
删除任务
任务状态
等待 或挂
起
收挂 到起 消时 息间
到
等 待挂 消起 息
创建任务
任务调度
中断
休眠
就绪
删除任务
运行 任务被占先
中断结束
中断 服务
删除任务
2019年7月4日1时36分
if (OSPrioHighRdy != OSPrioCur) {
OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OSIntCtxSw(); }
}
OS_EXIT_CRITICAL();
2019年7月4日1时36分
嵌入式系统概论
11
中断与时钟节拍
2019年7月4日1时36分
嵌入式系统概论
3
uC/OS-II的特点
1、uC/OS-II内核具有可抢占的实时多任 务调度功能
2、提供了许多系统服务,如信号量、 消息队列、邮箱、内存管理、时间函数 等
3、这些功能可以根据不同的需求进行 裁减。
2019年7月4日1时36分
嵌入式系统概论
4
µC/OS-II的各种商业应用
2019年7月4日1时36分
嵌入式系统概论
14
μC/OS-Ⅱ初始化
在调用μC/OS-Ⅱ的任何其它服务之前,μC/OSⅡ要求用户首先调用系统初始化函数OSInit()。
OSInit()建立空闲任务idle task,这个任务总是处 于就绪态的。空闲任务OSTaskIdle()的优先级 总是设成最低,即OS_LOWEST_PRIO。
当发生中断时,首先应保护现场,将CPU寄存 器入栈,再处理中断函数,然后恢复现场,将 CPU寄存器出栈,最后执行中断返回。
uC/OS中提供了OSIntEnter()和OSIntExit()告 诉内核进入了中断状态。
时钟节拍是一种特殊的中断,操作系统的心脏。 对任务列表进行扫描,判断是否有延时任务应 该处于准备就绪状态,最后进行上下文切换。
C/OS任务调度所花的时间为常数,与应用程 序中建立的任务数无关。
2019年7月4日1时36分
嵌入式系统概论
26
任务调度(Task Scheduling)
μ C/OS-Ⅱ总是运行进入就绪态任务中优先级 最高的那一个。确定哪个任务优先级最高, 下面该哪个任务运行了的工作是由调度器 (Scheduler)完成的。
2019年7月4日1时36分
嵌入式系统概论
12
时钟节拍
μC/OS需要用户提供周期性信号源,用于实现时 间延时和确认超时。节拍率应在说10到100Hz。 时钟节拍率越高,系统的额外负荷就越重。
时钟节拍的实际频率取决于用户应用程序的精度。 时钟节拍源可以是专门的硬件定时器,也可以是 来自50/60Hz交流电源的信号。
y
= OSUnMapTbl[OSRdyGrp];
x
=
OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
通过OSRdyTbl[3]的值来确定低3位,假设 OSRdyTbl[3]=0x3a,最高优先级的任务为25
2019年7月4日1时36分
嵌入式系统概论
28
使任务进入就绪态
如果prio是任务是优先级,也是任务的识别号, 则将任务放入就绪表,即使任务进入就绪态的方
法是:
OSRdyGrp
|=OSMapTbl[prio>>3];
OSInit(); /* 初始化uC/OS-II*/
…… 调用OSTaskCreate()或OSTaskCreateExt();
…… OSStart(); /*开始多任务调度!永不返回 */
2019年7月4日1时36分
嵌入式系统概论
18
OSStart
if (OSRunning == FALSE) {
6.7 uCOS-II操作系统移植
2019年7月4日1时36分
嵌入式系统概论
2
6.1 uC/OS-II简介
1、uC/OS-II是一个简单、高效的嵌入式 实时操作系统内核
2、支持 x86、ARM、PowerPC、MIPS 等众多体系结构
3、可从网站上获得全 部源码及其在各种体系结构平台上的移 植范例。
任务级的调度是由函数OSSched()完成的。中 断级的调度是由另一个函数OSIntExt()完成 的,这个函数将在以后描述。
2019年7月4日1时36分
嵌入式系统概论
27
根据就绪表确定最高优先级
通过OSRdyGrp值确定高3位,假设OSRdyGrp= 0x08,对应OSRdyTbl[3],高优先级为2;
用户必须在多任务系统启动以后再开启时钟节拍 器,也就是在调用OSStart()之后。
2019年7月4日1时36分
嵌入式系统概论
13
OSTickISR
void OSTickISR(void) {
保存处理器寄存器的值; 调用OSIntEnter()或是将OSIntNesting加1; 调用OSTimeTick(); 调用OSIntExit(); 恢复处理器寄存器的值; 执行中断返回指令; }
24
任务创建
想让µC/OS-Ⅱ管理用户的任务,用户 必须要先建立任务。
用户可以通过传递任务地址和其它参 数到以下两个函数之一来建立任务: OSTaskCreate() OSTaskCreateExt()。
任务不能由中断服务程序(ISR)来建立。
2019年7月4日1时36分
嵌入式系统概论
第6章uC/OS-II操作 系统
2019年7月4日1时36分
嵌入式系统概论
1
内容
6.1 uCOS-II操作系统简介
6.2 uCOS-II操作系统内核结构
6.3 uCOS-II操作系统任务管理
6.4 uCOS-II操作系统内存管理
6.5 uCOS-II操作系统时间管理
6.6 uCOS-II操作系统任务间的通讯
μC/OS-Ⅱ定义两个宏(macros)来开关中断。分别 是:
进入临界段:OS_ENTER_CRITICAL() 退出临界段:OS_EXIT_CRITICAL()。
这两个宏的定义取决于所用的微处理器,每种微 处理器都有自己的OS_CPU.H文件。
2019年7月4日1时36分
嵌入式系统概论
void
*OSTCBMsg; /*消息的指针*/
INT16U
OSTCBDly; /*任务延时*/
INT8U
OSTCBStat; /*任务的状态字*/
INT8U
OSTCBPrio; /*任务优先级*/
INT8U
OSTCBX;
/*用于加速进入就绪态的过程*/
INT8U
OSTCBY;
/*用于加速进入就绪态的过程*/
if((OSRdyTbl[prio>>3]&= OSMapTbl[prio & 0x07])==0)
嵌入式系统概论
21
任务控制块结构的主要成员
OS_STK
*OSTCBStkPtr; /*当前任务栈顶的指针*/
struct os_tcb *OSTCBNext; /*任务控制块的双重链接指针*/
struct os_tcb *OSTCBPrev; /*任务控制块的双重链接指针*/
OS_EVENT
*OSTCBEventPtr; /*事件控制块的指针*/
25
任务调度(Task Scheduling)
C/OS是抢占式实时多任务内核,优先级最高 的任务一旦准备就绪,则拥有CPU的所有权开 始投入运行。
C/OS中不支持时间片轮转法,每个任务的优 先级要求不一样且是唯一的,所以任务调度的 工作就是:查找准备就绪的最高优先级的任务 并进行上下文切换。
if ((--OSIntNesting | OSLockNesting) == 0) {
OSIntExitY = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((OSIntExitY << 3) +
OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
μC/OS-Ⅱ还初始化了4个空数据结构缓冲区。
2019年7月4日1时36分
嵌入式系统概论
15
μC/OS-Ⅱ初始化后的一些数据结构内 容
2019年7月4日1时36分
嵌入式系统概论
16
μC/OS-Ⅱ初始化后的缓冲区
2019年7月4日1时36分
嵌入式系统概论
17
μC/OS-Ⅱ的启动
多任务的启动是用户通过调用OSStart()实 现的。然而,启动μ C/OS-Ⅱ之前,用户至 少要建立一个应用任务。
嵌入式系统概论
9
OSIntEnter()
void OSIntEnter (void) {
OS_ENTER_CRITICAL(); OSIntNesting++; OS_EXIT_CRITICAL(); }
2019年7月4日1时36分
嵌入式系统概论
10
OSIntExit
OS_ENTER_CRITICAL();