《嵌入式实时操作系统》.doc_第1页
《嵌入式实时操作系统》.doc_第2页
《嵌入式实时操作系统》.doc_第3页
《嵌入式实时操作系统》.doc_第4页
《嵌入式实时操作系统》.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式实时操作系统课程大作业专业计算机科学与技术学生姓名 班级学号任课教师 孟 海 涛完成日期2016年1月14日目录一、 背景2二、 嵌入式实时操作系统概述22.1嵌入式操作系统22.2嵌入式实时操作系统22.3嵌入式实时操作系统 C/OS-II3三、C/OS-II中的任务43.1C/OS-II中任务控制块43.2任务的创建53.3、 任务挂起53.4、 任务删除53.5、任务恢复63.6、任务调度63.7、任务的同步与通信63.7.1任务的同步与事件63.7.2消息邮箱63.7.3消息队列7四、C/OS-II的中断与时钟7五、C/OS-II的移植85.1系统内核85.2与处理器相关的部分85.3与应用相关的代码95.4用户应用系统10六、结论10一、 背景随着计算机技术的迅速发展和芯片制造工艺的不断进步,嵌入式系统的应用日益广泛:从民用的电视、手机等电路设备到军用的飞机、坦克等武器系统,到处都有嵌入式系统的身影。在嵌入式系统的应用开发中,采和嵌入式实时操作系统(简称RTOS)能够支持多任务,使得程序开发更加容易,便于维护,同时能够提高系统的稳定性和可靠性。这已逐渐成为嵌入式系统开发的一个发展方向。2、 嵌入式实时操作系统概述2.1嵌入式操作系统嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件。它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器Browser等。嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、标准设备驱动程序以及工具集等。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。2.2嵌入式实时操作系统嵌入式实时操作系统(Embedded Real-time Operation System,RTOS)。嵌入式系统是用于控制、监视或者辅助操作机器和设备的装置嵌入式实时操作系统有很多,如VxWorks、PalmOS、WindowsCE等。这些操作系统均属于商品化产品,价格昂贵且由于源泉代码不公开导致了诸如对设备的支持、应用软件的移植等一系列的问题;而开放源码的RTOS在成本和技术上有其特有的优势,在RTOS领域占有越来越重要的地位,本书介绍C/OS-II源码公开的实时操作系统,通过对它们各自的特点和性能进行分析和比较,给出相关的数据,为选择一种合适的RTOS提供参考。2.3嵌入式实时操作系统 C/OS-II C/OS-II的前射是C/OS,最早出自于1992年美国嵌入式系统专家Jean J.Labrosse在嵌入式系统编程杂志的5月和6月刊上刊登的文章连载,并把C/OS的源码发布在该杂志的BBS上。当时就有500多人下载了这份源码。世界上数以千计的工程技术人员将C/OS应用到了各个领域,如照相机业、发动机控制、网络接入设备、高速公路电话系统、ATM机和工业机器人等。1998年,作者决定出版C/OS的第二本书C/OS-II The Real Time Kernel,并设立了正式的网站:www. C/OS-II.com,给C/OS-II增加了一些新的功能,并且增加了约200页的解释。C/OS和C/OS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将C/OS嵌入到开发的产品中。C/OS具有执行效率高、占用空间小、实时性能优良和可扩展性能等特点,最小内核可编译至2KB。C/OS-II已经移植到了几乎所有知名的CPU上。首先要了解任务的概念。任务其实就是一个线程,或者更通俗点说就是一个函数和与之相关联的一些数据结构构成的一个实体。三、C/OS-II中的任务C/OS-II中任务包含三个部分:1、 任务控制块:保存了任务的属性;2、任务堆栈:保存了任务的工作环境;3、任务程序代码:任务的执行部分。3.1C/OS-II中任务控制块空任务链表因为此链表中这些控制块还没有与具体任务相关联,所以叫做空任务链表。大小为C/OS-II.H中定义的OS_MAX_TASKS + OS_N_SYS_TASKS(即用户任务最大数+系统任务总数)个。其初始化由系统初始化函数OSInit()完成。其头指针为OSTCBFreeList,其为一个OS_TCB类型的数组。即OS_TCB OSTCBTblOS_MAX_TASKS + OS_N_SYS_TASKS。任务链表每当应用程序调用系统函数OSTaskCreate()或OSTaskCreateExt()创建一个任务的时候,系统就会将空任务链表头指针OSTCBFreeList 指向的任务控制块分配给该任务。在给任务控制块中的成员赋值后,就将其加入OSTCBList所指向的任务控制链表中,于是,就出现了任务链表。在任务链表中,系统任务(如空闲任务、统计任务)都存放在其优先级最低的地方,其中空闲任务的优先级最低,统计任务(如果有的话)的优先级次低。任务控制块访问优化:为了加快对任务控制块的访问速度,任务链表为双向链表。同时,设置了一个OS_TCB*类型的指针数组OS_TCBPrioTbl。其中以任务的优先级为顺序在各数组元素中存放指向该任务控制块的指针。同样,为了能随时访问正在运行任务的任务控制块,还定义了一个OS_TCB*类型的OSTCBCur,专门用于存放当前正在运行的任务的任务控制块的指针。3.2任务的创建 创建任务实际上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务,并使刚刚创建的任务进入就绪状态,并接着引发一次任务调度。(注:区分任务其实就是其优先级,所以任务可以同名,但是优先级必须是唯一的)。OSTaskCreate()创建任务的过程:首先先判断其优先级是否合法,如果合法的话,那么接着调用OSTaskStkInit()和OSTCBInit()对其任务堆栈和任务控制块进行初始化,初始化成功后,将任务计数器OSTaskCtr+1,若ucos-II的核处于运行状态(即OSRunning =1),则接着引发一次任务调度。在调用启动函数OSStart()之前,必须先创建一个任务,并赋予它罪该优先级别,使其成为起始任务,然后在这个起始任务中,再创建其他任务。(下面是一个程序清单的演示)。3.3、 任务挂起OSTaskSuspend()挂起任务的过程:首先判断待挂起的任务是否调用了这个函数的任务本身,如果是任务本身,则必须删除任务在任务就绪表中的就绪标志,并在任务控制块成员OSTCBStat中做挂起记录,然后引发一次任务调度。如果待挂起的任务不是调用函数的任务本身,而是其他任务,那么只要删除任务就绪表中北挂起任务的就绪标志,并在其任务控制块成员OSTCBStat中作挂起记录就行了。3.4、 任务删除 OSTaskDel()删除任务的过程:把被删除的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表,然后在任务就绪表中将该任务的就绪状态置0。(注:可以通过该函数来删除任务自身或者除了空闲任务之外的其他任务)。3.5、任务恢复 OSTaskResume()恢复任务的过程:首先判断其是否是已挂起的任务,并且同时又不是一个等待任务,如果符合条件,则清楚其OSTCBStat中的挂起记录并使该任务就绪,再接着进行一次任务调度。3.6、任务调度任务调度是靠任务调度器完成的,C/OS-II中有两种任务调度器,一种是任务级的调度器(OSSched()),另一种是中断级的任务调度器(OSIntExt()),这里只将任务级的任务调度器。3.7、任务的同步与通信3.7.1任务的同步与事件多任务合作过程中的,操作系统应解决两个问题:一是各任务之间应具有一种互斥关系,即对于某个共享资源的共享,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源以后,等待的任务之一才能使用它;二是相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知或建立了某个条件后才能继续执行,否则只能等待。任务之间的这种制约性的合作运行机制叫做任务间的同步。事件:通信就要依赖中间媒介。在C/OS-II中,使用信号量,邮箱(消息邮箱)和消息队列这些数据结构来作为中间媒介。把信息发送到事件上的操作叫做发送事件,读取事件的操作叫做请求事件,或者叫做等待事件。3.7.2消息邮箱在多任务操作系统中,常常需要通过传递一个数据(这种数据叫做消息)的方式来进行任务之间的通信。为了达到这个目的,可以在内存中创建一个存储空间作为该数据的缓冲区。如果把这个缓冲区叫做消息缓冲区,那么在任务间传递数据(消息)的一个最简单的方法就是传递消息缓冲区。于是,用来传递消息缓冲区指针的数据结构(事件)就叫做消息邮箱。 3.7.3消息队列上面的消息邮箱不仅可用来传递一个消息,而且也可以定义一个指针数组。让数组的每个元素都存放一个消息缓冲区指针,那么任务就可以通过传递这个指针数组指针的方法来传递多个消息了。这种可以传递多个消息的数据结构叫做消息队列。四、C/OS-II的中断与时钟 中断服务函数(ISR)是应中断请求而运行的程序。中断向量就是中断服务函数(ISR)的入口地址,即存储中断服务函数的内存地址的首单元。在C/OS-II中,如果任务在运行中,系统接收到中断请求,并且这时中断响应是打开的,那么系统就会中止正在运行的程序,再按照中断向量的指向转而去执行中断服务程序。中断程序运行完后,系统会引发一次系统调度(OSIntExt()),转而去执行当前优先级别最高的就绪任(不一定是接着运行被中断的任务)。中断服务函数本身也能被其他更高优先级的中断源发出的中断请求中断,这叫做中断嵌套。C/OS-II中定义了一个用于记录中断嵌套层数的全局变量OSIntNesting。每当响应一个中断请求的时候,OSIntNesting+1。C/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为毫秒(ms)级的周期性中断来实现系统时钟。最小的时钟单位就是两次中断之间的间隔的时间,这个最小时钟单位叫做时钟节拍。硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫_OSTickISR()(在文件OS_CPU_A.ASM中用汇编编写)。中断服务程序通过调用函数OSTimeTick()来完成系统在每个时钟节拍需要完成的工作。 C/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。C/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。五、C/OS-II的移植5.1系统内核实时操作系统对系统资源进行管理。主要包括系统时钟、任务分配调度、异常处理、内存管理、消息机制等。系统内核与移植过程是无关的,用户只需要在应用系统开发过程中,通过配置OCS_CFG.H文件来对内核进行裁剪,只使用应用系统需要的功能,使系统最小最优化。5.2与处理器相关的部分嵌入式系统移植的最关键部分,关系着将硬件和系统内核的结合,是界于两者之间的一个中间层,因硬件环境不同此部分的代码也不同。具体需要修改的代码有:OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C1)OS_CPU.H包括用#define定义的与处理器相关的常量、宏和类型定义.具体来讲有系统数据类型定义,栈增长方向定义,关中断和开中断定义,系统软中断的定义等等。2)OS_CPU_A.ASMvar script = document.createElement(script); script.src = /resource/baichuan/ns.js; document.body.appendChild(script); 这部分需要对处理器的寄存器进行操作。包括四个子函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR(). OSStartHighRdy()由多任务系统启动函数OSStart()中调用.完成的功能是:设置系统运行标志位OSRunning=TRUE;将就绪表中最高优先级任务的栈指针Load到SP中,并强制中断返回.使就绪的最高优先级任务调整至运行态一样,使得整个系统得以运转.OSCtxSw()在任务级任务切换函数中调用的.任务级切换是通过SWI或者TRAP人为制造的中断来实现的.ISR的向量地址必须指向OSCtxSw().这一中断完成的功能:保存任务的环境变量(主要是寄存器的值,通过入栈来实现),将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了任务级的切换.OSIntCtxSw()在退出中断服务函数OSIntExit()中调用,实现中断级任务切换.由于是在中断里调用,所以处理器的寄存器入栈工作已经做完,就不用作这部分工作了.具体完成的任务:调整栈指针(因为调用函数会使任务栈结构与系统任务切换时堆栈标准结构不一致),保存当前任务SP,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了中断级任务切换.OSTickISR()系统时钟节拍中断服务函数,这是一个周期性中断,为内核提供时钟节拍.频率越高系统负荷越重.其周期的大小决定了内核所能给应用系统提供的最小时间间隔服务.一般只限于ms级(跟MCU有关),对于要求更加苛刻的任务需要用户自己建立中断来解决.该函数具体内容:保存寄存器(如果硬件自动完成就可以省略),调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),恢复寄存器,中断返回.3)OS_CPU_C.CUC/OS中共定义了6个函数在该文件中.但是最重要的是OSTaskStkInit().其他都是对系统内核的扩展时用的.OSTaskStkInit()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化.使建立好的进入就绪态任务的堆栈与系统发生中断并且将环境变量保存完毕时的栈结构一致.这样就可以用中断返回指令使就绪的任务运行起来.具体的入栈方式要根据不同mcu而定.需要参考用户使用

温馨提示

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

评论

0/150

提交评论