μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时核心,它适用于多种微处理器,微控制器和数字处理晶片(已经移植到超过100种以上的微处理器套用中)。同时,该系统原始码开放、整洁、一致,注释详尽,适合系统开发。 μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标準。
基本介绍
- 中文名:ucos ii
- 套用于:微处理器
- 适用于:多种微处理器
- 出自于:1992 年美国嵌入式系统专家Jean
性质
μC/OS-II被广泛套用于微处理器、微控制器和数位讯号处理器。
μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂誌的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂誌的B B S 上。
μC/OS 和μC/OS-II 是专门为计算机的嵌入式套用设计的, 绝大部分代码是用C语言编写的。CPU 硬体相关部分是用彙编语言编写的、总量约200行的彙编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标準的ANSI 的C交叉编译器,有彙编器、连线器等软体工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小核心可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。
严格地说uC/OS-II只是一个实时作业系统核心,它仅仅包含了任务调度,任务管理,时间管理,记忆体管理和任务间的通信和同步等基本功能。没有提供输入输出管理,档案系统,网路等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
uC/OS-II目标是实现一个基于优先权调度的抢占式的实时核心,并在这个核心之上提供最基本的系统服务,如信号量,信箱,讯息伫列,记忆体管理,中断管理等。
uC/OS-II以原始码的形式发布,是开源软体, 但并不意味着它是免费软体。你可以将其用于教学和私下研究(peaceful research);但是如果你将其用于商业用途,那幺你必须通过Micrium获得商用许可。
套用
μC/OS-II可以提供如下服务:
- 信号量
- 互斥信号量
- 事件标识
- 讯息信箱
- 讯息伫列
- 任务管理
- 固定大小记忆体块管理
- 时间管理
另外,在μC/OS-II核心之上,有如下独立模组可供用户选择: - μC/FS档案系统模组
- μC/GUI图形软体模组
- μC/TCP-IP协定栈模组
- μC/USB协定栈模组
组成
μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。
1) 核心部分(OSCore.c)
是作业系统的处理核心,包括作业系统初始化、作业系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。
2) 任务处理部分(OSTask.c)
任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。
3) 时钟部分(OSTime.c)
μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。
4) 任务同步和通信部分
为事件处理部分,包括信号量、信箱、信箱伫列、事件标誌等部分;主要用于任务间的互相联繫和对临界资源的访问。
5) 与CPU的接口部分
是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的作业系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用彙编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。
任务管理
uC/OS-II 中最多可以支持256个任务,分别对应优先权0~255,其中0 为最高优先权。255为最低级。
注意:uC/OS中最多可以支持64个任务,分别对应优先权0~63,其中0 为最高优先权。63为最低级。
uC/OS-II提供了任务管理的各种函式调用,包括创建任务,删除任务,改变任务的优先权,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先权最低,该任务仅给一个整型变数做累加运算;另一个是系统任务,它的优先权为次低,该任务负责统计当前cpu的利用率。
时间管理
uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬体系统的定时器编程来实现。中断髮生的时间间隔是固定不变的,该中断也成为一个时钟节拍。
uC/OS-II要求用户在定时中断的服务程式中,调用系统提供的与时钟节拍相关的系统函式,例如中断级的任务切换函式,系统时间函式。
记忆体管理
在ANSI C中是使用malloc和free两个函式来动态分配和释放记忆体。但在嵌入式实时系统中,多次这样的操作会导致记忆体碎片,且由于记忆体管理算法的原因,malloc和free的执行时间也是不确定。
uC/OS-II中把连续的大块记忆体按分区管理。每个分区中包含整数个大小相同的记忆体块,但不同分区之间的记忆体块大小可以不同。用户需要动态分配记忆体时,系统选择一个适当的分区,按块来分配记忆体。释放记忆体时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。
通信同步
对一个多任务的作业系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4种同步对象,分别是信号量,信箱,讯息伫列和事件。所有这些同步对象都有创建,等待,传送,查询的接口用于实现进程间的通信和同步。
任务调度
uC/OS-II 採用的是可剥夺型实时多任务核心。可剥夺型的实时核心在任何时候都运行就绪了的最高优先权的任务。
uC/OS-II的任务调度是完全基于任务优先权的抢占式调度,也就是最高优先权的任务一旦处于就绪状态,则立即抢占正在运行的低优先权任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先权不同,因为任务的优先权也同时唯一标誌了该任务本身。
任务调度
1) 高优先权的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先权任务获得执行,这种调度也称为任务级的上下文切换。
2) 高优先权的任务因为时钟节拍到来,在时钟中断的处理程式中,核心发现高优先权任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先权任务执行。这种调度也称为中断级的上下文切换。
这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程式中。
调度工作的内容可以分为两部分:最高优先权任务的寻找和任务切换。其最高优先权任务的寻找是通过建立就绪任务表来实现的。u C / O S 中的每一个任务都有独立的堆叠空间,并有一个称为任务控制块TCB(Task Control Block)的数据结构,其中第一个成员变数就是保存的任务堆叠指针。任务调度模组首先用变数OSTCBHighRdy 记录当前最高级就绪任务的TCB 地址,然后调用OS_TASK_SW()函式来进行任务切换。