一、uC/OS-II概述
uC/OS-II是Labrosse在1990年前后编写的一个实时操所系统。它提供全部源代码并可免费下载。uC/OS-II是一个基于优先级调度的抢占式实时多任务内核,具有良好的可移植性和升级性,代码段小简练。严格来说,它只是一个实时操作系统内核,仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通讯与同步等基本功能,没有提供输入输出管理,文件系统,网络服务等内容,而这些额外的内容必须通过付费购买以第三方软件的形式添加进去。但由于它的强大的可移植性及高度的可高性,使得它已在数百个商业应用中得到了良好的验证。
有源代码(Source Code): 目前μC/OS-II的代码不过5500行,μC/OS-II源码清晰易读,结构协调,而且都是经过千锤百炼的。在本书所附带的光盘中,附带了源代码。
可移植性(Portable): 除了其中与目标处理器有关部分用的汇编语言部编写外,μC/OS-II几乎完全是由可移植性很强的标准C(ANSI C)编写,而且汇编语言部分已被压缩到了最低限度以使μC/OS-II方便的移植到各种处理器上。到现在为止,μC/OS-II已经移植到了多达45种不同的处理器之上,处理器构架从8位到64位,包括ARM,PPC,MIPS,68K,X86 等多种体系结构以及DSP,当然还包括我们将要介绍的Microblaze处理器。其实,只要目标处理器提供堆栈指针和内部寄存器入栈出栈指令,并且所使用的编译器支持内迁汇编,或者可使该C语言可扩展和可连接汇编模块,使得开中断和关中断可在C语言中实现,那么就可以把μC/OS-II移植到该处理器上。
可固化(ROMable): μC/OS-II是为嵌入式应用而设计的,因此实际上可以将μC/OS-II嵌入到产品中作为产品的一部分。
可剪裁(Scalable):可以根据我们的实际应用选择系统服务。也就是说,每个应用可以只使用几个系统服务,而另一个应用可能会用到μC/OS-II几乎所有的功能。这使得我们可以根据需要减小RAM和ROM的占用。可剪裁性完全和编译条件有关。只要通过在应用程序中用#define constants 语句定义所需要用到的功能即可。
可剥夺性(Preemptive): μC/OS-II是完全可剥夺的实时内核,这就意味着他总是运行就绪条件下优先级最高的任务。大多数商业内核都是可剥夺型的,许多实际应用表明,μC/OS-II可以与他们媲美。
多任务(Multitasking):μC/OS-II可管理多达64个任务,其中56个用户任务。每个任务都被分配唯一的优先级,也即指μC/OS-II不支持时间偏轮转调度法(round-robin schedling)。
确定性(Deterministic): μC/OS-II的函数调用和服务执行时间都是可确定的。也就是说我们总是可以知道函数调用和服务执行了多少时间。除了OSTimeTick()和一些事件标志服务外,μC/OS-II服务执行时间不依赖于用户程序中任务的数量。
任务栈(Task Stacks):每个任务都有自己单独的栈,然而,μC/OS-II允许每个任务拥有不同的栈空间。以减少应用程序队RAM的需求。利用μC/OS-II的站检验函数,我们可以很容易的确定任务实际所需的空间大小。
服务(Services): μC/OS-II提供许多系统服务,例如信号量,胡此行信号量,事件标志,邮箱,消息序列,固定大小内存分区,任务管理,时间管理等等。
中断管理(Interrupt Management):中断管理可以使正在执行的的任务暂时挂起。如果该中断的产生使得更高优先级的任务被唤醒,则优先级更高的任务将立即执行。
稳定性与可靠性(Robust and Reliable): μC/OS-II每一个函数,每一行代码都经过了严格的测试,以获得足够的安全性,用于与人性命攸关的,安全要求极为苛刻的系统。
教育支持(COLLEGES AND UNIVERSITIES):许多大学都在使用μC/OS-II作为RTOS的培训课程,这就确保了我们的心工程师们都接受了关于μC/OS-II的培训并可以在实际中应用它。
对操作系统的移植目的是利用操作系统所提供的服务,更好的管理各种任务。uC/OS-II主要提供了以下的服务:
任务管理:uC/OS-II最多可以管理64个任务,系统保留了4个最高优先级任务和4个最低优先级任务,用户可以使用的任务数有56个。uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务优先级,任务挂起和恢复等。
任务管理 | |
建立任务 | OSTaskCreate( ) |
堆栈检验 | OSTaskStkChk( ) |
删除任务 | OSTaskDel( ) |
挂起任务 | OSTaskSuspend () |
时间管理:uC/OS-II的时间管理是通过定时中断来实现的。定时中断一般每隔10ms或100ms发生一次,实际的频率可以通过对硬件系统的定时器编程来决定,该中断也称为始终节拍。时间管理对于系统提供的时间功能函数至关重要,任务延迟一定数量的时间都是通过始终节拍来提供的。
时间管理 | |
任务延时函数 | OSTimeDly( ) |
按时分秒延时函数 | OSTimeDlyHMSM() |
恢复延时的函数 | OSTimeDlyReuse() |
系统时间 | OSTimeGet() OSTimeSet() |
任务间的通信与同步:对多任务系统来说,任务间的通信与同步是必不可少的。uC/OS-II提供了四种同步对象:信号量,邮箱,消息队列和事件。所有这些同步对象都有创建等待发送查询的接口用于实现进程间的通信与同步。
信号量管理 | |
建立信号量 | OSSemCreate( ) |
删除信号量 | OSSemDel( ) |
等待信号量 | OSSemPend( ) |
发出信号量 | OSSemPost () |
互斥型信号量管理 | |
建立互斥型信号量 | OSMutexCreate( ) |
删除互斥型信号量 | OSMutexDel( ) |
等待互斥型信号量 | OSMutexPend( ) |
释放互斥型信号量 | OSMutexPost () |
消息邮箱管理 | |
建立邮箱 | OSMboxCreate( ) |
删除邮箱 | OSMboxDel( ) |
等待邮箱 | OSMboxPend( ) |
发出邮箱 | OSMboxPost () |
内存管理:为了消除内存碎片和执行时间的不确定性,uC/OS-II把连续的大块内存按分区来管理。每个分区中包含整数个大小相同的内存块,不同分区间的内存块大小可以不同。
内存管理 | |
建立内存分区 | OSMboxCreate( ) |
分配内存块 | OSMboxDel( ) |
释放内存块 | OSMboxPend( ) |
查询内存块 | OSMboxPost () |
文章评论(0条评论)
登录后参与讨论