ARM体系结构与编程-第六章_第1页
ARM体系结构与编程-第六章_第2页
ARM体系结构与编程-第六章_第3页
ARM体系结构与编程-第六章_第4页
ARM体系结构与编程-第六章_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、1.C/OS II基础2.C/OS II移植3.嵌入式系统的初始化操作第六章 C/OS II程序设计基础RTOS在嵌入入式系统统中的位位置嵌入式硬硬件平台台BSPKERNELFSTCP/IP设备驱动动设备I/O调试工具具其它组件件应用RTOSC/C+C/OS简介C/OS-II意为为“微控控制器操操作系统统版本2”。世世界上已已有数千千人在各各个领域域使用C/OS,例例如,照照相机行行业、医医疗器械械、音响响设施、发动机机控制、网络设设备、高高速公路路电话系系统、自自动提款款机、工工业机器器人等等等。很多多高等院院校将C/OS用于于实时系系统教学学。C/OS-II图籍描述了C/OS-II内部部的

2、工作作原理随书的CD中包包含了源源代码工业界最最清晰的的源代码码除英文版版外,有有中文和和韩文版版ChineseKoreanEnglishISBN 1-57820-103-9美国CMPBOOKISBN 7-81077-290-2北京航空空航天大大学出版版社ISBN 89-951540-5-5C/OS-II的各各种商业业应用全世界有有数百种种产品在在应用:Avionics(航空电电子设备备)MedicalCell phonesRouters andswitchesHigh-endaudioequipmentWashing machines anddryersUPS(uninterruptible

3、 Power Supplies)Industrial controllersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-sale terminals更多COS-是一个个免费的的、源代代码公开开的实时时嵌入式式内核,其内核核提供了了实时系系统所需需要的一一些基本本功能。其中包包含全部部功能的的核心部部分代码码占用8.3KB,全部的的源代码码约5500行行,结构构合理、清晰易易懂,且且注解详详尽,非非常适合合初学者者进行学学习分析析。COS-不不仅使用用户得到到廉价的的解决方方案,而而且由于于COS-的开开放源代代码特性性,

4、还使使用户可可针对自自己的硬硬件优化化代码,获得更更好的性性能。COS-是在PC机上上开发的的,C编编辑器使使用的是是BorlandC/C+3.1版。从早期期使用的的COS到现现在的COS- V2.52版,应应用的实实例也进进一步说说明了该该内核的的实用性性和可靠靠性。6.1C/OS-II系统的的特点及及结构6.1.1COS-系统的的特点3可固固化(ROMable),COS-是为嵌嵌入式应应用而设设计的操操作系统统,只要要具备有有合适的的软硬件件工具,就可将将COS-嵌入入到产品品中去,从而成成为产品品的一部部分。4可裁裁剪(Scalable),COS-可根根据实际际用户的的应用需需要使用用条

5、件编编译来完完成对操操作系统统的裁剪剪,这样样就可以以减少COS-对代码码空间和和数据空空间的占占用。5可剥剥夺型(Preemptive),COS-是完完全可剥剥夺型的的实时内内核,运运行就绪绪条件下下优先级级最高的的任务。6多任任务,COS-可管理理64个个任务。一般情情况下,建议用用户保留留8个任任务给COS-。这样样,留给给用户应应用程序序的任务务最多可可有56个。系统统赋给每每个任务务的优先先级必须须不同,这意味味着COS-不不支持时时间片轮轮转调度度法(Round-robinScheduling)。7可确确定性,绝大多多数COS-的的函数调调用和服服务的执执行时间间具有确确定性。在任

6、何何时候用用户都能能知道COS-的函数数调用与与服务的的执行时时间。8任务务栈,COS-的每个个任务都都有自己己单独的的栈和栈栈空间。使用COS-的栈空空间校验验函数可可确定每每个任务务到底需需要多少少栈空间间。9系统统服务,提供了了例如信信号量、互斥信信号量、消息邮邮箱、事事件标志志、数据据队列、块大小小固定的的内存的的申请与与释放及及时间管管理函数数等。10中中断管理理,中断断可使正正在执行行的任务务暂时挂挂起,如如果优先先级更高高的任务务被中断断唤醒,则高优优先级的的任务在在中断嵌嵌套全部部退出后后立即执执行。中中断嵌套套层数可可达255层。11稳稳定性与与可靠性性,2000年年7月,C

7、OS-在一一个航空空项目中中得到了了美国联联邦航空空管理局局对商用用飞机的的符合RTCA DO-178B标准的的认证。可以说说,COS-的的每一种种功能、每一个个函数及及每一行行代码都都经过了了考验与与测试。6.1.2COS-系统的的内核结结构与其他操操作系统统不同,COS-其实实只有一一个内核核,提供供任务调调度、任任务间的的通信与与同步、任务管管理、时时间管理理和内存存管理等等基本功功能。1)任任务在COS-中,一个任任务通常常是一个个无限的的循环。一个任任务看起起来像其其他c语语言的函函数一样样,有函函数返回回类型,有形式式参数变变量,但但任务是是决不会会返回的的。故返返回参数数必须定定

8、义成void,例如如:Void YorTask(void*pdata)for(;)*用户户代码*调用用COS-II的的某种系系统服务务:*用户户代码*2)任任务调度度COS-II可以管管理多达达64个个任务,其优先先级可以以从0开开始,优优先级号号越低,其任务务的优先先级就越越高。但但目前版版本的COS-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_C

