ucosii任务管理及调度
uCOS-II的任务切换机理及中断调度优化

uCOS-II的任务切换机理及中断调度优化uC/OS-II的任务切换机理及中断调度优化摘要:μC/OS-II是一种适用于嵌入式系统的抢占式实时多任务操作系统,开放源代码,便于学习和使用。
介绍μC/OS-II在任务级和中断级的任务切换原理,以及这一操作系统基于嵌入式系统的对于中断的处理;相对于内存资源较少的单片机,着重讨论一种优化的实用堆栈格式和切换形式,以提高资源的利用率;结合MSP430单片机,做具体的分析。
关键词:实时多任务操作系统μC/OS MSP430 中断堆栈引言在嵌入式操作系统领域,由Jean J. Labrosse开发的μC/OS,由于开放源代码和强大而稳定的功能,曾经一度在嵌入式系统领域引起强烈反响。
而其本人也早已成为了嵌入式系统会议(美国)的顾问委员会的成员。
不管是对于初学者,还是有经验的工程师,μC/OS开放源代码的方式使其不但知其然,还知其所以然。
通过对于系统内部结构的深入了解,能更加方便地进行开发和调试;并且在这种条件下,完全可以按照设计要求进行合理的裁减、扩充、配置和移植。
通常,购买RTOS 往往需要一大笔资金,使得一般的学习者望而却步;而μC/OS对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。
自1992第1版问世以来,已有成千上万的开发者把它成功地应用于各种系统,安全性和稳定性已经得到认证,现已经通过美国FAA认证。
1 μC/OS-II的几大组成部分μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。
核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。
能够维持系统基本工作的部分都在这里。
任务处理部分(OSTask.c) 任务处理部分中的内容都是与任务的操作密切相关的。
包括任务的建立、删除、挂起、恢复等等。
嵌入式操作系统_第5章 ucOS-II - 任务就绪表及任务就绪组

0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 2
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
或
y = OSUnMapTbl[OSRdyGrp]; prio = (INT8U)((y << 3)
+ OSUnMapTbl[OSRdyTbl[y]]);
优先级判定表OSUnMapTbl[256] (os_core.c)
举例: 如OSRdyGrp的值为
00101000B,即0X28,则 查得 OSUnMapTbl[OSRdyGrp] 的值是3,它相应于 OSRdyGrp中的第3位置1;
图5-6 在就绪表中查找最高优先级别任务的过程
从任务就绪表中获取优先级别最高的就绪任务可用如下 类似的代码:
y = OSUnMapTal[OSRdyGrp]; //D5、D4、D3位
x = OSUnMapTal[OSRdyTbl[y]]; //D2、D1、D0位
prio = (y<<3)+x;
//优先级别
};
优先级判定表OSUnMapTbl[256]
OSUnMapTbl[]这个数组的生成原则:先 把一个数用二进制表示,然后从低位往高 位数,返回第一次碰到1的位置。比如: OSUnMapTbl[0x111100(60)] = 2。可 以看到,如果要表示8位数的对应关系, 则数组的大小为2^8=256。这也是为什么 OSRdyTbl[],OSRdyGrp采用8位的原因。
μCOSⅡ中的任务调度

任务延时若干时钟节拍 任务的状态字 0,就绪 任务优先级 用于加速任务进入就绪态的过 或进入等待事件发生状态的过
与TCB相关的结构
两个关键: • 优先级数分解为高三位和低三位分别确定;
• 高优先级有着小的优先级号 ;
优先级和就绪任务表的位置关系
• 每个就绪的任务都放入就绪表中(ready list) 中,就绪表有两个变量:OSRdyGrp、OSRdyTbl[]
μ C/OSⅡ中的任务调度
Group01小组 柴永锋 李逢春 苗 冬
相关介绍
• C/OS是占先式实时多任务内核,优先级最高的任 务一旦准备就绪,则拥有CPU的所有权开始投入运 行。
• C/OS中不支持时间片轮转法,每个任务的优先级 要求不一样且是唯一的 • C/OS –II 2.51版本支持64个任务,每个任务一 个特定的优先级。优先级越高,数字越小。 • C/OS任务调度所花的时间为常数,与应用程序中 建立的任务数无关
Task scheduler
void OS_Sched (void) /*os_core.c中*/ { INT8U y; OS_ENTER_CRITICAL(); if ((OSLockNesting =0)&&(OSIntNesting= 0)) { y = OSUnMapTbl[OSRdyGrp]; OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy != OSPrioCur) { OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; OS_TASK_SW(); } } OS_EXIT_CRITICAL(); }
uCOS-II的任务切换机理及中断调度优化

