论文部分内容阅读
摘要:阐述了嵌入式操作系统发展的历史、嵌入式操作系统的市场和技术发展的变化,介绍了当前一种源码公开的嵌入式实时操作系统μC/OS-II在产品开发中的应用现状、技术优势。分析了μC/OS-II嵌入式实时内核的公开源代码可移植性、可裁剪、可固化、稳定性与可靠性等特点。指出μC/OS-II在嵌入式工业控制系统中很好的应用前景。
关键词:嵌入式操作系统;μC/OS-II;移植
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)16-21298-02
Study on the Characteristics and Porting Application of μC/OS-II
LI Shuang-zheng
(Nanyang Institute of Technology,Nanyang 473000,China)
Abstract:The paper discussed the history,market and development of real time operating system (RTOS)and introduced the applied status,technical advantage and developing prospect of μC/OS-II, which was a RTOS with open source code. The character of the μC/OS-II on open source code were analyzed as portability、scale、solidification、stability and dependability, etc. Besides, pointed out the good application prospect of the μC/OS-II in the embedded project control field.
Key words:embedded system;μC/OS-II;porting
早在20 世纪60 年代,就已经开始了嵌入式操作系统的研究和开发工作。嵌入式操作系统在通信、电子、自动化等领域具有无比的优越性,其实时处理能力得到越来越多的重视,关于嵌入式操作系统的研究正在不断深入。
嵌入式操作系统通常分为商用和源码公开两种。前者的主要代表有VXWORKS ,PSOS 等,特点是性能优良,使用方便但价格十分昂贵。后者由于代码是公开的,具有性能和价格两方面的优势。其中μC/OS-II是一个不错的选择。
μC/OS-II是由Labrosse 编写的一个源码公开的嵌入式操作系统,这一点对于用户来说可谓利弊各半:好处在于,它是免费的,而且用户可以根据自己的需要对它进行修改;缺点在于,它缺乏必要的支持。它没有功能强大的软件包,用户通常需要编写自己的驱动程序, 有时甚至还必须编写相关的移植程序。
1μC/OS-II实时操作系统及性能
1.1 μC/OS-II系统的特点
(1)μC/OS-II是一个占先式的内核,即已经准备就绪的高优先级任务可以剥夺正在运行的低优先级任务的CPU 使用权。这个特点使得它的实时性比非占先式的内核要好。通常都是在中断服务程序中使高优先级任务进入就绪态(例如使用发送信号的方法) ,退出中断服务程序后,将进行任务切换,高优先级任务被执行。
(2)μC/OS-II和大家所熟知的Linux 等分时操作系统不同,它不支持时间片轮转法。它是一个基于优先级的实时操作系统。每一个任务必须具有不同的优先级(分析它的源码会发现μC/OS-II把任务的优先级当作任务的标识来使用,如果优先级相同,任务将无法区分) 。进入就绪态的优先级最高的任务首先得到CPU 的使用权,只有等它交出CPU 的使用权后,其他任务才可以被执行。所以只能说它是多任务,不能说是多进程,至少不是人们所熟悉的那种多进程。
(3)μC/OS-II对共享资源提供了保护机制。μC/OS-II是一个支持多任务的操作系统。一个完整的程序可以划分成几个任务,不同的任务执行不同的功能。这样,一个任务就相当于模块化设计中的一个子模块。在任务中添加代码时,只要不是共享资源就不必担心互相之间有影响。对于共享资源(例如串口)。μC/OS-II也提供了很好的解决办法。一般情况下使用的是信号量的方法。简单地说,先创建一个信号量并对它进行初始化。当一个任务需要使用一个共享资源时,它必须先申请得到这个信号量。而一旦它得到了此信号量,那就只有等它使用完了该资源,信号量才会被释放。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到此信号量,也不能使用该资源。这个特点的好处显而易见,当显示屏正在显示信息的时候,外部产生了一个中断,而在中断服务程序中需要显示屏显示其他信息。这样,退出中断服务程序后,原有的信息就可能被破坏了。而在μC/OS-II中采用信号量的方法时,只有显示屏把原有信息显示完毕后才可以显示新信息,从而可以避免这个问题。不过,采用这种方法是以牺牲系统的实时性为代价的。如果显示原有信息需要耗费大量时间,系统只好等待。从结果上看,等于延长了中断响应时间,这对于未显示信息是报警信息的情况,无疑是致命的。发生这种情况,在μC/OS-II中称为优先级反转。简单地说,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级反转是无法避免的。所以使用μC/OS-II时,必须对所开发的系统了解清楚,才能选择对某种共享资源是否使用信号量。
1.2 μC/OS-II性能特点
μC/OS-II是源代码公开的实时嵌入式操作系统,在第1 版的基础上做了重大的改进与升级,它的主要特点如下:
(1)公开源代码
源代码公开,并且可以从有关出版物上找到详细的源代码讲解和注释 ,这样使得系统变得透明,很容易就能把操作系统移植到各个不同的硬件平台上。
(2)可移植性(Portable)
μC/OS-II绝大部分源代码是用C 语言写的,而与微处理器硬件相关的那部分是用汇编语言写的,使得μC/OS-II便于移植到其他微处理器上。
(3)可固化(ROMable)
μC/OS-II是为嵌入式应用而设计的,这就意味着,只要开发者有固化手段(即: C 编译,连接,下载和固化),μC/OS-II可以嵌入到开发者的系统中。
(4)可裁剪性(Scalable)
开发者可以有选择的使用μC/OS-II中应用程序需要的哪些系统服务,这样可以减少μC/OS-II所需的存储空间。
(5)占先式(Preemptive)
μC/OS-II完全是占先式的实时内核,即总是运行就绪条件下优先级最高的任务。
(6)多任务(Mult-Task)
μC/OS-II可以管理64 个任务,但目前的版本保留了8 个给系统,应用程序最多有56 个任务,赋予每个任务的优先级必须是不同的。μC/OS-II不支持时间片轮转调度法(Roand-roblin Scheduling) 。
(7)可确定性(Affirmable)
全部μC/OS-II的函数调用与服务的执行时间具有其可确定性,即μC/OS-II系统服务的执行时间不依赖于应用程序任务的多少。
(8)实用性和可靠性
μC/OS-II自1992年以来,已经被移植到几乎所有嵌入式应用类CPU上 ,移植范例的源代码可以从因特网上下载。许多行业都有成功应用该实时内核的实例,这些应用的实践是该内核实用性和可靠性的最好证据。
2 嵌入式操作系统μC/OS-II的移植探讨
2.1 移植中的问题
所谓移植,就是使一个实时内核能在其他的微处理器(MPU)或微控制器(MCU)上运行。整个嵌入式系统分为两大层:硬件层和软件层。在移植时,这两个层都要考虑。硬件层主要是处理器,对μC/OS-II进行移植到不同处理器平台时,需要解决的主要问题有:
(1)数据类型的重定义。
对于一个操作系统来说,基于其上进行开发的应用系统一般都使用高级语言,高级语言都有自己的数据类型。但对于不同的处理器由于字长不相同,造成同一数据类型在不同处理器中会有不同的解释,所以对不同的处理器应该重新进行数据类型的定义。
(2)堆栈结构的设计。
当同一个操作系统应用于不同处理器或同一处理器的不同应用系统时,由于各应用系统所追求的性能各有特点,就会要求与性能有很大关系的堆栈结构尽可能与本系统所追求的性能一致。
(3)任务切换时的状态保存与恢复。
这是多任务操作系统最主要的工作,也是最频繁的工作。所以任务切换在实现时的正确与否是操作系统运行时的基本保证,同时它的简洁与否决定操作系统的效率。
2.2 移植μC/OS-II的条件
硬件层主要是处理器,移植μC/OS-II对目标处理器有一定要求,要求如下:
处理器的C编译器能产生可重入代码;处理器支持中断,并且能产生定时中断;用C语言能开、关中断;能支持一定数量的数据存储硬件堆栈;处理器有将堆栈指针以及其他CPU 寄存器的内容读出、并存储到堆栈或其他内存中去的指令。
软件层主要分为四个部分:实时操作系统内核,与处理器相关部分,与应用相关部分,用户的应用系统。下面针对移植问题简述这四个部分:
(1)实时操作系统内核
实时操作系统对系统资源进行管理。主要包括任务分配和调度、系统时钟服务、内存管理、消息机制、异常处理等。μC/OS-II所有系统服务均由内核提供,内核将应用系统和底层硬件结合成一个完整的实时系统。
移植的时候内核是不变的,开发者根据自己应用系统的需要来选择实时操作系统内核,开发者不能对内核随意访问,只能使用内核提供的功能服务来开发自己的应用系统。内核确定,那么所提供的系统管理能力,系统服务也就被限定。开发者只能在规定的范围内对系统作些改动。
(2)与处理器相关的代码
这是移植中最关键的部分。内核将应用系统和底层硬件有机结合成一个实时系统。要使同一个内核能适用于不同的硬件体系,就要在内核和硬件之间有一个中间层,这就是与处理器相关的代码。处理器不同,这部分代码也不同。
在μC/OS-II中,这一部分代码分成三个文件:OS_CPU.H, OS_CPU_A.ASM, OS_CPU_C.C
OS_CPU.H
包括了用#define定义的与处理器相关的常量、宏和类型定义。具体来讲有系统数据类型定义、栈增长方向定义、关中断和开中断定义、系统软中断的定义等。
OS_CPU_A.ASM
这部分需要对处理器的寄存器进行操作,所以必须用汇编语言来编写。它包括四个子函数:
OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR()。
OS_CPU_C.CμC/OS-II中共定义了6个函数在该文件中。但是最重要的是OSTaskStkInit(),其他都是对系统内核的扩展时用的。
OSTaskStkInit()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化。使建立好的进入就绪态任务的堆栈与系统发生中断并将环境变量保存完毕时的栈结构一致。这样就可以用中断返回指令使就绪的任务运行起来。具体的入栈方式要根据不同处理器而定。
(3)与应用相关的代码
这一部分是用户根据自己的应用系统来定制合适的内核服务功能,包括两个文件:O S _ C F G . H ,INCLUDES.H。
OS_CFG.H 来配置内核,用户根据需要对内核进行定制,留下需要的部分,去掉不需要的部分,设置系统的基本情况。比如系统可提供的最大任务数量,是否定制邮箱服务,是否需要系统提供任务挂起
功能,是否提供任务优先级动态改变功能等。
INCLUDES.H 系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件。
(4)用户应用系统
这是整个实时系统的最高层,用户可通过利用实时操作系统提供的服务来开发自己的具体应用程序。
3 结束语
在嵌入式应用中,使用实时操作系统(RTOS) 是当前嵌入式应用的一个特点,一种时尚,尤其在工业控制系统中,像μC/OS-II这样短小精湛的实时内核,更有用武之地。 另外,μC/OS-II开放的、免费嵌入式实时操作系统的应用与推广,不仅缩短开发周期,而且会研发出质量更高,性能更好,更容易维护的应用软件。
从以上的分析中不难看出,对于实时性、可靠性要求较强的项目,特别是大型项目,最好使用μC/OS-II。而对于一些简单的、成本要求低的项目来说,就没必要这么麻烦了。需要指出的是,μC/OS-II的特点远不止这些,应用开发中需要注意的问题也很多,需要用户自己不断地探索和研究。μC/OS-II的移植很具有实际意义,是在嵌入应用系统开始开发之前必须要做的工作。
参考文献:
[1] [美]Jean J Labrosse. 嵌入式实时操作系统μC/OS-II [M]. 北京:北京航空航天大学出版社,2003.
[2] 邵贝贝.译μC/OS-II源码公开的实时嵌入式操作系统.中国电力出版社.
[3] 王田苗.嵌入式系统设计与实例开发[M].北京:清华大学出版社,2002.
关键词:嵌入式操作系统;μC/OS-II;移植
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)16-21298-02
Study on the Characteristics and Porting Application of μC/OS-II
LI Shuang-zheng
(Nanyang Institute of Technology,Nanyang 473000,China)
Abstract:The paper discussed the history,market and development of real time operating system (RTOS)and introduced the applied status,technical advantage and developing prospect of μC/OS-II, which was a RTOS with open source code. The character of the μC/OS-II on open source code were analyzed as portability、scale、solidification、stability and dependability, etc. Besides, pointed out the good application prospect of the μC/OS-II in the embedded project control field.
Key words:embedded system;μC/OS-II;porting
早在20 世纪60 年代,就已经开始了嵌入式操作系统的研究和开发工作。嵌入式操作系统在通信、电子、自动化等领域具有无比的优越性,其实时处理能力得到越来越多的重视,关于嵌入式操作系统的研究正在不断深入。
嵌入式操作系统通常分为商用和源码公开两种。前者的主要代表有VXWORKS ,PSOS 等,特点是性能优良,使用方便但价格十分昂贵。后者由于代码是公开的,具有性能和价格两方面的优势。其中μC/OS-II是一个不错的选择。
μC/OS-II是由Labrosse 编写的一个源码公开的嵌入式操作系统,这一点对于用户来说可谓利弊各半:好处在于,它是免费的,而且用户可以根据自己的需要对它进行修改;缺点在于,它缺乏必要的支持。它没有功能强大的软件包,用户通常需要编写自己的驱动程序, 有时甚至还必须编写相关的移植程序。
1μC/OS-II实时操作系统及性能
1.1 μC/OS-II系统的特点
(1)μC/OS-II是一个占先式的内核,即已经准备就绪的高优先级任务可以剥夺正在运行的低优先级任务的CPU 使用权。这个特点使得它的实时性比非占先式的内核要好。通常都是在中断服务程序中使高优先级任务进入就绪态(例如使用发送信号的方法) ,退出中断服务程序后,将进行任务切换,高优先级任务被执行。
(2)μC/OS-II和大家所熟知的Linux 等分时操作系统不同,它不支持时间片轮转法。它是一个基于优先级的实时操作系统。每一个任务必须具有不同的优先级(分析它的源码会发现μC/OS-II把任务的优先级当作任务的标识来使用,如果优先级相同,任务将无法区分) 。进入就绪态的优先级最高的任务首先得到CPU 的使用权,只有等它交出CPU 的使用权后,其他任务才可以被执行。所以只能说它是多任务,不能说是多进程,至少不是人们所熟悉的那种多进程。
(3)μC/OS-II对共享资源提供了保护机制。μC/OS-II是一个支持多任务的操作系统。一个完整的程序可以划分成几个任务,不同的任务执行不同的功能。这样,一个任务就相当于模块化设计中的一个子模块。在任务中添加代码时,只要不是共享资源就不必担心互相之间有影响。对于共享资源(例如串口)。μC/OS-II也提供了很好的解决办法。一般情况下使用的是信号量的方法。简单地说,先创建一个信号量并对它进行初始化。当一个任务需要使用一个共享资源时,它必须先申请得到这个信号量。而一旦它得到了此信号量,那就只有等它使用完了该资源,信号量才会被释放。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到此信号量,也不能使用该资源。这个特点的好处显而易见,当显示屏正在显示信息的时候,外部产生了一个中断,而在中断服务程序中需要显示屏显示其他信息。这样,退出中断服务程序后,原有的信息就可能被破坏了。而在μC/OS-II中采用信号量的方法时,只有显示屏把原有信息显示完毕后才可以显示新信息,从而可以避免这个问题。不过,采用这种方法是以牺牲系统的实时性为代价的。如果显示原有信息需要耗费大量时间,系统只好等待。从结果上看,等于延长了中断响应时间,这对于未显示信息是报警信息的情况,无疑是致命的。发生这种情况,在μC/OS-II中称为优先级反转。简单地说,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级反转是无法避免的。所以使用μC/OS-II时,必须对所开发的系统了解清楚,才能选择对某种共享资源是否使用信号量。
1.2 μC/OS-II性能特点
μC/OS-II是源代码公开的实时嵌入式操作系统,在第1 版的基础上做了重大的改进与升级,它的主要特点如下:
(1)公开源代码
源代码公开,并且可以从有关出版物上找到详细的源代码讲解和注释 ,这样使得系统变得透明,很容易就能把操作系统移植到各个不同的硬件平台上。
(2)可移植性(Portable)
μC/OS-II绝大部分源代码是用C 语言写的,而与微处理器硬件相关的那部分是用汇编语言写的,使得μC/OS-II便于移植到其他微处理器上。
(3)可固化(ROMable)
μC/OS-II是为嵌入式应用而设计的,这就意味着,只要开发者有固化手段(即: C 编译,连接,下载和固化),μC/OS-II可以嵌入到开发者的系统中。
(4)可裁剪性(Scalable)
开发者可以有选择的使用μC/OS-II中应用程序需要的哪些系统服务,这样可以减少μC/OS-II所需的存储空间。
(5)占先式(Preemptive)
μC/OS-II完全是占先式的实时内核,即总是运行就绪条件下优先级最高的任务。
(6)多任务(Mult-Task)
μC/OS-II可以管理64 个任务,但目前的版本保留了8 个给系统,应用程序最多有56 个任务,赋予每个任务的优先级必须是不同的。μC/OS-II不支持时间片轮转调度法(Roand-roblin Scheduling) 。
(7)可确定性(Affirmable)
全部μC/OS-II的函数调用与服务的执行时间具有其可确定性,即μC/OS-II系统服务的执行时间不依赖于应用程序任务的多少。
(8)实用性和可靠性
μC/OS-II自1992年以来,已经被移植到几乎所有嵌入式应用类CPU上 ,移植范例的源代码可以从因特网上下载。许多行业都有成功应用该实时内核的实例,这些应用的实践是该内核实用性和可靠性的最好证据。
2 嵌入式操作系统μC/OS-II的移植探讨
2.1 移植中的问题
所谓移植,就是使一个实时内核能在其他的微处理器(MPU)或微控制器(MCU)上运行。整个嵌入式系统分为两大层:硬件层和软件层。在移植时,这两个层都要考虑。硬件层主要是处理器,对μC/OS-II进行移植到不同处理器平台时,需要解决的主要问题有:
(1)数据类型的重定义。
对于一个操作系统来说,基于其上进行开发的应用系统一般都使用高级语言,高级语言都有自己的数据类型。但对于不同的处理器由于字长不相同,造成同一数据类型在不同处理器中会有不同的解释,所以对不同的处理器应该重新进行数据类型的定义。
(2)堆栈结构的设计。
当同一个操作系统应用于不同处理器或同一处理器的不同应用系统时,由于各应用系统所追求的性能各有特点,就会要求与性能有很大关系的堆栈结构尽可能与本系统所追求的性能一致。
(3)任务切换时的状态保存与恢复。
这是多任务操作系统最主要的工作,也是最频繁的工作。所以任务切换在实现时的正确与否是操作系统运行时的基本保证,同时它的简洁与否决定操作系统的效率。
2.2 移植μC/OS-II的条件
硬件层主要是处理器,移植μC/OS-II对目标处理器有一定要求,要求如下:
处理器的C编译器能产生可重入代码;处理器支持中断,并且能产生定时中断;用C语言能开、关中断;能支持一定数量的数据存储硬件堆栈;处理器有将堆栈指针以及其他CPU 寄存器的内容读出、并存储到堆栈或其他内存中去的指令。
软件层主要分为四个部分:实时操作系统内核,与处理器相关部分,与应用相关部分,用户的应用系统。下面针对移植问题简述这四个部分:
(1)实时操作系统内核
实时操作系统对系统资源进行管理。主要包括任务分配和调度、系统时钟服务、内存管理、消息机制、异常处理等。μC/OS-II所有系统服务均由内核提供,内核将应用系统和底层硬件结合成一个完整的实时系统。
移植的时候内核是不变的,开发者根据自己应用系统的需要来选择实时操作系统内核,开发者不能对内核随意访问,只能使用内核提供的功能服务来开发自己的应用系统。内核确定,那么所提供的系统管理能力,系统服务也就被限定。开发者只能在规定的范围内对系统作些改动。
(2)与处理器相关的代码
这是移植中最关键的部分。内核将应用系统和底层硬件有机结合成一个实时系统。要使同一个内核能适用于不同的硬件体系,就要在内核和硬件之间有一个中间层,这就是与处理器相关的代码。处理器不同,这部分代码也不同。
在μC/OS-II中,这一部分代码分成三个文件:OS_CPU.H, OS_CPU_A.ASM, OS_CPU_C.C
OS_CPU.H
包括了用#define定义的与处理器相关的常量、宏和类型定义。具体来讲有系统数据类型定义、栈增长方向定义、关中断和开中断定义、系统软中断的定义等。
OS_CPU_A.ASM
这部分需要对处理器的寄存器进行操作,所以必须用汇编语言来编写。它包括四个子函数:
OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR()。
OS_CPU_C.CμC/OS-II中共定义了6个函数在该文件中。但是最重要的是OSTaskStkInit(),其他都是对系统内核的扩展时用的。
OSTaskStkInit()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化。使建立好的进入就绪态任务的堆栈与系统发生中断并将环境变量保存完毕时的栈结构一致。这样就可以用中断返回指令使就绪的任务运行起来。具体的入栈方式要根据不同处理器而定。
(3)与应用相关的代码
这一部分是用户根据自己的应用系统来定制合适的内核服务功能,包括两个文件:O S _ C F G . H ,INCLUDES.H。
OS_CFG.H 来配置内核,用户根据需要对内核进行定制,留下需要的部分,去掉不需要的部分,设置系统的基本情况。比如系统可提供的最大任务数量,是否定制邮箱服务,是否需要系统提供任务挂起
功能,是否提供任务优先级动态改变功能等。
INCLUDES.H 系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件。
(4)用户应用系统
这是整个实时系统的最高层,用户可通过利用实时操作系统提供的服务来开发自己的具体应用程序。
3 结束语
在嵌入式应用中,使用实时操作系统(RTOS) 是当前嵌入式应用的一个特点,一种时尚,尤其在工业控制系统中,像μC/OS-II这样短小精湛的实时内核,更有用武之地。 另外,μC/OS-II开放的、免费嵌入式实时操作系统的应用与推广,不仅缩短开发周期,而且会研发出质量更高,性能更好,更容易维护的应用软件。
从以上的分析中不难看出,对于实时性、可靠性要求较强的项目,特别是大型项目,最好使用μC/OS-II。而对于一些简单的、成本要求低的项目来说,就没必要这么麻烦了。需要指出的是,μC/OS-II的特点远不止这些,应用开发中需要注意的问题也很多,需要用户自己不断地探索和研究。μC/OS-II的移植很具有实际意义,是在嵌入应用系统开始开发之前必须要做的工作。
参考文献:
[1] [美]Jean J Labrosse. 嵌入式实时操作系统μC/OS-II [M]. 北京:北京航空航天大学出版社,2003.
[2] 邵贝贝.译μC/OS-II源码公开的实时嵌入式操作系统.中国电力出版社.
[3] 王田苗.嵌入式系统设计与实例开发[M].北京:清华大学出版社,2002.