9、FG.H文件件中用定定义常数数语句#define constant来定义义的。因因此用户户可以使使用多达达56个应用任任务,但但首先要要给每个个任务赋赋以不同同的优先先级。COS-II总是是运行进进入就绪绪态的优优先级最最高的任任务。目目前版本本的COS-II中,任任务的优优先级号号就是任任务编号号(ID)。优优先级号号(或任任务的ID号)也可以以被一些些内核服服务函数数调用,比如改改变优先先级函数数OSTaskChangePrio()或者OSTaskDel()。为了使COS-II能管管理用户户任务,用户必必须在建建立一个个任务的的时候,将任务务的起始始地址与与其他参参数一起起传给OSTask

10、Create()或者者OSTaskCreateExt()这这两个函函数中的的任何一一个函数数。在任一给给定的时时刻,任任务的状状态一定定是以下下五种状状态之一一:睡眠态(taskdormant)就绪态(taskready)运行态(taskrunning)等待状态态(taskwaiting)中断服务务态(ISRrunning)C/OSII的的五种状状态睡眠态(taskdormant)指任务驻驻留在程程序空间间(ROM或RAM),还没没有交给给系统来来管理的的状态任务交给给系统通通过调用用以下函函数之一一来实现现:OSTaskCreate()OSTaskCreateExt()告知系统统:任务的起起

11、始地址址任务建立立时,用用户给任任务赋予予的优先先级任务要使使用的栈栈空间大大小等就绪态(taskready)任务一旦旦创建就就进入就就绪态,准备运运行任务的创创建可以以是在多多任务开开始之前前,也可可以动态态地由一一个运行行着的任任务创建建若刚创建建任务的的优先级级高于创创建它的的任务的的优先级级,它将将立即获获得cpu的使使用权任务可通通过OSTaskDel()返回睡睡眠态;或调用用该函数数让另一一个任务务进入睡睡眠态运行态(taskrnning)就绪的任任务只有有当所有有优先级级高于它它的任务务都转为为等待状状态,或或被删除除后,才才能进入入运行态态任何时刻刻只有一一个任务务处于运运行态

12、调用OSStart()可以以启动多多任务。该函数数只能在在启动时时调用一一次OSStart()运运行用户户初始化化代码中中已经建建立的、进入就就绪态的的优先级级最高的的任务等待状态态(taskwaiting)正在运行行的任务务可以通通过下面面的调用用进入等等待状态态。延迟迟时间到到,立即即强制执执行任务务切换,让下一一个优先先级最高高、并进进入就绪绪态的任任务执行行。OSTimeDly()OSTimeDlyHMSM()等待时间间过去后后,系统统服务(内部)函数OSTimeTick()使使延迟了了的任务务进入就就绪态用户无需需在应用用程序代代码中调调用这个个函数等待状态态(续)正在运行行的任务务

13、可能需需要通过过调用函函数等待待某一事事件发生生。如果果该事件件并未发发生,任任务就进进入等待待状态OSFlagPend();OSMtexPend()OSSemPend();OSMboxPend()当事件发发生或等等待超时时,被挂挂起的任任务就进进入就绪绪态中断服务务态(ISRrunning)正在执行行的任务务是可以以被中断断的,除非该该任务将将中断关关闭,或或系统将将中断关关闭。被被中断的的任务便便进入了了中断服服务态响应中断断后,正正在运行行的任务务被挂起起,中断断服务子子程序控控制了CPu的的使用权权中断服务务态(ISRrunning)中断服务务子程序序可能会会报告一一个或多多个事件件的

14、发生生,而使使一个或或多个任任务进入入就绪态态上述情况况下,从从中断服服务子程程序返回回之前,C/OSII要判定:被中断的的任务是是否还是是就绪态态任务中中优先级级最高的的如果中断断服务子子程序使使另一个个优先级级更高的的任务进进入了就就绪态,则新进进入就绪绪态的这这个优先先级更高高的任务务将得以以运行;否则,原来被被中断了了的任务务将继续续运行。任务状态态当所有的的任务都都在等待待时间发发生或等等待延迟迟时间结结束时,C/OSII执执行被被称为空空闲任务务(IdleTask)的的内部函函数,即即:OSTaskIdle()任务的CPU使使用权被被剥夺中断6.1.3主主要模块块介绍1内存存管理在

15、ANSIC中,一一般采用用内存分分配函数数malloc()和和内存释释放函数数free()两个函函数动态态地分配配和释放放内存。为了消消除多次次动态分分配与释释放内存存所引起起的内存存碎片和和分配、释放函函数执行行时间的的不确定定性的现现象,COS-把连续续的大块块内存按按分区来来进行管管理。每每个分区区中都包包含若干干个存储储容量大大小相同同的内存存块,但但不同分分区之间间的内存存块容量量大小是是可以不不同的。在需要要动态分分配内存存时,可可选择一一个适当当的分区区,按块块来分配配内存。在释放放内存时时,将该该块放回回它以前前所属的的分区。这样,就能有有效解决决内存碎碎片问题题。而且且每次调