摘要:μC/OS-II是一种适用于嵌入式系统的抢占式实时多任务操作系统,开放源代码,便于学习和使用。
介绍μC/OS-II在任务级和中断级的任务切换原理,以及这一操作系统基于嵌入式系统的对于中断的处理;相对于内存资源较少的单片机,着重讨论一种优化的实用堆栈格式和切换形式,以提高资源的利用率;结合MSP430单片机,做具体的分析。
关键词:实时多任务操作系统μC/OS MSP430 中断堆栈引言在嵌入式操作系统领域,由Jean J. Labrosse开发的μC/OS,由于开放源代码和强大而稳定的功能,曾经一度在嵌入式系统领域引起强烈反响。
而其本人也早已成为了嵌入式系统会议(美国)的顾问委员会的成员。
不管是对于初学者,还是有经验的工程师,μC/OS开放源代码的方式使其不但知其然,还知其所以然。
通过对于系统内部结构的深入了解,能更加方便地进行开发和调试;并且在这种条件下,完全可以按照设计要求进行合理的裁减、扩充、配置和移植。
通常,购买RTOS往往需要一大笔资金,使得一般的学习者望而却步;而μC/OS对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。
自1992 第1版问世以来,已有成千上万的开发者把它成功地应用于各种系统,安全性和稳定性已经得到认证,现已经通过美国FAA认证。
1 μC/OS-II的几大组成部分μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。
核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。
能够维持系统基本工作的部分都在这里。
任务处理部分(OSTask.c)任务处理部分中的内容都是与任务的操作密切相关的。
包括任务的建立、删除、挂起、恢复等等。
因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。
ucos II 内核学习之三:任务调度

ucos II 内核学习之一:任务调度学校的教学方式多是先让你学原理,再应用它。
Muc21则不喜欢这种方式,依然记得在学校枯燥无味地学一大堆理论,更郁闷的是不知道是应用在什么地方。
Mcu21喜欢先学会用它了,然后再去了解它的原理。
对ucos II也一样,当我用过之后,再去看它的内核,或许理解起来会更容易。
实现任务切换,需要调用函数OSSched()。
程序代码如下void OSSched (void){INT8U y;OS_ENTER_CRITICAL();if ((OSLockNesting | OSIntNesting) == 0) (1){y = OSUnMapTbl[OSRdyGrp]; (2)OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);if (OSPrioHighRdy != OSPrioCur) (3){OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; (4)OSCtxSwCtr++; (5)OS_TASK_SW(); (6)}}OS_EXIT_CRITICAL();}其基本实现原理大致是先找出优先级最高的任务,OSTCBHighRdy指向优先级最高任务的任务控制块,接着调用宏OS_TASK_SW(),宏OS_TASK_SW()完成实质性任务切换工作。
下面具体了解下代码的作用。
1. 首先判断是不是在在中断子函数中调用,任务调度有没有上锁(1)2. 如果不是在中断子函数中调用,并且任务调度没有上锁,找出就绪表中优先级最高的任务(2)3. 检验这个优先级最高的任务是不是当前正在运行的任务,以此来避免不必要的任务调度(3)。
4. 如果不是,OSTCBHighRdy指向优先级最高的那个任务控制块OS_TCB(4)5. OSCtxSwCtr加1,这个值是记录任务切换次数的。
uCOS-II 的任务

