您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > ARM体系结构与编程-第六章
11.μC/OSII基础2.μC/OSII移植3.嵌入式系统的初始化操作第六章μC/OSII程序设计基础2RTOS在嵌入式系统中的位置嵌入式硬件平台BSPKERNELFSTCP/IP设备驱动设备I/O调试工具其它组件应用RTOSC/C++3C/OS简介1、C/OS——MicroControllerOS,微控制器操作系统2、C/OS简介–美国人JeanLabrosse1992年完成–应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等–1998年C/OS-II,目前的版本C/OS-IIV2.61,2.72–2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中–网站:www.micrium.com4•μC/OS-II意为“微控制器操作系统版本2”。世界上已有数千人在各个领域使用μC/OS,例如,照相机行业、医疗器械、音响设施、发动机控制、网络设备、高速公路电话系统、自动提款机、工业机器人等等。很多高等院校将μC/OS用于实时系统教学。5µC/OS-II图籍•描述了µC/OS-II内部的工作原理•随书的CD中包含了源代码–工业界最清晰的源代码•除英文版外,有中文和韩文版ChineseKoreanEnglishISBN1-57820-103-9美国CMPBOOKISBN7-81077-290-2北京航空航天大学出版社ISBN89-951540-5-56µC/OS-II的各种商业应用•全世界有数百种产品在应用:–Avionics(航空电子设备)–Medical–Cellphones–Routersandswitches–High-endaudioequipment–Washingmachinesanddryers–UPS(uninterruptiblePowerSupplies)–Industrialcontrollers–GPSNavigationSystems–MicrowaveRadios–Instrumentation–Point-of-saleterminals–更多7•µC/OS-Ⅱ是一个免费的、源代码公开的实时嵌入式内核,其内核提供了实时系统所需要的一些基本功能。其中包含全部功能的核心部分代码占用8.3KB,全部的源代码约5500行,结构合理、清晰易懂,且注解详尽,非常适合初学者进行学习分析。µC/OS-Ⅱ不仅使用户得到廉价的解决方案,而且由于µC/OS-Ⅱ的开放源代码特性,还使用户可针对自己的硬件优化代码,获得更好的性能。•µC/OS-Ⅱ是在PC机上开发的,C编辑器使用的是BorlandC/C++3.1版。从早期使用的µCOS到现在的µC/OS-ⅡV2.52版,应用的实例也进一步说明了该内核的实用性和可靠性。6.1C/OS-II系统的特点及结构86.1.1µC/OS-Ⅱ系统的特点1.有源代码,µC/OS-Ⅱ源代码是开放的,用户可登录µC/OS-Ⅱ的网站(www.micrium.com)下载针对不同微处理器的移植代码。这极大地方便了实时嵌入式系统µC/OS-Ⅱ的开发,降低了开发成本。2.可移植(Portable),µC/OS-Ⅱ的源代码中,除了与微处理器硬件相关的部分是使用汇编语言编写的,其绝大部分是使用移植性很强的ANSIC来编写的。并且把用汇编语言编写的部分已经压缩到最低的限度,以使µC/OS-Ⅱ更方便于移植到其他微处理器上使用。如Intel公司、Zilog公司、Motorola公司的微控制器和TI公司的DSP,以及包括ARM公司、AnalogDevice公司、三菱公司、日立公司、飞利浦公司和西门子公司的各种微处理器。93.可固化(ROMable),µC/OS-Ⅱ是为嵌入式应用而设计的操作系统,只要具备有合适的软硬件工具,就可将µC/OS-Ⅱ嵌入到产品中去,从而成为产品的一部分。4.可裁剪(Scalable),µC/OS-Ⅱ可根据实际用户的应用需要使用条件编译来完成对操作系统的裁剪,这样就可以减少µC/OS-Ⅱ对代码空间和数据空间的占用。5.可剥夺型(Preemptive),µC/OS-Ⅱ是完全可剥夺型的实时内核,运行就绪条件下优先级最高的任务。6.多任务,µC/OS-Ⅱ可管理64个任务。一般情况下,建议用户保留8个任务给µC/OS-Ⅱ。这样,留给用户应用程序的任务最多可有56个。系统赋给每个任务的优先级必须不同,这意味着µC/OS-Ⅱ不支持时间片轮转调度法(Round-robinScheduling)。7.可确定性,绝大多数µC/OS-Ⅱ的函数调用和服务的执行时间具有确定性。在任何时候用户都能知道µC/OS-Ⅱ的函数调用与服务的执行时间。108.任务栈,µC/OS-Ⅱ的每个任务都有自己单独的栈和栈空间。使用µC/OS-Ⅱ的栈空间校验函数可确定每个任务到底需要多少栈空间。9.系统服务,提供了例如信号量、互斥信号量、消息邮箱、事件标志、数据队列、块大小固定的内存的申请与释放及时间管理函数等。10.中断管理,中断可使正在执行的任务暂时挂起,如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行。中断嵌套层数可达255层。11.稳定性与可靠性,2000年7月,µC/OS-Ⅱ在一个航空项目中得到了美国联邦航空管理局对商用飞机的符合RTCADO--178B标准的认证。可以说,µC/OS-Ⅱ的每一种功能、每一个函数及每一行代码都经过了考验与测试。116.1.2µC/OS-Ⅱ系统的内核结构与其他操作系统不同,µC/OS-Ⅱ其实只有一个内核,提供任务调度、任务间的通信与同步、任务管理、时间管理和内存管理等基本功能。1)任务在µC/OS-Ⅱ中,一个任务通常是一个无限的循环。一个任务看起来像其他c语言的函数一样,有函数返回类型,有形式参数变量,但任务是决不会返回的。故返回参数必须定义成void,例如:VoidYoμrTask(void*pdata){for(;;){/*用户代码*//*调用µC/OS-II的某种系统服务:*//*用户代码*/}}122)任务调度µC/OS-II可以管理多达64个任务,其优先级可以从0开始,优先级号越低,其任务的优先级就越高。但目前版本的µC/OS-II有两个任务已经被系统占用了,而且保留了优先级0、1、2、3、和OS_LOWEST_PRIO-3、OS_LOWEST__PRIO-2、0S_LOWEST_PRIO-1以及OS_LOWEST_PRIO这8个任务已备将来使用。OS_LOWEST_PRIO是作为常数在OS_CFG.H文件中用定义常数语句#defineconstant来定义的。因此用户可以使用多达56个应用任务,但首先要给每个任务赋以不同的优先级。µC/OS-II总是运行进入就绪态的优先级最高的任务。目前版本的µC/OS-II中,任务的优先级号就是任务编号(ID)。优先级号(或任务的ID号)也可以被一些内核服务函数调用,比如改变优先级函数OSTaskChangePrio()或者OSTaskDel()。为了使µC/OS-II能管理用户任务,用户必须在建立一个任务的时候,将任务的起始地址与其他参数一起传给OSTaskCreate()或者OSTaskCreateExt()这两个函数中的任何一个函数。13•在任一给定的时刻,任务的状态一定是以下五种状态之一:–睡眠态(taskdormant)–就绪态(taskready)–运行态(taskrunning)–等待状态(taskwaiting)–中断服务态(ISRrunning)μC/OSII的五种状态14睡眠态(taskdormant)•指任务驻留在程序空间(ROM或RAM),还没有交给系统来管理的状态•任务交给系统通过调用以下函数之一来实现:–OSTaskCreate()–OSTaskCreateExt()•告知系统:–任务的起始地址–任务建立时,用户给任务赋予的优先级–任务要使用的栈空间大小等15就绪态(taskready)•任务一旦创建就进入就绪态,准备运行•任务的创建可以是在多任务开始之前,也可以动态地由一个运行着的任务创建•若刚创建任务的优先级高于创建它的任务的优先级,它将立即获得cpu的使用权•任务可通过OSTaskDel()返回睡眠态;或调用该函数让另一个任务进入睡眠态16运行态(taskrμnning)•就绪的任务只有当所有优先级高于它的任务都转为等待状态,或被删除后,才能进入运行态•任何时刻只有一个任务处于运行态•调用OSStart()可以启动多任务。该函数只能在启动时调用一次•OSStart()运行用户初始化代码中已经建立的、进入就绪态的优先级最高的任务17等待状态(taskwaiting)•正在运行的任务可以通过下面的调用进入等待状态。延迟时间到,立即强制执行任务切换,让下一个优先级最高、并进入就绪态的任务执行。–OSTimeDly()–OSTimeDlyHMSM()•等待时间过去后,系统服务(内部)函数OSTimeTick()使延迟了的任务进入就绪态•用户无需在应用程序代码中调用这个函数18等待状态(续)•正在运行的任务可能需要通过调用函数等待某一事件发生。如果该事件并未发生,任务就进入等待状态–OSFlagPend();OSMμtexPend()–OSSemPend();OSMboxPend()•当事件发生或等待超时,被挂起的任务就进入就绪态19中断服务态(ISRrunning)•正在执行的任务是可以被中断的,除非该任务将中断关闭,或系统将中断关闭。被中断的任务便进入了中断服务态•响应中断后,正在运行的任务被挂起,中断服务子程序控制了CPu的使用权20中断服务态(ISRrunning)•中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态•上述情况下,从中断服务子程序返回之前,C/OS–II要判定:–被中断的任务是否还是就绪态任务中优先级最高的–如果中断服务子程序使另一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行;否则,原来被中断了的任务将继续运行。21任务状态•当所有的任务都在等待时间发生或等待延迟时间结束时,C/OS–II执行被称为空闲任务(IdleTask)的内部函数,即:OSTaskIdle()22任务的CPU使用权被剥夺中断236.1.3主要模块介绍1.内存管理在ANSIC中,一般采用内存分配函数malloc()和内存释放函数free()两个函数动态地分配和释放内存。为了消除多次动态分配与释放内存所引起的内存碎片和分配、释放函数执行时间的不确定性的现象,µC/OS-Ⅱ把连续的大块内存按分区来进行管理。每个分区中都包含若干个存储容量大小相同的内存块,但不同分区之间的内存块容量大小是可以不同的。在需要动态分配内存时,可选择一个适当的分区,按块来分配内存。在释放内存时,将该块放回它以前所属的分区。这样,就能有效解决内存碎片问题。而且每次调用malloc()和free()分配和释放的都是整数倍的固定内存块长,这样执行时间就是确定的了。24(1)内存管理控制块OS_MEM为便于内存的管理,µC/OS-II中使用内存控制块(MemoryControlBlocks)的数据结构跟踪每一个内存分区系统,每个分区都有属于自己的内存控制块,系统是通过内存控制块数据结构OS_MEM来管理内存的。(2)内存管理内存管理主要通过以下4个函数来实现:①OSMemCreate()函数,用于建立一个内存分区。该函数共有4个参数:内存分区的起始地址、分区内的内存块数、每个内存块的字节数和一个指向错误信息代码的指针。②OSMemGet()函数,用于分配一个内存块。当调度某任务执行时,必须先从已建立的内存分区中为该任务申请一个内存块。③OSMemPut()函数,释放一个内存块。当某一任务不再使用一个内存块时,必须及时地把它放回到相应的内存分区中,以便下一次的分配操作。④OSMemQuery()函数,用于查询一个特定内存分区的状态。如查询某内存分区中内存块的大小、可用内存块数和正在使用的内存块数等信息
本文标题:ARM体系结构与编程-第六章
链接地址:https://www.777doc.com/doc-23640 .html