16、调用malloc()和free()分配配和释放放的都是是整数倍倍的固定定内存块块长,这这样执行行时间就就是确定定的了。(1)内内存管理理控制块块OS_MEM为便于内内存的管管理,COS-II中使使用内存存控制块块(MemoryControl Blocks)的的数据结结构跟踪踪每一个个内存分分区系统统,每个个分区都都有属于于自己的的内存控控制块,系统是是通过内内存控制制块数据据结构OS_MEM来来管理内内存的。(2)内内存管理理内存管理理主要通通过以下下4个函函数来实实现:OSMemCreate()函数数,用于于建立一一个内存存分区。该函数数共有4个参数数:内存存分区的的起始地地址、分分区内的的

17、内存块块数、每每个内存存块的字字节数和和一个指指向错误误信息代代码的指指针。OSMemGet()函数数,用于于分配一一个内存存块。当当调度某某任务执执行时,必须先先从已建建立的内内存分区区中为该该任务申申请一个个内存块块。OSMemPut()函数数,释放放一个内内存块。当某一一任务不不再使用用一个内内存块时时,必须须及时地地把它放放回到相相应的内内存分区区中,以以便下一一次的分分配操作作。OSMemQuery()函数,用于查查询一个个特定内内存分区区的状态态。如查查询某内内存分区区中内存存块的大大小、可可用内存存块数和和正在使使用的内内存块数数等信息息。(3)时时间管理理与大部分分内核一一样,

18、COS-要求提提供定时时中断,以实现现延时与与超时控控制等功功能。这这个定时时中断也也可以被被叫作为为时钟节节拍。时时钟节拍拍函数的的作用是是用于通通知COS-发发生了时时钟节拍拍中断,下面再再介绍几几个可以以处理时时间问题题的函数数。任务延延时函数数OSTimeDIy()调用该函函数会使使COS-进行行一次任任务调度度,并且且执行下下一个优优先级最最高的就就绪态任任务。任任务调用用OSTimeDly()后后,一旦旦规定的的时间期期满或者者有其他他任务通通过调用用OSTimeDlyResume()取取消了延延时,它它就会立立即进入入就绪状状态。只只有当该该任务在在所有就就绪任务务中具有有最高的

19、的优先级级时,它它才会立立即运行行。恢复延延时的任任务函数数OSTimeDlyResume()COS-II具有有允许结结束正处处于延时时期的任任务的功功能。具具体方法法是通过过调用OSTimeDlyResume()和指指定要恢恢复的任任务的优优先级的的方式,这样延延时的任任务就可可以不用用等待延延时期满满,而是是通过其其他任务务取消延延时来使使自己处处于就绪绪态。实实际上,OSTimeDlyResume()也也可唤醒醒正在等等待事件件的任务务。按时、分、秒秒、毫秒秒延时函函数OSTimeDlyHMSM()OSTimeDly()是一一个非常常有用的的函数,但用户户的应用用程序须须要知道道延时时时

20、间所对对应的时时钟节拍拍的数目目。增加加了OSTimeDlyHMSM()函数数后,就就可按时时、分、秒和毫毫秒来定定义时间间了,这这样会显显得更加加方便。与OSTimeDly()一样,调用OSTimeDIyHMSM()函函数也会会使COS-II进行一一次任务务调度,并且执执行下一一个优先先级最高高的就绪绪态任务务。任务务调用OSTimeDlyHMSM()后后,一旦旦规定的的时间期期满或有有其他任任务通过过调用OSTimeDlyResme()取消消了延时时,它就就会立即即处于就就绪态。同样,只有当当该任务务在所有有就绪态态任务中中具有最最高的优优先级时时,它才才会立即即运行。系统时时间函数数OS

21、TimeGet()和和OSTimeSet()无论时钟钟节拍何何时发生生,COS-II都会将将一个32位的的计数器器加1。这个计计数器在在调用OSStart()初初始化多多任务和和4294967295个节节拍执行行完一遍遍后,从从0开始始计数。在时钟钟节拍频频率等于于100Hz时时,这个个32位位的计数数器每隔隔497天就重重新开始始计数。在执行行的过程程中可以以通过调调用OSTimeGet()函数来来获得该该计数器器的当前前值,也也可以通通过调用用OSTimeSet()函函数来改改变该计计数器的的值。2、任务务的管理理COS-II提过过大量的的API函数实实现对任任务的管管理,主主要的任任务有