uC/OS-II 的任务:从任务的存储结构来看,uC/OS-II的任务由三个部分构成:1任务程序代码,任务的执行部分2任务堆栈,用来保存任务工作环境3任务控制块,用来保存任务属性每一个任务都作为一个节点,组成一个双向的任务链表。
用户任务:从程序代码上看,用户任务似乎就是一个C语言函数,但是这个函数不是一般的C语言函数,它是一个任务(线程)。
因此,它不是被主函数或其他函数调用的,主函数mian()只是负责创建和启动它们,而由操作系统负责来调度它们。
系统任务:uC/OS-II预定义了两个为应用程序服务的系统任务:4空闲任务(OSTaskIdle)5统计任务(OSTaskStat)其中空闲任务是每个应用程序必须使用的。
OSTaskIdle由系统自动创建,在系统初始化时,∙OSInit --> OS_InitTaskIdle --> OSTaskIdle如果用户应用程序要使用统计任务,则必须把定义在OS_CFG.H 中的OS_TASK_STAT_EN设置为1,并且必须在创建统计任务之前调用函数OSStatInit( )对统计任务进行初始化。
任务优先级:优先级数目通过OS_CFG.H中的OS_LOWEST_PRIO配置。
固定地,系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任务。
如果应用程序中还使用了统计任务,则系统会把OS_LOWEST_PRIO - 1自动赋给统计任务。
由于每个任务都具有唯一的优先级别,因此uC/OS-II通常也用任务的优先级别来作为这个任务的标识。
任务堆栈:堆栈的增长方向随系统所使用的处理器不同而不同,为提高应用程序的可移植性,可利用OS_CFG.H中的OS_STK_GROWTH作为选择开关。
把CPU启动任务时所需的初始数据事先存放在任务的堆栈中,当任务获得CPU使用权时,就可以把堆栈中的初始数据复制到CPU 的各寄存器中,使任务顺利地启动并运行。
任务堆栈的初始化工作是由系统通过在OSTaskCreate ( )中调用OSTaskStkInit ( )来完成的。
基于μCOS-II操作系统的任务调度机制

基于μC/OS-II操作系统的任务调度机制论文关键词:μC/OS-II;多任务;任务调度论文摘要:μC/OS-II操作系统之所以在10多年的时间里作为一个嵌入式实时的多任务操作系统得到了广泛的应用,原因之一是它的任务管理机制存在许多的优点。
多任务运行的最大难点就在于多任务的调度。
WANG Yu-rong,ZHU Jian-bin(Computer Science College Wuhan University of Science and Engineering,Wuhan 430073,China)Abstract:As a multi-task embedded real time operation system, μC/OS-II Operating Systems has been widely used in more ten years.One of the reason is that the Operating Systems has many advantages.The hardest point is the schedul of tasks when we run multi-task Operating Systems.Key words:μC/OS-II;Multi-task;task-scheduling1 引言嵌入式系统是一种应用范围非常广泛的系统。
可以这样理解,除了桌面计算机和服务器外所有计算设备都属于嵌入式系统。
在短短十多年的时间里,伴随着微电子技术、软件技术的发展,嵌入式系统被广泛的用于如生物医学仪器、智能汽车、通信设备、网络设备、仪器仪表、手持设备等诸多领域。
[1] 它是以应用为中心的,而嵌入式操作系统则是嵌入式系统应用中的核心。
嵌入式系统是计算机硬件和软件的结合体,或许还加上机械等其他部分,被设计来完成专门的功能。
在一些情况下,嵌入式系统是一个大的系统或产品的一部分,就象汽车上的防抱死装置,与通用计算机相对。
μC OS-II 实验一任务基本管理

