μC OS-Ⅱ嵌入式实时操作系统.doc_第1页
μC OS-Ⅱ嵌入式实时操作系统.doc_第2页
μC OS-Ⅱ嵌入式实时操作系统.doc_第3页
μC OS-Ⅱ嵌入式实时操作系统.doc_第4页
μC OS-Ⅱ嵌入式实时操作系统.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C OS-嵌入式实时操作系统1 C/OS-嵌入式实时操作系统简介2 C/OS-运行机制和原理2.1 内核结构2.2 任务管理2.3 时间管理2.4 任务的同步与通信2.5 内存管理1 C/OS-嵌入式实时操作系统简介C/OS-是由Jean J.Labrosse于1992年编写的一个嵌入式多任务实时操作系统。最早这个系统叫做C/OS (Micro Control Operation System),经过近10年的应用和修改,在1999年Jean J.Labrosse推出了C/OS-。该操作系统是一个高度简洁、可ROM固化、可裁剪、实现抢先式实时多任务的操作系统内核,可用于各种微处理机系统。C/OS-的源代码是完全开放的,用C语言和汇编语言编写。其中绝大部分代码都是用C语言编写的,只有少部分与处理器密切相关的代码是用汇编语言编写。所以用户只要做很少的工作就可以把它移植到各类8位、16位和32位嵌入式处理器上。C/OS-包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能,并提供信号量,邮箱,消息队列,内存管理,中断管理等服务,可以管理64个任务。2 C/OS-运行机制和原理2.1 内核结构嵌入式系统中只有一个CPU,因此在一个具体时刻只能允许多个任务中的一个任务使用CPU。根据系统中任务获得使用CPU的权利的方式,多任务实时操作系统的内核分为可剥夺型和不可剥夺型两种类型。无论在哪种类型的内核中,每个任务都必须具有一个惟一的优先级别来表示它获得CPU的权利。不可剥夺型内核也叫做合作型多任务内核。在这种内核中,总是优先级别高的任务最先获得CPU的使用权。为防止某个任务始终霸占CPU的使用权,这种内核要求每个任务必须能主动放弃CPU的使用权。而包括C/OS-在内的大多数嵌入式实时操作系统采用的是实时性更好的可剥夺型内核。在可剥夺型内核中,CPU总是运行多个任务中优先级别最高的那个任务,即是CPU正在运行某个优先级别低的任务,当有高优先级别的任务准备就绪时,该高级别的任务就会剥夺正在运行任务的CPU使用权,从而使自己获得CPU的使用权。就像所有的实时内核一样,C/OS- 需要在存取代码核心区时禁止中断,在存取完成后再将中断重新打开。这使得C/OS-能够避免同时有其它任务或中断服务进入临界段代码,以免出现多个任务或中断服务程序同时进入该代码区。中断禁止时间是实时内核的一项最重要的指标,因为它影响着系统对实时事件的响应能力。微处理器一般都有关中断/开中断指令,用户使用的 C 语言编译器必须有某种机制能够在 C 中直接实现关中断/开中断地操作。某些 C 编译器允许在用户的 C 源代码中插入汇编语言的语句。这使得插入微处理器指令来关中断/开中断很容易实现。而有的编译器把从 C 语言中关中断/开中断放在语言的扩展部分。C/OS-定义两个宏(macros)来关中断和开中断,以便避开不同 C 编译器厂商选择不同的方法来处理关中断和开中断。C/OS-中的这两个宏调用分别是:OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()。因为这两个宏的定义取决于所用的微处理器,故在文件 OS_CPU.H 中可以找到相应宏定义。每种微处理器都有自己的 OS_CPU.H 文件。C/OS-操作系统内核的主要工作就是对任务进行管理和调度。从任务的存储结构来看,C/OS-的任务由三个组成部分构成:任务程序代码、任务堆栈和任务控制块。其中,任务控制块用来保存任务属性,包括分别指向前后一个任务控制块的指针、指向任务的指针、指向任务堆栈的指针、任务的优先级别等等;任务堆栈用来保存任务工作环境;任务程序代码是任务的执行部分。C/OS-的任务分为两种:由应用程序设计者为解决应用问题而编写的用户任务,以及由系统提供的为应用程序来提供某种服务的系统任务。C/OS-把每一个任务都作为一个节点,然后把它们链接成一个任务链表,以方便管理。根据任务是否占用CPU,以及是否处于被中断、等待等情况,任务在C/OS-中可能处于一下五种状态之一:睡眠状态、就绪状态、运行状态、等待状态、终端服务状态。图1是C/OS-控制下的任务状态转换图。在任一给定的时刻,任务的状态一定是在这五种状态之一。图1 任务状态转换图2.2 任务管理前面提到了,C/OS-能够管理多达64个任务,每个任务都必须具备一个惟一的优先级别。任务的优先级越高,反映优先级的值则越低。值得一提的是,C/OS-预定义了两个系统任务:空闲任务和统计任务。C/OS-总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。这个空闲任务OSTaskIdle()永远设为最低优先级,即 OS_LOWEST_PRI0。空闲任务OSTaskIdle()什么也不做,只是在不停地给一个 32 位的名叫 OSIdleCtr 的计数器加 1。在计数器加 1 前后,中断是先关掉再开启的,因为 8 位以及大多数 16 位微处理器的 32 位加 1 需要多条指令,要防止高优先级的任务或中断服务 子程序从中打入。空闲任务不可能被应用软件删除。C/OS-提供的另一个任务叫做统计任务OSTaskStat(),如果用户将系统定义常数 OS_TASK_STAT_EN(见文件 OS_CFG.H)设为 1,这个任务就会建立。一旦得到了允许,OSTaskStat()每秒钟运行一次(见文件 OS_CORE.C),计算当前的 CPU 利用率。换句话说,OSTaskStat()告诉用户应用程序使用了多少 CPU 时间,用百分比表示,这个值放在一个有符号 8 位整数 OSCPUsage 中,精读度是 1 个百分点。如果用户应用程序打算使用统计任务,用户必须在初始化时建立一个唯一的任务,在这个任务中调用OSStatInit()(见文件OS_CORE.C)。换句话说,在调用系统启动函数OSStart() 之前,用户初始代码必须先建立一个任务,在这个任务中调用系统统计初始化函数 OSStatInit(),然后再建立应用程序中的其它任务。 在C/OS-中,用户可以通过传递任务地址和其参数到以下两个函数之一来建立任务:OSTaskCreate() 或 OSTaskCreateExt()。OSTaskCreateExt()是OSTaskCreate()的扩展版本,提供了一些附加的功能,同时也增加了一些额外的开销。用户可以根据需要使用这两个函数之一来完成任务的创建工作。OSTaskCreate()需要四个参数:task是任务代码的指针,pdata 是当任务开始执行传递给任务的参数的指针,ptos 是分配给任务的堆栈的栈顶指针,prio 是分配给任务的优先级。OSTaskCreate()一开始先检测分配给任务的优先级是否有效,任务的优先级必须在0 到OS_LOWEST_PRIO之间且未被使用。随后即调用函数OSTaskStkInit()和OSTCBInit()对任务堆栈和任务控制块进行初始化。用户在调用OSTaskCreate()的时候必须知道堆栈是递增的还是递减的(参看所用处理器的 OS_CPU.H 中的 OS_STACK_GROWTH) ,因为用户必须得把堆栈的栈顶传递给 OSTaskCreate(),而栈顶可能是堆栈的最高地址(堆栈从上往下递减OS_STACK_GROWTH=1),也可能是最低地址(堆栈从下往上长OS_STACK_GROWTH=0)。初始化成功后,除了把任务计数器加1外,还要进一步判断内核是否在运行状态(即OSRunning的值是否为1)。如果OSRunning的值为1,则调用OSSched()进行任务调度。OSTaskCreateExt()需要九个参数,前四个参数(task,pdata,ptos和prio)与OSTaskCreate()的四个参数完全相同,连先后顺序都一样。这样做的目的是为了使用户 能够更容易地将用户的程序从OSTaskCreate()移植到OSTaskCreateExt()上去。 id参数为要建立的任务创建一个特殊的标识符。该参数在C/OS 以后的升级版本中可能会用到,但在C/OS-中还未使用。 pbos 是指向任务的堆栈栈底的指针,用于堆栈的检验。 stk_size用于指定堆栈成员数目的容量。也就是说,如果堆栈的入口宽度为4 字节宽,那么stk_size 为10000 是指堆栈有40000个字节。该参数与pbos 一样,也用于堆栈的检验。 pext 是指向用户附加的数据域的指针,用来扩展 务的OS_TCB。例如,用户可以为每个任务增加一个名字,或是在任务切换过程中将浮点寄存器的内容储存到这个附加数据域中等等。 opt 用于设定OSTaskCreateExt()的选项,指定是否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等。有时候删除任务是很有必要的。函数OSTaskDel()删除任务,是说任务将返回并处于休眠状态,并不是说任务的代码被删除了,只是任务的代码不再被C/OS-调用。任务的删除意味着:它的任务控制块从OSTCBList链表中移到OSTCBFreeList,这样时钟节拍函数中就不会处理它了,这样调度把它置入就绪表的可能性就没了;如果它已经处于就绪表中,那么它将被移出,这样调度器函数就不会处理它,这样它被调度运行的机会就没了。在程序运行期间,用户可以通过调用OSTaskChangePrio()来改变任务的优先级。换句话说,就是C/OS-允许动态的改变任务的优先级。需要注意的是,用户不能改变空闲任务的优先级,但可以改变调用本函数的任务或者其它任务的优先级。为了改变调用本函数的任务的优先级,可以指定该任务当前的优先级或OS_PRIO_SELF,OSTaskChangePrio()会决定该任务的优先级。用户还必须指定任务的新优先级。因为C/OS-不允许多个任务具有相同的优先级,所以OSTaskChangePrio()需要检验新优先级是否是合法的。有时候将任务挂起是很有用的。挂起任务可通过调用 OSTaskSuspend()函数来完成。被挂起的任务只能通过调用 OSTaskResume()函数来恢复。任务挂起是一个附加功能。也就是说,如果任务在被挂起的同时也在等待延时的期满,那么,挂起操作需要被取消,而任务继续等待延时期满,并转入就绪状态。任务可以挂起自己或者其它任务。2.3 时间管理任何操作系统都需要提供一个周期性的信号源,以提供系统处理诸如延时、超时等与时间有关的事件,这个周期性的信号源叫做时钟。C/OS-使用硬件定时器产生一个周期为毫秒级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间的间隔时间,叫做时钟节拍(Time Tick)。由于嵌入式系统的任务是一个无限循环,并且C/OS-还是一个抢占式内核,所以为了使高优先级别的任务不至于独占CPU,可以给其他优先级别较低的任务获得CPU使用的机会,C/OS-提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。实现这个系统服务的函数叫做OSTimeDly()。调用该函数会使C/OS-进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。为了能使用更为习惯的方法来使任务延时,C/OS-还提供了一个可以用时、分、秒为参数的任务延时函数OSTimeDlyHMSM()。同时,系统定义了一个INT32U类型的全局变量OSTime来记录系统的发生的时钟节拍数。OSTime在应用程序调用OSStart()时被初始化为0,以后每个时钟节拍,OSTime的值就加1。在应用程序中,可以调用函数OSTimeGet()来获取OSTime的值,并调用函数OSTimeSet()来设置OSTime的值。2.4 任务的同步与通信在C/OS-中,有多种方法可以保护任务之间的共享数据和提供任务之间的通讯。一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断。当两个任务或者一个任务和一个中断服务子程序共享某些数据时,可以采用这种方法。二是利用函数OSSchedLock()和OSSchedUnlock()对C/OS-II中的任务调度函数上锁和开锁。用这种方法也可以实现数据的共享。另外,在C/OS-II中,使用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务之间的通信。为了把描述事件的数据结构统一起来,C/OS-II使用左脚事件控制块ECB的数据结构来描述诸如信号量、邮箱(消息邮箱)和消息队列这些事件。事件控制块中包含包括等待任务表在内的所有有关事件的数据,如信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组以及等待任务表。图2 事件控制块的使用图2表示任务和中断服务子程序之间是如何进行通讯的。一个任务或者中断服务子程序可以通过事件控制块ECB(Event Control Blocks)来向另外的任务发信号。这里,所有的信号都被看成是事件(Event)。这也说明为什么上面把用于通讯的数据结构叫做事件控制块。一个任务还可以等待另一个任务或中断服务子程序给它发送信号。只有任务可以等待事件发生,中断服务子程序是不能这样做的。对于处于等待状态的任务,还可以给它指定一个最长等待时间,以此来防止因为等待的事件没有发生而无限期地等下去。多个任务可以同时等待同一个事件的发生。在这种情况下,当该事件发生后,所有等待该事件的任务中,优

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论