22、:(1)建建立任务务COS-II要管管理用户户的任务务,就必必须先建建立任务务。通过过将任务务的地址址和其他他参数传传递给以以下两个个函数来来建立任任务。OSTaskCreate()和带带有扩展展附加功功能的OSTaskCreateExt()函数数。在main()函函数内开开始多任任务调度度(OSStart()前,必须至至少建立立一个任任务,而而且任务务不能由由中断服服务程序序(ISR)建建立。创建一个个任务控控制块,并通过过任务控控制块把把任务代代码和任任务堆栈栈关联起起来形成成一个完完整的任任务。还还有使刚刚创建的的任务进进入就绪绪状态,并引发发一次任任务调度度(取决决于任务务是否处处于多

23、多多任务工工作状态态)。两个函数数OSTaskCreate()和和OSTaskCreateExt()原原型如下下:INT8UOSTaskCreate(void (*task)(void*pd);/指向任任务的指指针void *pdata;/传递给给任务的的参数OS_STK*ptos;/指向向任务堆堆栈栈顶顶的指针针INT8Uprio/任务的的优先级级 )INT8UOSTaskCreateExt(void (*task)(void*pd);/指向向任务的的指针void *pdata;/传传递给任任务的参参数OS_STK*ptos;/指向任任务堆栈栈栈顶的的指针INT8Uprio/任务的的优先级级

24、INT16Uid/任务的的标识OS_STK*pbos;/指向向任务堆堆栈栈低低的指针针INT32Ustk_siaze;/任务务堆栈容容量void*pext;/指指向附加加数据域域的指针针INT16Uopt/用于于设定操操作选项项)在调用任任务建立立函数后后,COS-II内核核会首先先从TCB空闲闲列表内内申请一一个空的的TCB指针;然后根根据用户户给出的的参数初初始化任任务堆栈栈,并在在内部的的任务就就绪表中中标记该该任务为为就绪状状态;最最后返回回。这样样就建立立了一个个任务。(2)任任务堆栈栈在COS-II中中,每个个任务都都有自己己的堆栈栈空间。堆栈必必须声明明为OS_STK类型型,并且

25、且由连续续的内存存空间组组成。可可以静态态分配堆堆栈空间间(在编编译时分分配),也可以以动态分分配堆栈栈空间(在运行行时分配配),这这两种声声明方式式都应放放置在函函数外面面。任务所需需堆栈的的容量由由应用程程序确定定。但必必须考虑虑到任务务调用的的所有函函数的嵌嵌套情况况、任务务调用的的所有函函数为局局部变量量分配的的所有内内存的数数目,以以及所有有可能的的中断服服务子程程序嵌套套对堆栈栈的需求求。此外外,堆栈栈必须能能够保存存CPU所有的的寄存器器。COS-II提供供了堆栈栈检验函函数OSTaskStkChk(),用来来确定任任务实际际需要的的堆栈空空间的大大小。这这样能够够避免为为任务分

26、分配过多多的堆栈栈空间,从而减减少应用用程序代代码所需需的RAM数量量。调用用堆栈检检验函数数后,所所得到的的只是一一个大致致的堆栈栈使用情情况,并并不能说说明堆栈栈使用的的全部实实际情况况。为了了适应系系统以后后的升级级和扩展展,应该该多分配配10100的的堆栈空空间。(3)任任务的挂挂起和恢恢复挂起一个个任务,就是停停止这个个任务的的运行。在C/OS-II中,用用户任务务可以通通过调用用系统提提供的函函数OSTaskSuspend()来挂挂起自身身或者除除空闲任任务之外外的其他他任务。挂起的的任务,只能在在其他任任务中通通过调用用恢复函函数OSTaskResume()使其恢恢复为就就绪状态

27、态。但是,如如果任务务在被挂挂起的同同时还在在等待延延迟时间间到,则则需要对对任务取取消挂起起操作,并且要要继续等等待延迟迟时间到到,任务务才能转转入就绪绪状态。(4)任任务的删删除删除一个个任务,就是把把该任务务置于睡睡眠状态态,任务务的代码码不再被被C/OS-II使使用,而而并不是是说任务务的代码码被删除除了。调调用OSTaskDel()后,先先进行条条件判断断,当所所有的条条件都满满足后,就会从从所有可可能的C/OS-II的数数据结构构中去除除任务的的任务控控制块OS_TCB,这样就就不会被被其他的的任务或或中断服服务子程程序置于于就绪态态,即任任务置于于休眠状状态。函数原型型如下:IN

28、T8UOSTaskDel(INT8Uprio)可删除任任务自身身或者除除了空闲闲任务之之外的其其他任务务。删除除自己参参数为: OS_PRIO_SELF直接调用用这样的的删除任任务,可可能出现现某些问问题,如如果任务务拥有一一些动态态的内存存或者信信号量之之类的资资源,那那么如果果它被删删除了,它的资资源就不不会被释释放而丢丢失,会会造成同同样使用用资源的的其他任任务进入入死等待待,出现现错误情情况。要要慎重使使用。提提供了一一个可以以在请求求删除方方和被删删除方通通信完成成删除的的函数。原型如如下:INT8UOSTaskDelReq(INT8Uprio)返返回是否否被删除除和是否否有要删删除

29、自己己的要求求。被删删除方调调用得知知要删除除自己,释放资资源后,在删除除自己。(5)其其他任务务管理函函数任务优先先级别修修改任务运行行过程中中,用户户可以根根据需要要来改变变任务的的优先级级别。调调用的函函数原型型如下:INT8UOSTaskChangePrio(INT8Uoldprio;/任务务现在的的优先级级别INT8Unewprio/要要修改的的优先级级别)查询任务务的信息息查询一些些任务中中的信息息,函数数原型如如下:INT8UOSTaskQuery(INT8Uprio;OS_TCB*pdata)3、任务务间同步步与通信信的管理理C/OS-II中,使用信信号量、邮箱(消息邮邮箱)和

30、和消息队队列来实实现任务务相互同同步或相相互之间间的通信信。C/OS-II把关关于它们们的操作作都定义义为全局局函数,以供应应用程序序的所有有任务来来调用.等待任务务列表采用INT8U类型的的数组OSEventTbl作为记录录等待事事件任务务的记录录表,叫叫做等待待任务表表,每个个任务占占1位,为1表表示是等等待任务务。任务的等等待时限限,记录录在等待待任务的的任务控控制块TCB的的成员OSTCBDly中(1)事事件控制制块C/OS-II使用用叫做事事件控制制块ECB的数数据结构构来描述述诸如信信号量、邮箱和和消息队队列这些些事件。事件控控制块包包含包括括等待任任务表在在内的所所有有关关事件的

31、的数据。操作事件件控制块块的函数数C/OS-II有4个对事事件控制制块进行行基本操操作的函函数(定定义在OS_CORE.C中中)。事件控制制块的初初始化函函数void OS_EventWaitListInit(OS_ENENT *pevent )把变量OSEventGrp及任务务等待表表中的每每一位都都清0,即令事事件的任任务等待待表中不不含有任任何等待待任务。该函数数被OSXXXCreate()创创建时所所调用。XXXSem信信号号量Mutex互互斥信信号量Mbox消消息邮邮箱Q消消息队队列使一个任任务进入入等待状状态的函函数void OS_EventTaskWait( OS_ENENT *

32、pevent)将在任务务调用函函数OSXXXPend()请求一一个事件件时调用用。使一个正正在等待待任务进进入就绪绪状态的的函数INT8UOS_EventTaskRdy( OS_EVENT *pevent,void*msg,INT8Umsk)作用:把把调用这这个函数数的任务务在任务务等待表表中的位位置清0后,再再把任务务在任务务就绪表表中的对对应的位位置1,然后引引发一次次任务调调度将在任务务调用函函数OSXXXPost()发送一一个事件件时,被被调用。使一个等等待超时时的任务务仅需就就绪状态态的函数数void OS_EventTo(OS_EVENT*pevent)作用:当当任务已已经超过过了

33、等待待的时间间,却要要使它进进入就绪绪状态。将在任务务调用函函数OSXXXPend()请求一一个事件件时,被被调用。(2)信信号量管管理使用信号号量可以以在任务务间传递递信息,实现任任务与任任务或中中断服务务子程序序的同步步。C/OS-II中的的信号量量由两部部分组成成:16位的无无符号整整数信号号量的计计数值(065535);另一部部分是由由等待该该信号量量的任务务组成的的等待任任务列表表。C/OS-II提供供了以下下6个函函数对信信号量进进行操作作。操作创建信号号量OSSemCreat(INT16U cnt)创创建,返返回已创创建信号号量的指指针。请求信号号量OSSemPend(OS_EV

34、ENT*pevent,INT16Utimeout,NT8U*err)time为0,则表示示无限等等待。不等待调调用的函函数为OSSemAccept(OS_EVENT* pevent)。发送信号号量INT8UOSSemPost(OS_EVENT*pevent)当获得信信号量,访问共共享资源源结束以以后,释释放信号号量,调调用该函函数。先先检查是是否有等等待该信信号量的的任务。没有,信号量量计数器器加1,有,则则调用调调度器OS_Sched()。删除信号号量OS_EVENT*OSSemDel( OS_EVENT *pevent,INT8Uopt, INT8U *err)optOS_DEL_NO_P

35、END没没有等等待任务务删除OS_DEL_ALLWAYS立立即删删除只能任务务执行,不能在在中断服服务程序序中删除除查询信号号量的状状态INT8UOSSemQuery(OS_EVENT* pevent,OS_SEM_DATA *pdata)pdata是一一个结构构指针,存储信信号量的的状态。(3)消消息邮箱箱管理消息邮箱箱是C/OS-II中的一一种通信信机制,通常使使用时要要先定义义一个指指针型的的变量该该指针指指向一个个包含了了消息内内容的特特定数据据结构。发送消消息的任任务或中中断服务务子程序序把这个个变量送送往邮箱箱,接收收消息的的任务从从邮箱中中取出该该指针变变量,完完成信息息交换。

36、C/OS-II提供6种对消消息邮箱箱的操作作,它们们通过以以下函数数实现:创建OS_EVENT* OSMoxCreate(void *msg)Msg为为消息指指针,一一般初始始为NuLL。向消息邮邮箱发送送消息INT8UOSMboxPost(OS_EVENT *pevent,void *msg)发送广播播消息INT8UOSMboxPostOpt(OS_EVENT *pevent,void*msg, INT8U opt)opt: OS_POST_OPT_BROADCAST广广播消息息OS_POST_OPT_NONE最最高优先先级请求消息息邮箱void *OSMboxPend(OS_EVENT*

37、pevent,INT16Utimeout,INT8U*err)查询邮箱箱状态INT8UOSMboxQuery(OS_EVENT*pevent, OS_MBOX_DATA*pdata)删除邮箱箱OS_EVENT*OSMboxDel(OS_EVENT* pevent,INT8Uopt, INT8U *err)(4)消消息队列列管理消息队列列是C/OS-II的另一一种通信信机制,它可以以使一个个任务或或中断服服务子程程序向另另一个任任务发送送以指针针定义的的变量。 C/OS-II提供了了9个对对消息队队列进行行操作的的函数。创建先创建一一个指针针数组,然后用用该数组组来创建建消息队队列OS_EVEN

38、TOSQCreate( void*start,INT16U size)请求消息息队列void*OSQPend(OS_EVENT *pevent,INT16Utimeout,INT8U*err)向消息队队列发送送消息INT8UOSQPost(OS_EVENT *pevent,void*msg)工作方式式FIFOINT8UOSQPostFront(OS_EVENT*pevent,void* msg)工作方式式LIFO发送广播播消息INT8UOSQPostOpt(OS_EVENT *pevent,void*msg,INT8Uopt)清空消息息队列INT8UOSQFlsh( OS_EVENT *pev

39、ent )删除消息息队列OS_EVENT* OSQDel(OS_EVENT*pevent)查询消息息队列INT8UOSQQuery(OS_EVENT*pevent,OS_Q_DATA*pdata)COS-II操作作系统的的文件体体系结构构如图2所示,其核心心主要可可分为以以下3部部分:(1)应应用软件件层,指指的是基基于COS-II的应用用程序代代码。(2)内内核的核核心代码码层,主主要包括括8个源源代码文文件。这这8个源源代码文文件为OS_CORE.C、OS_MBOX.C、OS_MEM.C、OS_SEM.C、OS_TIME.C、COS_II.C、OS_Q.C和OS_TASK.C,其其主要实实

40、现的功功能分别别是核心心管理、事件管管理、存存储管理理、消息息队列管管理、定定时管理理、信号号量处理理、消息息管理和和任务调调度等,这部分分代码与与处理器器无关。(3)系系统设置置与移植植层。系系统设置置部分的的代码由由两个头头文件OS_CFG.H和INCLDES.H组成。其主要要功能是是用来配配置事件件控制块块的数目目以及是是否包含含消息管管理的相相关代码码等。与与处理器器相关的的移植代代码部分分包括:一个头头文件OS_CPU.H、一一个汇编编文件OS_CPU_A.ASM和和一个C代码文文件OS_CPU_C.C。系统设设置与移移植层与与具体应应用和处处理器相相关,在在随后的的COS-II的的

41、移植和和开发过过程中,用户所所需要关关注的就就是这部部分文件件。4、COS-II操作系系统的文文件系统统图2COS-II文文件体系系结构6.1.4COS-II操操作系统统的初始始化在调用COS-II操作作系统的的其他服服务之前前,COS-II操作系系统要求求用户首首先调用用系统初初始化函函数OSInit()。执行行OSInit()函函数后将将初始化化COS-II所所有的变变量和数数据结构构,另外外OSInit()会会建立空空闲任务务,并且且这个任任务总是是处于就就绪状态态的。空空闲任务务OSTaskldle()函数的的优先级级总是设设置成为为最低级级别,即即OS_LOWEST_PRIO。多任务

42、的的启动是是用户通通过调用用OSStart()函数来来实现的的。然而而,在启启动COS-II之前,用户至至少要建建立一个个应用任任务,例例如:void main()OSInit();.通过OSTaskCreate()或OSTaskCreateExt()创建至至少一个个任务.OSStart();/*开始始多任务务调度,OSStart()永远都都不会返返回*/1.C/OS II基础2.C/OS II移植3.嵌入入式系统统的初始始化操作作第六章C/OSII程程序设计计基础6.2COS-II系系统在ARM系系统中的的移植所谓移植植,就是是指使一一个实时时操作系系统能够够在其他他的微处处理器平平台上进进

43、行运行行。由于于COS-II的的主要代代码都是是由标准准的C语语言写成成的,所所以,一一般来说说移植过过程并不不复杂。6.2.1COS-II移植植条件虽然COS-II的大部部分源代代码是用用C语言言写成的的,但是是,仍需需要用汇汇编语言言完成一一些与微微处理器器相关的的代码。例如,COS-II在在读写微微处理器器、寄存存器时只只能通过过汇编语语言来实实现。这这是因为为COS-II在在设计的的时候就就已经充充分考虑虑了可移移植性。为了要要使COS-II可以正正常工作作,处理理器必须须要满足足如下要要求:1)微微处理器器的C编编译器能能产生可可重入代代码可重入的的代码指指的是一一段代码码(如一一个

44、函数数)可以以被多个个任务同同时调用用,而不不必担心心会破坏坏其内部部的数据据。也就就是说,可重入入型函数数在任何何时候都都可以被被中断执执行,也也不会因因为在函函数中断断的时候候被其他他的任务务重新调调用,影影响函数数中的数数据。可可重入代代码或者者只使用用局部变变量,即即变量保保存在CPU寄寄存器中中或堆栈栈中;或或者使用用全局变变量,则则要对全全局变量量予以保保护。通常的C编译器器,把局部变量量分配在栈栈中。所所以,多多次调用用同一个个函数,可以保保证每次次的局部部变量互互不受影影响。而而全局变量量,在多次次调用函函数的时时候,必必然受到到影响。代码的可可重入性性是保证证完成多多任务的的