void MyTask(void *pdata) { while(1) { printf("This is MyTask!\n"); Beep(1950, 20); n++; //通过空循环进行延时 通过空循环进行延时 if(n>=10) { printf("MyTask Suspended!\n"); n = 0; OSTaskSuspend(OS_PRIO_SELF); } } }
创建任务示例示例
void MyTask(void *pdata) { pdata = pdata; while(1) { printf("M"); Beep(1950, 20); n++; if(n>=CharPerLine) { printf("\n"); n = 0; } OSTimeDly(OS_TICKS_PER_SEC); } }
等待状态
OSTaskResume()
OSTaskSupend()
OS_TASK_SW() 就绪状态 任务CPU使用权被剥夺 使用权被剥夺 任务 运行状态
挂起任务函数原型 INT8U OSTaskSuspend (INT8U prio); ; 如果参数prio为常数 为常数OS_PRIO_SELF,则表示挂起 如果参数 为常数 , 当前任务自身。 当前任务自身。 恢复任务函数原型: 恢复任务函数原型: INT8U OSTaskResume (INT8U prio)
任务删除
所谓删除一个任务,就是把任务置于休眠状态,具 所谓删除一个任务,就是把任务置于休眠状态, 体的做法就是, 体的做法就是,把当初分配给该任务的任务控制块 从任务控制块链表中删除, 从任务控制块链表中删除,并归还给空任务控制块 链表, 链表,然后就绪任务表中把该任务的就绪状态位置 0. 删除一个任务,并不是说任务的代码被删除了, 删除一个任务,并不是说任务的代码被删除了,只 是任务的代码不能被µC/OS_II的内核管理和调用。 的内核管理和调用。 是任务的代码不能被 的内核管理和调用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
C/OS的性能特点(二)
占先式(Preemptive) 多任务
C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多 可以有256个任务
可确定性
全部 C/OS-II的函数调用与服务的执行时间具有可确定性。
任务栈
每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈空间,以便压低应 用程序对RAM的需求。
OSTaskCreateExt()
提问:C/OS-II中的任务是进程还是线程?
18
任务主函数
一个任务通常是一个无限循环(返回值类型void)
void MyTask(void *pdata)
{
while (1) {
Why?
do something;
waiting; do something;
}
}
2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器 中
网站()
8
C/OS的性能特点(一)
公开源代码 可移植性(Portable)
绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器 硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最 低限度,使得 C/OS-II便于移植到其他微处理器上。 C/OS-II可以在 绝大多数8位、16位、32位以至64位微处理器、微控制器 、数字信号处 理器(DSP)上运行。
系统保留了优先级为0、1、2、3、 OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2, OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0这8个任 务以被将来使用,用户可以有56个应用任务; 任务的优先级同样也是它的标识号ID。
21
空闲任务和统计任务
内核总是创建一个空闲任务OSTaskIdle(); 总是设置为最低优先级,OS_LOWEST_PRIOR; 当所有其他任务都未在执行时,空闲任务开始 执行; 应用程序不能删除该任务; 空闲任务的工作就是把32位计数器OSIdleCtr 加1,该计数器被统计任务所使用;
实时操作系统C/OS-II
1
C/OS-II概述
2
任务管理
3 4
中断和时间管理
任务之间的通信与同步
存储管理
5
1
通用操作系统和嵌入式(实时)操作系统
通用操作系统:Windows/NT/XP、Linux、UNIX等,用于PC机 、服务器, 嵌入式(实时)操作系统:用于嵌入式设备的操作系统,具有通 用操作系统的基本特点,又具有系统实时性、硬件的相关依赖性 、软件固态化以及应用的专用性等特点; 嵌入式(实时)操作系统通常包括与硬件相关的底层驱动软件、 系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器 Browser等; 嵌入式(实时)操作系统的重要指标:实时性(中断响应时间、 任务切换时间等)、尺寸(可裁剪性 )、可扩展性(内核、中间 件);
typedef double FP64;
15
C/OS-II的文件结构
16
1
C/OS-II概述
2
任务和任务管理
3 4
中断和时间管理
任务之间的通信与同步
存储管理
5
17
任务的实现
创建任务的系统服务
OSTaskCreate()
INT8U OSTaskCreate ( void (*task)(void *pd), //任务代码指针 void *pdata, //任务参数指针 OS_STK *ptos, //任务栈的栈顶指针 INT8U prio //任务的优先级 );
} OS_TCB;
24
栈指针 OSTCBStkPtr:指向当前任务栈顶的指针 ,每个任务可以有自己的栈,栈的容量可 以是任意的; OSTCBStkBottom:指向任务栈底的指针; OSTCBStkSize:栈的容量,用可容纳的指 针数目而不是字节数(Byte)来表示。
25
26
链表指针
一旦任务建立了,任务控制块OS_TCB将 被赋值。
23
任务控制块TCB
typedef struct os_tcb { 栈指针; INT16U 链表指针; OS_EVENT void INT8U INT8U 其他…… OSTCBId; *OSTCBEventPtr; *OSTCBMsg; OSTCBStat; OSTCBPrio; /*任务的ID*/ /*事件指针*/ /*消息指针*/ /*任务的状态*/ /*任务的优先级*/
可固化(ROMable)
C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手 段(C编译、连接、下载和固化), C/OS-II可以嵌入到读者的产品 中成为产品的一部分。
可裁剪(Scalable)
可以只使用 C/OS-II中应用程序需要的那些系统服务。也就是说某产 品可以只使用很少几个 C/OS-II调用,而另一个产品则使用了几乎所 有 C/OS-II的功能,这样可以减少产品中的 C/OS-II所需的存储器空 间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。
系统服务
C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存 的申请与释放、时间相关函数等。
中断管理
中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则 高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。
稳定性与可靠性
10
µC/OS-II图书
27
空闲TCB链表
所有的任务控制块都被放臵在任务控制块列表数组 OSTCBTbl[]中,系统初始化时,所有TCB被链接成空闲的 单向链表,头指针为OSTCBFreeList。当创建一个任务后 ,就把OSTCBFreeList所指向的TCB赋给了该任务,并将它 加入到使用链表中,然后把OSTCBFreeList指向空闲链表 中的下一个结点。
FS C/C++ 设备驱动
RTOS
KERNEL 调试工具
其它组件
TCP/IP
设备I/O
BSP 嵌入式硬件平台
7
C/OS简介
1、C/OS——Micro Controller O S,微控制器操作系统 2、 C/OS简介
美国人Jean Labrosse 1992年完成 应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动 机控制、高速公路电话系统、自动提款机等 1998年C/OS-II,目前的版本C/OS -II V2.61,2.72
所有的任务控制块分属于两条不同的链表 ,单向的空闲链表(头指针为 OSTCBFreeList)和双向的使用链表(头 指针为OSTCBList);
OSTCBNext、OSTCBPrev:用于将任务控制 块插入到空闲链表或使用链表中。每个任 务的任务控制块在任务创建的时候被链接 到使用链表中,在任务删除的时候从链表 中被删除。双向连接的链表使得任一成员 都能快速插入或删除。
2
嵌入式操作系统的发展
应用程序
应用程序
通信协议
库函数
应用程序
文件系统
API GUI
文件系统
API GUI
操作系统内核
操作系统内核
操作系统内核
驱动程序和固件
驱动程序和固件
驱动程序和固件
80年代初期
80年代中期-90年代中 期
90年代末期-21世纪
3
常见的嵌入式操作系统
实时嵌入式操作系统的种类繁多,大体上可分为两 种,商用型和免费型。 商用型的实操作系统功能稳定、可靠,有完善的技 术支持和售后服务,但往往价格昂贵,如Vxworks、 QNX、WinCE、Palm OS等。 免费型的实时操作系统在价格方面具有优势,目前 主要有Linux,μC/OS是一种源码开放的商业RTOS;
19
任务也可以自我删除(并非真的删除,只是内核不 再知道该任务)
void MyTask (void *pdata) {
...... /* 用户代码 */
OSTaskDel(OS_PRIO_SELF); }
20
μ C/OS-Ⅱ可以管理多达64个任务;
OS_CFG.H 中定义=63
每个任务被赋以不同的优先级,取值从0到 OS_LOWEST_PRIO-2,数值越小,优先级越高;
28
系统初始化后…
指针数组,指向相应TCB
29
任务的状态-休眠
休眠状态(Dormant):任务存在于内存 空间中,但内核不可见;
可以通过以下函数通知内核,使之变为就 绪状态:
–
OSTaskCreate()或OSTaskCreateExt()
可以通过以下函数返回到休眠状态:
–
OSTaskDel()
11
µC/OS-II的各种商业应用
全世界有数百种产品在应用:
Avionics Medical Cell phones
Routers and switches
High-end audio equipment Washing machines and dryers UPS (Uninterruptible Power Supplies)
用ANSI C书写
支持任何8, 16, 32-bits CPU 支持SMC, MMC, SD, CF, IDE, Flash, RAM 其他介质
14
可移植的数据类型
typedef unsigned char BOOLEAN;