μC/OS-Ⅱ读作“micro controller OS 2”,意为“微控制器操作系统版本2”,它是一个源码公开、可移植、可固化、可裁剪、占先式的实时多任务操作系统,其绝大部分源码是用ANSIC 写的。 世界著名嵌入式专家Jean J.Labrosse(μC/OS-Ⅱ的作者)出版了多本图书,详细分析了该内核的几个版本。 μC/OS-Ⅱ通过了美国联邦航空管理局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO—178B 标准,该标准是为航空电子设备所使用软件的性能要求而制定的。 自1992 年问世以来,μC/OS-Ⅱ已经被应用到数以百计的产品中。 μC/OS-Ⅱ在高校教学使用是不需要申请许可证的,但将μC/OS-Ⅱ的目标代码嵌入到产品中去,应当购买目标代码销售许可证。
μC/OS-Ⅱ实际上是一个实时操作系统内核,只包含了任务调度、任务管理、时间管理、内存管理和任务间的通信与同步等基本功能,没有提供输入输出管理、文件系统、网络之类的额外服务。 其中包含全部功能的核心部分代码只占用8.3 KB,而且由于μC/OS-Ⅱ是可裁剪的,所以用户系统中实际的代码最少可达2.7 KB,可谓短小精悍。 因此,μC/OS-Ⅱ不仅可使用户得到廉价的解决方案,而且由于μC/OS-Ⅱ的可移植性和开源性,用户还可以针对自己的硬件优化代码,以获得更好的性能。
目前,已经出现了专门为μC/OS-Ⅱ开发文件系统、TCP/IP 协议栈、用户显示接口等的第三方商家。 μC/OS-Ⅱ属于可剥夺型内核,即它总是执行处理就绪条件下优先级最高的任务。为了简化系统的设计,μC/OS-Ⅱ规定所有任务的优先级必须不同,任务的优先级同时也唯一地标识了该任务。 即使两个任务的重要性是相同的,它们也必须有优先级上的差异,这也就意味着高优先级的任务在处理完成后必须进入等待或挂起状态,否则低优先级的任务永远也不可能执行。 系统通过两种方法进行任务调度:一是时钟节拍或其他硬件中断到来后,系统会调用函数OSIntCtxSw()执行切换功能;二是任务主动进入挂起或等待状态,这时系统通过发软中断命令或依靠处理器执行陷阱指令来完成任务切换,中断服务程序或陷阱处理程序的向量地址必须指向函数OSCtxSw()。
μC/OS-Ⅱ最多可以管理64 个任务,这些任务通常都是一个无限循环的函数。 在目前的版本中,作者保留了优先级为0、1、2、3、OS_LOWEST_PRIO -3、OS_LOWEST_PRIO -2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO 的任务,用户可以拥有56 个任务。 μC/OS-Ⅱ提供了任务管理的各种函数,包括创建任务、删除任务、改变任务的优先级、挂起和恢复任务等。 系统初始化时会自动产生两个任务:一是空闲任务OSTaskIdle(),它的优先级最低为OS_LOWEST_PRIO,该任务只是不停地给一个32 位的整型变量加“1”;另一个是统计任务OSTaskStat(),它的优先级为OS_LOWEST_PRIO -1,该任务每秒运行一次,负责计算当前CPU 的利用率。
μC/OS-Ⅱ要求用户提供一个称为时钟节拍的定时中断,该中断发生10 ~100 次/s,时钟节拍的实际频率是由用户控制的。 任务申请延时或超时控制的计时基准就是该时钟节拍。该时钟节拍同时还是任务调度的时间基准。 μC/OS-Ⅱ提供了与时钟节拍相关的系统服务,允许任务延时一定数量的时钟节拍或按时、分、秒、毫秒进行延时。
对于一个多任务操作系统来说,任务间的通信与同步是必不可少的。 μC/OS-Ⅱ提供了四种同步对象,分别是信号量、邮箱、消息队列和事件。 通过邮箱和消息队列还可以进行任务间的通信。 所有的同步对象都有相应的创建、等待、发送的函数。 由于这些对象一旦创建就不能删除,所以要避免创建过多的同步对象,以节约系统资源。(www.xing528.com)
μC/OS-Ⅱ将连续的大块内存按分区来管理,这样便消除了多次分配与释放内存所引起的内存碎片,每个分区中都包含整数个大小相同的内存块,但不同分区之间内存块的大小可以不同。 用户需要动态分配内存时,可选择一个适当的分区,按块来进行内存分配。 释放内存时将该块放回它以前所属的分区。
μC/OS-Ⅱ的大部分代码是用ANSI C 写成的,只有与处理器硬件相关的一部分代码用汇编语言编写。 μC/OS-Ⅱ的移植性很强,可以在绝大多数8 位、16 位、32 位微处理器、数字信号处理器上运行。 μC/OS-Ⅱ的移植并不复杂,用户可以根据需要自己编写移植代码。
μC/OS-Ⅱ是在PC 机上开发的,C 语言编译器使用的是Borland C/C+ + 3.1 版,而且PC机是大家最熟悉的开发环境,因此,在PC 机上学习和使用μC/OS-Ⅱ非常方便。 μC/OS-Ⅱ的网站上也提供了在PC 机上运行μC/OS-Ⅱ的源代码。 但是,由于C/C + +运行库和DOS 本身的限制,在PC 上运行μC/OS-Ⅱ时需要注意两个问题:第一,由于DOS 下的C 语言编译器提供的运行库没有考虑多线程应用的问题,运行库中的全局变量和部分函数只适用于单线程。 这些变量和函数包括:errno、_doserrno、strtok、strerror、tmpnam、tmpfile、asctime、gmtime、ecvt、fcvt 等。 在μC/OS-Ⅱ中使用这些函数时要小心,要避免两个任务同时调用这些函数,或者用信号量同步对这些函数进行调用。 第二,DOS 是不能重入的,也就是说,正在调用DOS服务期间,是不能再次调用DOS 的,如果又进行了DOS 调用,那么肯定会引起系统崩溃。μC/OS-Ⅱ启动多任务后,如果两个以上的任务进行了DOS 调用或者调用了需要DOS 的C/C+ +运行库(如:printf、scanf 等),就有可能引起DOS 重入。 在μC/OS-Ⅱ中,虽然可以调用BIOS 或直接操纵硬件,但要尽量减少DOS 调用。 如果必须要用DOS,最好只有一个调用DOS的任务,或者用信号量进行同步。
μC/OS-Ⅱ作为一个源代码公开的实时嵌入式内核,对学习和使用实时操作系统提供了极大的帮助。 许多开发者已经成功地将μC/OS-Ⅱ应用于自己的系统之中,同时μC/OS-Ⅱ自身也因此获得了快速的发展。 随着μC/OS-Ⅱ的不断完善,它必将会有更加广阔的应用空间。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。