45、基础,除了在在C程序序中使用用局部变变量以外外,还需需要C编编译器的的支持。基于ARM的的SDT、ADS等集集成开发发环境,都可以以生成可可重入的的代码。2)在在程序中中可以使使用c语语言打开开或者关关闭中断断在COS-II中中,可以以通过进进入中断断屏蔽的的宏定义义OS_ENTER_CRITICAL()或者者退出中中断屏蔽蔽的宏定定义OS EXIT_CRITICAL()来控控制系统统关闭中中断或者者打开中中断,这这需要微微处理器器的支持持。在目目前的ARM系系列的微微处理器器上,都都可以设设置相应应的寄存存器来关关闭或者者打开系系统的所所有中断断。3)微微处理器器支持中中断,并并且能产产生定

46、时时中断(通常在在10Hz-1000Hz之之间)。COS-II是是通过微微处理器器产生定定时的中中断来实实现多任任务之间间的调度度的。4)微微处理器器支持能能够容纳纳一定量量数据的的硬件堆堆栈,并并具有将将堆栈指指针和其其他CPU寄存存器读写写到堆栈栈(或者者内存)的指令令。5)COS-II进行行任务调调度的时时候,会会把当前前任务的的CPU内部寄寄存器的的内容存存放到此此任务的的堆栈中中。然后后,再从从另一个个任务的的堆栈中中恢复原原来的工工作寄存存器,继继续运行行另一个个任务。所以,寄存器器中内容容的入栈栈和出栈栈是COS-II多任务务调度的的基础。6.2.2COS-II的移移植步骤骤在的

