μC/OS-Ⅱ读做“micro C O S 2”,意为“微控制器操作系统版本2”。μC/OS-Ⅱ是基于《μC/OS The Real Time Kernel》的。它是实时多任务操作系统,世界上已有数千人在各个领域使用μC/OS-Ⅱ。下面介绍μC/OS-Ⅱ的特点。
1.公开源代码
许多商业实时内核的软件其源代码是不公开的,而μC/OS-Ⅱ的源代码是公开的。μC/OS-Ⅱ的作者JEAN J.LABROSSE先生尽了极大的努力以提供高质量的软件。这份源代码清晰易读且结构协调,跟那些商业实时内核的软件的源代码相比,μC/OS-Ⅱ是那样的干净漂亮和谐一致,注解的那么详尽,组织的那么有序。
2.可移植性(Portable)
绝大部分μC/OS-Ⅱ的源代码是用移植性很强的ANSI C编写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得μC/OS-Ⅱ便于移植到其他的微处理器上。如同μC/OS一样,μC/OS-Ⅱ可以移植到许许多多微处理器上。条件是,只要该微处理器有堆栈指针,有CPU内部寄存器入栈、出栈指令。另外,使用的C编译器必须支持内嵌汇编(inline assembly)或者该C语言可扩展、可连接汇编模块,使得关中断、开中断能在C语言程序中实现。μC/OS-Ⅱ可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。
3.可固化(Romable)
μC/OS-Ⅱ是为嵌入式应用而设计的,这就意味着,只要有固化手段(C编译、连接、下载和固化),μC/OS-Ⅱ就可以嵌入到产品中成为产品的一部分。
4.可裁剪(Scalable)
可以只使用μC/OS-Ⅱ中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个μC/OS-Ⅱ调用,而另一个产品则使用了几乎所有μC/OS-Ⅱ的功能。这样可以减少产品中的μC/OS-Ⅱ所需的存储器空间(RAM和ROM)。这种可裁剪性是靠条件编译实现的,只要在用户的应用程序中(用#define constants 语句)定义哪些μC/OS-Ⅱ中的功能是应用程序需要的就可以了。
5.占先式(Preemptive)
μC/OS-Ⅱ完全是占先式的实时内核。这意味着μC/OS-Ⅱ总是运行就绪条件下优先级最高的任务。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行(如图1所示)。当优先级高的那个任务完成之后,如果当前没有比刚才被中断了的那个任务优先级更高的任务,则才回到刚才被打断的那个任务继续执行。
图1 占先式内核
而如果是非占先式的内核,中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务并不会马上被挂起,而是先回到原先被中断了的那个任务,直到该任务完成,自动放弃CPU的使用权时,优先级高的那个就绪态任务才开始运行(如图2所示)。因此,μC/OS-Ⅱ使得任务级响应时间得以最优化。
图2 非占先式内核
6.多任务
μC/OS-Ⅱ可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务。赋予每个任务的优先级必须是不相同的,这意味着μC/OS-Ⅱ不支持时间片轮转调度法(Round-robin Scheduling)。该调度法适用于调度优先级平等的任务。
7.可确定性
全部μC/OS-Ⅱ的函数调用与服务的执行时间具有其可确定性。也就是说全部μC/OS-Ⅱ的函数调用与服务的执行时间是可知的。进而言之,μC/OS-Ⅱ系统服务的执行时间不依赖于应用程序任务的多少。
8.任务栈
每个任务有自己单独的栈,μC/OS-Ⅱ允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。使用μC/OS-Ⅱ的栈空间校验函数,可以确认每个任务到底需要多少栈空间。
9.系统服务
μC/OS-Ⅱ提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。
10.中断管理
中断可以使正在执行的任务暂时挂起。如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。
11.稳定性与可靠性
μC/OS-Ⅱ是基于μC/OS的,μC/OS自1992年以来已经有好几百个商业应用。μC/OS-Ⅱ与μC/OS的内核是一样的,只不过提供了更多的功能。