47、移植植过程中中,使用用的是基基于ARM公司司架构的的软件开开发工具具作为编编译器,所值得得关注的的问题是是与微处处理器相相关的代代码,这这部分主主要包括括一个头头文件OS_CPU.H、一一个汇编编文件OS_CPU_A.ASM和和一个C代码文文件OS_CPU_C.C。1设置置头文件件OS_CPU.H中中与处理理器和编编译器相相关的代代码(1)与与编译器器相关的的数据类类型#define INT8Uunsignedchar#define INTl6Uunsignedshort#define INT32Uunsignedlong#define OS_STKunsignedlong#define BO

48、OLEANint#define OS_CPU_SRunsignedlong#define INT8Schar因为不同同的微处处理器有有不同的的字长,所以COS-的移植植包括了了一系列列的类型型定义以以确保其其可移植植性。用户必须须将任务务堆栈的的数据类类型定义义到COS-II操作系系统中,这个过过程是通通过为OS_STK声声明正确确的C语语言数据据类型来来完成的的。由于于使用的的微处理理器上的的堆栈成成员是16位的的,所以以将OS_TSK声明明为无符符号整形形数据类类型。值值得注意意的是,所有的的任务堆堆栈都必必须使用用OS_STK声明数数据类型型。(2)进进入中断断屏蔽的的宏定义义OS_EN

49、TER_CRITICAL()和退退出中断断屏蔽的的宏定义义OS_EXIT_CRITICAL()externintINTS_OFF(void);externvoidINTS_ON(void);#define OS_ENTER_CRITICAL()CPU_sr= INTS_OFF();#define OS_EXIT_CRITICAL()if(CPU_sr=0)INTS_ON();与所有的的实时内内核一样样,COS-II操作系系统在进进行任务务切换时时需要先先禁止中中断在访访问代码码的临界界区,并并且在访访问完毕毕后重新新允许中中断。这这就使得得COS-II能能够保护护临界区区代码免免受多任任务或中

50、中断服务务例程(ISR)的破破坏。在在S3C44B0微处处理器上上是通过过OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()两两个函数数来实现现开、关关中断的的。(3)栈栈增长方方向标OS_STK_GROWTH#define OS_STK_GROWTH1#define STACKSIZE256绝大多数数的微处处理器的的堆栈是是从高地地址向低低地址增增长的,但是有有些微处处理器是是采用相相反方式式工作的的。鉴于于这种情情况COS-II操作系系统被设设计成为为这两种种情况都都可以处处理,只只要在结结构常量量OS_STK_GROWTH中指指定堆栈栈的生长长方式就就可以了了。

51、例如如:设OS_STK_GROWTH为0表示堆堆栈从下下往上增增长。设OS_STK_GROWTH为1表示堆堆栈从上上往下增增长。2.用用汇编语语言在OS_CPU_A.ASM文文件中编编写4个个与微处处理器相相关的函函数(1)调调用用优先级级最高的的就绪任任务函数数 OSStartHighRdy()(2)任任务级的的任务切切换函数数 OSCtxSw()(3)中中断级的的任务切切换函数数 OSIntCtxSw()(4)时时钟节拍拍中断服服务函数数 OSTickISR()3用C语言编编写6个个操作系系统相关关的函数数(OS_CPU_C.C)这里主要要涉及6个函数数:OSTaskStkInit()、O

52、STaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()及及OSTimeTickHook()。这些函数数中,惟惟一必须须移植的的是任务务堆栈初初始化函函数OSTaskStkInit()。这这个函数数在任务务创建时时被调用用,负责责初始化化任务的的堆栈结结构并返返回新堆堆栈的指指针stk。在在ARM体系结结构下,任务堆堆栈空间间由高至至低依次次保存着着PC、LR、R12、R11、R10、R1、R0、CPSR及SPSR。堆栈栈初始化化工作结结束后,返回新新的堆栈栈栈顶指指针。以下5个个Hook函数数,又称称为钩子子函数,主要

53、用用来扩展展COS-功能能,使用用前必须须被声明明,但并并不一定定要包含含任何代代码。(1)0STaskCreateHook()函数数当用OSTaskCreate()函数或或OSTaskCreateExt()函函数建立立任务时时,就会会调用OSTaskCreateHook()函函数。COS-设置完完自己的的内部结结构后,会在调调用任务务调度程程序之前前调用OSTaskCreateHook()函函数。该该函数被被调用时时中断是是禁止的的,因此此应尽量量减少该该函数中中的代码码,以缩缩短中断断的响应应时问。(2)OSTaskDelHook()函数数当任务被被删除时时,就会会调用OSTaskDelH

54、ook()函函数。该该函数在在把任务务从COS-的的内部任任务链表表中解开开之前被被调用。当OSTaskDelHook()函数数被调用用时,会会收到指指向正被被删除任任务的OS_TCB的的指针,这样它它就可访访问所有有的结构构成员了了。OSTaskDelHook()函数数可用来来检验TCB扩扩展是否否被建立立了(一一个非空空指针),并进进行一些些清除操操作。注注意,此此函数不不返回任任何值。(3)OSTaskSwHook()函数当发生任任务切换换时,调调用OSTaskSwHook()函数。不管任任务切换换是通过过OSCtxSw()函数,还是通通过OSIntCtxSw()函数数来执行行的,都都会

55、调用用该函数数。OSTaskSwHook()函数可可直接访访问OSTCBCr和OSTCBHighRdy,这这是因为为它们都都是全局局变量。OSTCBCr指指向被切切换出去去的任务务的OS_TCB,而而OSTCBHighRdy指向新新任务的的OS_TCB。在调用OSTaskSwHook()函数数期间,中断一一直是被被禁止的的。这时时因为代代码的多多少会影影响到中中断的响响应时间间,所以以应尽量量使代码码简化。此函数数没有任任何参数数,也不不返回任任何值。(4)OSTaskStatHook()函函数OSTaskStatHook()函数每每秒都会会被OSTaskStat()函数数调用一一次,可可用O

56、STaskStatHook()函函数来扩扩展统计计功能。该函数数没有任任何参数数,也不不返回任任何值。(5)OSTimeTickHook()函函数OSTimeTickHook()函数在在每个时时钟节拍拍都会被被0STimeTick()函数调调用。实实际上,OSTimeTickHook()函数数是在节节拍被COS-处理,并在通通知用户户的移植植实例或或应用程程序之前前被调用用的。OSTimeTickHook()函数没没有任何何参数,也不返返回任何何值。1.C/OS II基础2.C/OS II移植3.嵌入入式系统统的初始始化操作作第六章C/OSII程程序设计计基础6.2.3C/OS-IIBSP编写

57、BSP(板级支支持包)是介于于底层硬硬件和操操作系统统之间的的软件层层次,它它完成系系统上电电后最初初的硬件件和软件件初始化化,并对对底层硬硬件进行行封装,使得操操作系统统不再面面对具体体的操作作。BSP的的特点:硬件相关关性:因因为嵌入入式实时时系统的的硬件环环境具有有应用相相关性,所以,作为高高层软件件与硬件件之间的的接口,BSP必须为为操作系系统提供供操作和和控制具具体硬件件的方法法。操作系统统相关性性:不同同的操作作系统具具有各自自的软件件层次结结构,因因此,不不同的操操作系统统具有特特定的硬硬件接口口形式。嵌入式系系统初始始化过程程及BSP功能能初始化程程序的下下载执行行目标机宿主机

58、1)通过过编程器器将可执执行目标标文件烧烧写到BootROM(ROM、EPROM、FLASH)等等;2)通过过串行口口和网口口下载执执行目标标文件,要求宿宿主机系系统上有有数据传传输工具具程序、目标机机装载器器、嵌入入式监视视器或目目标机系系统上的的调试代代理。3)通过过JTAG或BDM接接口下载载;嵌入式系系统的初初始化过过程嵌入式系系统的初初始化过过程硬件初始始化阶段段1、复位位向量 ENTRYb ResetHandler;fordebugb Handlerundef;handlerundefb HandlerSWI;SWIinterrupthandlerb HandlerPabort;h

59、andlerPAbortb HandlerDabort;handlerDAbortb;handlerReservedb HandlerIRQb HandlerFIQ嵌入式系系统的初初始化过过程(2)硬件初始始化阶段段2、最小小硬件初初始化1)设置置适当的的寄存器器,使嵌嵌入式处处理器处处于一个个已知的的状态:获得CPU的类类型;获得或设设置CPU的时时钟频率率。2)禁止止中断和和高速缓缓存3)初始始化内存存控制器器、内存存芯片和和高速缓缓存单元元,包括括:得到内存存的开始始地址;得到内存存的大小小;如果有要要求,则则还需要要进行主主存测试试;嵌入式系系统的初初始化过过程(3)硬件初始始化阶段段

60、3、其余余硬件初初始化1)引导导代码调调用合适适的函数数对目标标机系统统上的全全部硬件件部件进进行初始始化,包包括:建立执行行处理程程序初始化中中断处理理程序初始化总总线接口口初始化板板级外设设得到内内存的开开始地址址;嵌入式系系统的初初始化过过程(4)RTOS初始化化阶段4、RTOS初初始化1)RTOS初初始化2)RTOS对对象和服服务初始始化任务信号量定时器中断内存管理理3)RTOS任任务堆栈栈初始化化4)RTOS扩扩展部件件初始化化5)启动动RTOSARM7TDMI系统统初始化化的一般般过程启动(系系统上电电/复位位)从程序入入口点关闭中断断初始化时时钟等硬硬件相关关寄存器器初始化存存储

温馨提示

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

评论

0/150

提交评论