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

下载本文档

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

文档简介

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

2、有中文和韩文版ChineseKoreanEnglishISBN 1-57820-103-9美国CMP BOOK ISBN 7-81077-290-2北京航空航天大学出版社ISBN 89-951540-5-56C/OS-IIC/OS-II的各种商业应用的各种商业应用全世界有数百种产品在应用全世界有数百种产品在应用: : Avionics(航空电子设备)(航空电子设备) Medical Cell phones Routers and switches High-end audio equipment Washing machines and dryers UPS (uninterruptible

3、Power Supplies) Industrial controllers GPS Navigation Systems Microwave Radios Instrumentation Point-of-sale terminals 更多7 C COS-OS-是一个免费的、源代码公开的实时嵌入式内核,其内是一个免费的、源代码公开的实时嵌入式内核,其内核提供了实时系统所需要的一些基本功能。其中包含全部功能的核提供了实时系统所需要的一些基本功能。其中包含全部功能的核心部分代码占用核心部分代码占用8.3 KB8.3 KB,全部的源代码约,全部的源代码约55005500行,结构合理、行,结构合理、

4、清晰易懂,且注解详尽,非常适合初学者进行学习分析。清晰易懂,且注解详尽,非常适合初学者进行学习分析。C COS-OS-不仅使用户得到廉价的解决方案,而且由于不仅使用户得到廉价的解决方案,而且由于C COS-OS-的开的开放源代码特性,还使用户可针对自己的硬件优化代码,获得更好放源代码特性,还使用户可针对自己的硬件优化代码,获得更好的性能。的性能。 C COS-OS-是在是在PCPC机上开发的,机上开发的,C C编辑器使用的是编辑器使用的是Borland Borland C/C+3.1C/C+3.1版。从早期使用的版。从早期使用的COSCOS到现在的到现在的C COS- V2.52OS- V2.

5、52版,版,应用的实例也进一步说明了该内核的实用性和可靠性。应用的实例也进一步说明了该内核的实用性和可靠性。6.1 6.1 C/OS-IIC/OS-II系统的特点及结构系统的特点及结构 86.1.1 6.1.1 C COS-OS-系统的特点系统的特点93 3可固化可固化(ROMable)(ROMable),C COS-OS-是为嵌入式应用而设计的操作系是为嵌入式应用而设计的操作系统,只要具备有合适的软硬件工具,就可将统,只要具备有合适的软硬件工具,就可将C COS-OS-嵌入到产嵌入到产品中去,从而成为产品的一部分。品中去,从而成为产品的一部分。 4 4可裁剪可裁剪(Scalable)(Sca

6、lable),C COS-OS-可根据实际用户的应用需要使用可根据实际用户的应用需要使用条件编译来完成对操作系统的裁剪,这样就可以减少条件编译来完成对操作系统的裁剪,这样就可以减少C COS-OS-对代码空间和数据空间的占用。对代码空间和数据空间的占用。5 5可剥夺型可剥夺型(Preemptive)(Preemptive),C COS-OS-是完全可剥夺型的实时内核,是完全可剥夺型的实时内核,运行就绪条件下优先级最高的任务。运行就绪条件下优先级最高的任务。6 6多任务,多任务,C COS-OS-可管理可管理6464个任务。一般情况下,建议用户保个任务。一般情况下,建议用户保留留8 8个任务给个

7、任务给C COS-OS-。这样,留给用户应用程序的任务最多可。这样,留给用户应用程序的任务最多可有有5656个。系统赋给每个任务的优先级必须不同,这意味着个。系统赋给每个任务的优先级必须不同,这意味着C COS-OS-不支持时间片轮转调度法不支持时间片轮转调度法(Round-robin Scheduling)(Round-robin Scheduling)。 7 7可确定性,绝大多数可确定性,绝大多数C COS-OS-的函数调用和服务的执行时间具的函数调用和服务的执行时间具有确定性。在任何时候用户都能知道有确定性。在任何时候用户都能知道C COS-OS-的函数调用与服的函数调用与服务的执行时间

8、。务的执行时间。108 8任务栈,任务栈,C COS-OS-的每个任务都有自己单独的栈和栈空间。使的每个任务都有自己单独的栈和栈空间。使用用C COS-OS-的栈空间校验函数可确定每个任务到底需要多少栈的栈空间校验函数可确定每个任务到底需要多少栈空间。空间。 9 9系统服务,提供了例如信号量、互斥信号量、消息邮箱、事件系统服务,提供了例如信号量、互斥信号量、消息邮箱、事件标志、数据队列、块大小固定的内存的申请与释放及时间管理函标志、数据队列、块大小固定的内存的申请与释放及时间管理函数等。数等。 1010中断管理,中断可使正在执行的任务暂时挂起,如果优先级更中断管理,中断可使正在执行的任务暂时挂

9、起,如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行。中断嵌套层数可达立即执行。中断嵌套层数可达255255层。层。 1111稳定性与可靠性,稳定性与可靠性,20002000年年7 7月,月,C COS-OS-在一个航空项目中得在一个航空项目中得到了美国联邦航空管理局对商用飞机的符合到了美国联邦航空管理局对商用飞机的符合RTCA DO-178BRTCA DO-178B标准标准的认证。可以说,的认证。可以说,C COS-OS-的每一种功能、每一个函数及每一的每一种功能、每一个函数及每一行代码都经过了考验与测试。行

10、代码都经过了考验与测试。11 6.1.2 6.1.2 C COS-OS-系统的内核结构系统的内核结构 与其他操作系统不同,与其他操作系统不同,C COS-OS-其实只有一个内核,提供任务调其实只有一个内核,提供任务调度、任务间的通信与同步、任务管理、时间管理和内存管理等基度、任务间的通信与同步、任务管理、时间管理和内存管理等基本功能。本功能。1) 1) 任务任务在在C COS-OS-中,一个任务通常是一个无限的循环。一个任务看起来像其中,一个任务通常是一个无限的循环。一个任务看起来像其他他c c语言的函数一样,有函数返回类型,有形式参数变量,但任务是决语言的函数一样,有函数返回类型,有形式参数

11、变量,但任务是决不会返回的。故返回参数必须定义成不会返回的。故返回参数必须定义成voidvoid,例如:,例如:Void YorTask(void Void YorTask(void * *pdata)pdata) for(for(;)* *用户代码用户代码* * *调用调用C COS-IIOS-II的某种系统服务:的某种系统服务:* * * *用户代码用户代码* * 122) 2) 任务调度任务调度 C COS-IIOS-II可以管理多达可以管理多达6464个任务,其优先级可以从个任务,其优先级可以从0 0开始,优先开始,优先级号越低,其任务的优先级就越高。但目前版本的级号越低,其任务的优先

12、级就越高。但目前版本的C COS-IIOS-II有有两个任务已经被系统占用了,而且保留了优先级两个任务已经被系统占用了,而且保留了优先级0 0、1 1、2 2、3 3、和、和OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2OS_LOWEST_PRIO-2、0S_LOWEST_PRIO-10S_LOWEST_PRIO-1以以及及OS_LOWEST_PRIOOS_LOWEST_PRIO这这8 8个任务已备将来使用。个任务已备将来使用。OS_LOWEST_PRIOOS_LOWEST_PRIO是是作为常数在作为常数在OS_CFG.HOS_CFG.H文件

13、中用定义常数语句文件中用定义常数语句#define constant#define constant来来定义的。因此用户可以使用多达定义的。因此用户可以使用多达5656个应用任务,但首先要给每个个应用任务,但首先要给每个任务赋以不同的优先级。任务赋以不同的优先级。C COS-IIOS-II总是运行进入就绪态的优先总是运行进入就绪态的优先级最高的任务。目前版本的级最高的任务。目前版本的C COS-IIOS-II中,任务的优先级号就是中,任务的优先级号就是任务编号任务编号(ID)(ID)。优先级号。优先级号( (或任务的或任务的IDID号号) )也可以被一些内核服务也可以被一些内核服务函数调用,比

14、如改变优先级函数函数调用,比如改变优先级函数OSTaskChangePrio()OSTaskChangePrio()或者或者OSTaskDel()OSTaskDel()。 为了使为了使C COS-IIOS-II能管理用户任务,用户必须在建立一个任务的能管理用户任务,用户必须在建立一个任务的时候,将任务的起始地址与其他参数一起传给时候,将任务的起始地址与其他参数一起传给OSTaskCreate()OSTaskCreate()或或者者OSTaskCreateExt()OSTaskCreateExt()这两个函数中的任何一个函数。这两个函数中的任何一个函数。13 在任一给定的时刻,任务的状态一定是在

15、任一给定的时刻,任务的状态一定是以下五种状态之一:以下五种状态之一: 睡眠态(睡眠态(task dormanttask dormant) 就绪态(就绪态(task readytask ready) 运行态(运行态(task runningtask running) 等待状态(等待状态(task waitingtask waiting) 中断服务态(中断服务态(ISR running)ISR running)C/OS II 的五种状态14睡眠态(睡眠态(task dormanttask dormant) 指任务驻留在程序空间(指任务驻留在程序空间(ROMROM或或RAMRAM),还没有交给),还

16、没有交给系统来管理的状态系统来管理的状态 任务交给系统通过调用以下函数之一来实现:任务交给系统通过调用以下函数之一来实现: OSTaskCreateOSTaskCreate()() OSTaskCreateExtOSTaskCreateExt()() 告知系统:告知系统: 任务的起始地址任务的起始地址 任务建立时,用户给任务赋予的优先级任务建立时,用户给任务赋予的优先级 任务要使用的栈空间大小等任务要使用的栈空间大小等15就绪态(就绪态(task readytask ready) 任务一旦创建就进入就绪态,准备运行任务一旦创建就进入就绪态,准备运行 任务的创建可以是在多任务开始之前,也可以动任

17、务的创建可以是在多任务开始之前,也可以动态地由一个运行着的任务创建态地由一个运行着的任务创建 若刚创建任务的优先级高于创建它的任务的优先若刚创建任务的优先级高于创建它的任务的优先级,它将立即获得级,它将立即获得cpucpu的使用权的使用权 任务可通过任务可通过OSTaskDelOSTaskDel()返回睡眠态;或调用该()返回睡眠态;或调用该函数让另一个任务进入睡眠态函数让另一个任务进入睡眠态16运行态(运行态(task rnningtask rnning) 就绪的任务只有当所有优先级高于它的任务都转就绪的任务只有当所有优先级高于它的任务都转为等待状态,或被删除后,才能进入运行态为等待状态,或

18、被删除后,才能进入运行态 任何时刻只有一个任务处于运行态任何时刻只有一个任务处于运行态 调用调用OSStartOSStart()可以启动多任务。该函数只能在()可以启动多任务。该函数只能在启动时调用一次启动时调用一次 OSStartOSStart()运行用户初始化代码中已经建立的、()运行用户初始化代码中已经建立的、进入就绪态的优先级最高的任务进入就绪态的优先级最高的任务17等待状态(等待状态(task waitingtask waiting) 正在运行的任务可以通过下面的调用进入等待状态。正在运行的任务可以通过下面的调用进入等待状态。延迟时间到,立即强制执行任务切换,让下一个优延迟时间到,立

19、即强制执行任务切换,让下一个优先级最高、并进入就绪态的任务执行。先级最高、并进入就绪态的任务执行。 OSTimeDlyOSTimeDly()() OSTimeDlyHMSMOSTimeDlyHMSM()() 等待时间过去后,系统服务(内部)函数等待时间过去后,系统服务(内部)函数OSTimeTickOSTimeTick()使延迟了的任务进入就绪态()使延迟了的任务进入就绪态 用户无需在应用程序代码中调用这个函数用户无需在应用程序代码中调用这个函数18等待状态(续)等待状态(续) 正在运行的任务可能需要通过调用函数等待某一正在运行的任务可能需要通过调用函数等待某一事件发生。如果该事件并未发生,任

20、务就进入等事件发生。如果该事件并未发生,任务就进入等待状态待状态 OSFlagPendOSFlagPend();();OSMtexPendOSMtexPend()() OSSemPendOSSemPend();();OSMboxPendOSMboxPend()() 当事件发生或等待超时,被挂起的任务就进入就当事件发生或等待超时,被挂起的任务就进入就绪态绪态19中断服务态(中断服务态(ISR running)ISR running) 正在执行的任务是可以被中断的正在执行的任务是可以被中断的,除非该,除非该任务将中断关闭,或系统将中断关闭。被任务将中断关闭,或系统将中断关闭。被中断的任务便进入了中

21、断服务态中断的任务便进入了中断服务态 响应中断后,正在运行的任务被挂起,中响应中断后,正在运行的任务被挂起,中断服务子程序控制了断服务子程序控制了CPuCPu的使用权的使用权20中断服务态(中断服务态(ISR running)ISR running) 中断服务子程序可能会报告一个或多个事件的发生,中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态而使一个或多个任务进入就绪态 上述情况下,从中断服务子程序返回之前,上述情况下,从中断服务子程序返回之前, C/OSC/OS IIII 要判定:要判定: 被中断的任务是否还是就绪态任务中优先级最被中断的任务是否还是就绪态任务中优

22、先级最高的高的 如果中断服务子程序使另一个优先级更高的任如果中断服务子程序使另一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行;否则,原来被中断级更高的任务将得以运行;否则,原来被中断了的任务将继续运行。了的任务将继续运行。21任务状态任务状态 当所有的任务都在等待时间发生或等待延迟时间结束时,C/OS II 执行被称为空闲任务(Idle Task)的内部函数,即:OSTaskIdle()22任务的任务的CPU使用权被剥夺使用权被剥夺中断中断236.1.3 主要模块介绍1 1内存管理内存管理在在ANSI CANSI C中,

23、一般采用内存分配函数中,一般采用内存分配函数malloc()malloc()和内存释放函数和内存释放函数free()free()两个函数动态地分配和释放内存。为了消除多次动态分配两个函数动态地分配和释放内存。为了消除多次动态分配与释放内存所引起的内存碎片和分配、释放函数执行时间的不确与释放内存所引起的内存碎片和分配、释放函数执行时间的不确定性的现象,定性的现象,C COS-OS-把连续的大块内存按分区来进行管理。把连续的大块内存按分区来进行管理。每个分区中都包含若干个存储容量大小相同的内存块,但不同分每个分区中都包含若干个存储容量大小相同的内存块,但不同分区之间的内存块容量大小是可以不同的。在

24、需要动态分配内存时,区之间的内存块容量大小是可以不同的。在需要动态分配内存时,可选择一个适当的分区,按块来分配内存。在释放内存时,将该可选择一个适当的分区,按块来分配内存。在释放内存时,将该块放回它以前所属的分区。这样,就能有效解决内存碎片问题。块放回它以前所属的分区。这样,就能有效解决内存碎片问题。而且每次调用而且每次调用malloc()malloc()和和free()free()分配和释放的都是整数倍的固定分配和释放的都是整数倍的固定内存块长,这样执行时间就是确定的了。内存块长,这样执行时间就是确定的了。 24(1 1)内存管理控制块)内存管理控制块OS_MEMOS_MEM为便于内存的管理

25、,为便于内存的管理,C COS-IIOS-II中使用内存控制块中使用内存控制块(Memory Control Blocks)(Memory Control Blocks)的数据结构跟踪每一个内存分区系统,每个分区都有属于自己的内存控制块,的数据结构跟踪每一个内存分区系统,每个分区都有属于自己的内存控制块,系统是通过内存控制块数据结构系统是通过内存控制块数据结构OS_MEMOS_MEM来管理内存的。来管理内存的。 (2 2)内存管理)内存管理内存管理主要通过以下内存管理主要通过以下4 4个函数来实现:个函数来实现: OSMemCreate()OSMemCreate()函数,用于建立一个内存分区。

26、该函数共有函数,用于建立一个内存分区。该函数共有4 4个参数:内存个参数:内存分区的起始地址、分区内的内存块数、每个内存块的字节数和一个指向错误分区的起始地址、分区内的内存块数、每个内存块的字节数和一个指向错误信息代码的指针。信息代码的指针。 OSMemGet()OSMemGet()函数,用于分配一个内存块。当调度某任务执行时,必须先从函数,用于分配一个内存块。当调度某任务执行时,必须先从已建立的内存分区中为该任务申请一个内存块。已建立的内存分区中为该任务申请一个内存块。 OSMemPut()OSMemPut()函数,释放一个内存块。当某一任务不再使用一个内存块时,函数,释放一个内存块。当某一

27、任务不再使用一个内存块时,必须及时地把它放回到相应的内存分区中,以便下一次的分配操作。必须及时地把它放回到相应的内存分区中,以便下一次的分配操作。 OSMemQuery()OSMemQuery()函数,用于查询一个特定内存分区的状态。如查询某内存分函数,用于查询一个特定内存分区的状态。如查询某内存分区中内存块的大小、可用内存块数和正在使用的内存块数等信息。区中内存块的大小、可用内存块数和正在使用的内存块数等信息。25(3 3)时间管理)时间管理与大部分内核一样,与大部分内核一样,C COS-OS-要求提供定时中断,以实现延时与超时控要求提供定时中断,以实现延时与超时控制等功能。这个定时中断也可

28、以被叫作为时钟节拍。时钟节拍函数的制等功能。这个定时中断也可以被叫作为时钟节拍。时钟节拍函数的作用是用于通知作用是用于通知C COS-OS-发生了时钟节拍中断,下面再介绍几个可以发生了时钟节拍中断,下面再介绍几个可以处理时间问题的函数。处理时间问题的函数。任务延时函数任务延时函数OSTimeDIy()OSTimeDIy() 调用该函数会使调用该函数会使C COS-OS-进行一次任务调度,并且执行下一个优先进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用级最高的就绪态任务。任务调用OSTimeDly()OSTimeDly()后,一旦规定的时间期满后,一旦规定的时间期满或者有其他任

29、务通过调用或者有其他任务通过调用OSTimeDlyResume()OSTimeDlyResume()取消了延时,它就会立即取消了延时,它就会立即进入就绪状态。只有当该任务在所有就绪任务中具有最高的优先级时,进入就绪状态。只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。它才会立即运行。恢复延时的任务函数恢复延时的任务函数OSTimeDlyResume()OSTimeDlyResume() C COS-IIOS-II具有允许结束正处于延时期的任务的功能。具体方法是通具有允许结束正处于延时期的任务的功能。具体方法是通过调用过调用OSTimeDlyResume()OSTimeDlyRe

30、sume()和指定要恢复的任务的优先级的方式,这样和指定要恢复的任务的优先级的方式,这样延时的任务就可以不用等待延时期满,而是通过其他任务取消延时来延时的任务就可以不用等待延时期满,而是通过其他任务取消延时来使自己处于就绪态。实际上,使自己处于就绪态。实际上,OSTimeDlyResume()OSTimeDlyResume()也可唤醒正在等待事也可唤醒正在等待事件的任务。件的任务。26按时、分、秒、毫秒延时函数按时、分、秒、毫秒延时函数OSTimeDlyHMSM()OSTimeDlyHMSM() OSTimeDly() OSTimeDly()是一个非常有用的函数,但用户的应用程序须要知道延时时

31、间所是一个非常有用的函数,但用户的应用程序须要知道延时时间所对应的时钟节拍的数目。增加了对应的时钟节拍的数目。增加了OSTimeDlyHMSM()OSTimeDlyHMSM()函数后,就可按时、分、秒函数后,就可按时、分、秒和毫秒来定义时间了,这样会显得更加方便。与和毫秒来定义时间了,这样会显得更加方便。与OSTimeDly()OSTimeDly()一样,调用一样,调用OSTimeDIyHMSM()OSTimeDIyHMSM()函数也会使函数也会使C COS-IIOS-II进行一次任务调度,并且执行下一个进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用优先级最高的就绪态任务。任

32、务调用OSTimeDlyHMSM()OSTimeDlyHMSM()后,一旦规定的时间期后,一旦规定的时间期满或有其他任务通过调用满或有其他任务通过调用OSTimeDlyResme()OSTimeDlyResme()取消了延时,它就会立即处于取消了延时,它就会立即处于就绪态。同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它就绪态。同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。才会立即运行。系统时间函数系统时间函数OSTimeGet()OSTimeGet()和和OSTimeSet()OSTimeSet() 无论时钟节拍何时发生,无论时钟节拍何时发生,C COS-

33、IIOS-II都会将一个都会将一个3232位的计数器加位的计数器加1 1。这个计数。这个计数器在调用器在调用OSStart()OSStart()初始化多任务和初始化多任务和42949672954294967295个节拍执行完一遍后,从个节拍执行完一遍后,从0 0开开始计数。在时钟节拍频率等于始计数。在时钟节拍频率等于100Hz100Hz时,这个时,这个3232位的计数器每隔位的计数器每隔497497天就重新天就重新开始计数。在执行的过程中可以通过调用开始计数。在执行的过程中可以通过调用OSTimeGet()OSTimeGet()函数来获得该计数器的函数来获得该计数器的当前值,也可以通过调用当前

34、值,也可以通过调用OSTimeSet()OSTimeSet()函数来改变该计数器的值。函数来改变该计数器的值。272、任务的管理C COS-IIOS-II提过大量的提过大量的APIAPI函数实现对任务的管理,主要的任务有:函数实现对任务的管理,主要的任务有:(1 1)建立任务)建立任务 C COS-IIOS-II要管理用户的任务,就必须先建立任务。通过将任务要管理用户的任务,就必须先建立任务。通过将任务的地址和其他参数传递给以下两个函数来建立任务。的地址和其他参数传递给以下两个函数来建立任务。OSTaskCreate()OSTaskCreate()和带有扩展附加功能的和带有扩展附加功能的OST

35、askCreateExt()OSTaskCreateExt()函数。函数。在在main()main()函数内开始多任务调度(函数内开始多任务调度(OSStart()OSStart()前,必须至少建立前,必须至少建立一个任务,而且任务不能由中断服务程序(一个任务,而且任务不能由中断服务程序(ISRISR)建立。)建立。 创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。还有使刚创建的任务进入就绪状关联起来形成一个完整的任务。还有使刚创建的任务进入就绪状态,并引发一次任务调度(取决于任务是否处于多多任务工作状

36、态,并引发一次任务调度(取决于任务是否处于多多任务工作状态)。态)。28两个函数两个函数OSTaskCreate()OSTaskCreate()和和OSTaskCreateExt()OSTaskCreateExt()原原型如下:型如下:INT8U OSTaskCreate(INT8U OSTaskCreate( void ( void (* *task)(void task)(void * *pd); /pd); /指向任务的指向任务的指针指针 void void * * pdata; / pdata; /传递给任务传递给任务的参数的参数 OS_STK OS_STK * * ptos; / p

37、tos; /指向任务堆栈栈指向任务堆栈栈顶的指针顶的指针 INT8U prio / INT8U prio /任务的优先任务的优先级级 ) )29INT8U OSTaskCreateExt(INT8U OSTaskCreateExt( void ( void (* *task)(void task)(void * *pd); /pd); /指向任务的指针指向任务的指针 void void * * pdata; / pdata; /传递给任务的参数传递给任务的参数 OS_STK OS_STK * * ptos; / ptos; /指向任务堆栈栈顶的指针指向任务堆栈栈顶的指针 INT8U prio

38、/ INT8U prio /任务的优先级任务的优先级 INT16U id / INT16U id /任务的标识任务的标识 OS_STK OS_STK * * pbos; / pbos; /指向任务堆栈栈低的指针指向任务堆栈栈低的指针 INT32U stk_siaze; / INT32U stk_siaze; /任务堆栈容量任务堆栈容量 void void * * pext; / pext; /指向附加数据域的指针指向附加数据域的指针 INT16U opt / INT16U opt /用于设定操作选项用于设定操作选项 ) ) 在调用任务建立函数后,在调用任务建立函数后, C COS-IIOS-I

39、I内核会首先从内核会首先从TCBTCB空闲列表内申空闲列表内申请一个空的请一个空的TCBTCB指针;然后根据用户给出的参数初始化任务堆栈,并在指针;然后根据用户给出的参数初始化任务堆栈,并在内部的任务就绪表中标记该任务为就绪状态;最后返回。这样就建立内部的任务就绪表中标记该任务为就绪状态;最后返回。这样就建立了一个任务。了一个任务。30(2 2)任务堆栈)任务堆栈在在C COS-IIOS-II中,每个任务都有自己的堆栈空间。堆栈必须声明为中,每个任务都有自己的堆栈空间。堆栈必须声明为OS_STKOS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空类型,并且由连续的内存空间组成。可以静

40、态分配堆栈空间(在编译时分配),也可以动态分配堆栈空间(在运行时分间(在编译时分配),也可以动态分配堆栈空间(在运行时分配),这两种声明方式都应放置在函数外面。配),这两种声明方式都应放置在函数外面。任务所需堆栈的容量由应用程序确定。但必须考虑到任务调用的所任务所需堆栈的容量由应用程序确定。但必须考虑到任务调用的所有函数的嵌套情况、任务调用的所有函数为局部变量分配的所有有函数的嵌套情况、任务调用的所有函数为局部变量分配的所有内存的数目,以及所有可能的中断服务子程序嵌套对堆栈的需求。内存的数目,以及所有可能的中断服务子程序嵌套对堆栈的需求。此外,堆栈必须能够保存此外,堆栈必须能够保存CPUCPU

41、所有的寄存器。所有的寄存器。C COS-IIOS-II提供了堆栈检验函数提供了堆栈检验函数OSTaskStkChk()OSTaskStkChk(),用来确定任务实,用来确定任务实际需要的堆栈空间的大小。这样能够避免为任务分配过多的堆栈际需要的堆栈空间的大小。这样能够避免为任务分配过多的堆栈空间,从而减少应用程序代码所需的空间,从而减少应用程序代码所需的RAMRAM数量。调用堆栈检验函数量。调用堆栈检验函数后,所得到的只是一个大致的堆栈使用情况,并不能说明堆栈数后,所得到的只是一个大致的堆栈使用情况,并不能说明堆栈使用的全部实际情况。为了适应系统以后的升级和扩展,应该多使用的全部实际情况。为了适

42、应系统以后的升级和扩展,应该多分配分配1010100100的堆栈空间。的堆栈空间。31(3 3)任务的挂起和恢复)任务的挂起和恢复 挂起一个任务,就是停止这个任务的运行。挂起一个任务,就是停止这个任务的运行。在在C/OS-IIC/OS-II中,用户任务可以通过调用系统提中,用户任务可以通过调用系统提供的函数供的函数OSTaskSuspend()OSTaskSuspend()来挂起自身或者除空来挂起自身或者除空闲任务之外的其他任务。挂起的任务,只能在其闲任务之外的其他任务。挂起的任务,只能在其他任务中通过调用恢复函数他任务中通过调用恢复函数OSTaskResume()OSTaskResume()

43、使其使其恢复为就绪状态。恢复为就绪状态。 但是,如果任务在被挂起的同时还在等待但是,如果任务在被挂起的同时还在等待延迟时间到,则需要对任务取消挂起操作,并且延迟时间到,则需要对任务取消挂起操作,并且要继续等待延迟时间到,任务才能转入就绪状态。要继续等待延迟时间到,任务才能转入就绪状态。32(4 4)任务的删除)任务的删除 删除一个任务,就是把该任务置于睡眠状态,任务的代码不再被删除一个任务,就是把该任务置于睡眠状态,任务的代码不再被C/OS-IIC/OS-II使用,而并不是说任务的代码被删除了。调用使用,而并不是说任务的代码被删除了。调用OSTaskDel()OSTaskDel()后,先进行条

44、件判断,当所有的条件都满足后,就会后,先进行条件判断,当所有的条件都满足后,就会从所有可能的从所有可能的C/OS-IIC/OS-II的数据结构中去除任务的任务控制块的数据结构中去除任务的任务控制块OS_TCB,OS_TCB,这样就不会被其他的任务或中断服务子程序置于就绪态,这样就不会被其他的任务或中断服务子程序置于就绪态,即任务置于休眠状态。即任务置于休眠状态。函数原型如下:函数原型如下: INT8U OSTaskDel(INT8U prio) INT8U OSTaskDel(INT8U prio) 可删除任务自身或者除了空闲任务之外的其他任务。删除自己参可删除任务自身或者除了空闲任务之外的其

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

46、成删除的函数。原型如下: INT8U OSTaskDelReq(INT8U prio) INT8U OSTaskDelReq(INT8U prio) 返回是否被删除和是否有返回是否被删除和是否有要删除自己的要求。被删除方调用得知要删除自己,释放资源后,要删除自己的要求。被删除方调用得知要删除自己,释放资源后,在删除自己。在删除自己。33(5 5)其他任务管理函数)其他任务管理函数 任务优先级别修改任务优先级别修改 任务运行过程中,用户可以根据需要来改变任务的优先级别。任务运行过程中,用户可以根据需要来改变任务的优先级别。调用的函数原型如下:调用的函数原型如下: INT8U OSTaskChan

47、gePrio( INT8U OSTaskChangePrio( INT8U oldprio; / INT8U oldprio; /任务现在的优先级别任务现在的优先级别 INT8U newprio / INT8U newprio /要修改的优先级别要修改的优先级别 ) ) 查询任务的信息查询任务的信息 查询一些任务中的信息,函数原型如下:查询一些任务中的信息,函数原型如下: INT8U OSTaskQuery( INT8U OSTaskQuery( INT8U prio; INT8U prio; OS_TCB OS_TCB * * pdata pdata ) )343、任务间同步与通信的管理 C

48、/OS-IIC/OS-II中,使用信号量、邮箱(消息邮箱)和消息队列中,使用信号量、邮箱(消息邮箱)和消息队列来实现任务相互同步或相互之间的通信。来实现任务相互同步或相互之间的通信。 C/OS-II C/OS-II把关于它们的操作都定义为全局函数,以供应把关于它们的操作都定义为全局函数,以供应用程序的所有任务来调用用程序的所有任务来调用. . 等待任务列表等待任务列表 采用采用INT8UINT8U类型的数组类型的数组OSEventTblOSEventTbl作为记录等待事件任作为记录等待事件任务的记录表,叫做等待任务表,每个任务占务的记录表,叫做等待任务表,每个任务占1 1位,为位,为1 1表示

49、表示是等待任务。是等待任务。 任务的等待时限,记录在等待任务的任务控制块任务的等待时限,记录在等待任务的任务控制块TCBTCB的成员的成员OSTCBDlyOSTCBDly中中35(1 1)事件控制块)事件控制块 C/OS-II C/OS-II使用叫做事件控制块使用叫做事件控制块ECBECB的数的数据结构来描述诸如信号量、邮箱和消息队列据结构来描述诸如信号量、邮箱和消息队列这些事件。事件控制块包含包括等待任务表这些事件。事件控制块包含包括等待任务表在内的所有有关事件的数据。在内的所有有关事件的数据。36 操作事件控制块的函数操作事件控制块的函数 C/OS-IIC/OS-II有有4 4个对事件控制

50、块进行基本操作的函数(定义在个对事件控制块进行基本操作的函数(定义在OS_CORE.COS_CORE.C中)。中)。 事件控制块的初始化函数事件控制块的初始化函数 void OS_EventWaitListInit(OS_ENENT void OS_EventWaitListInit(OS_ENENT * * pevent ) pevent ) 把变量把变量OSEventGrpOSEventGrp及任务等待表中的每一位都清及任务等待表中的每一位都清0 0,即令事,即令事件的任务等待表中不含有任何等待任务。该函数被件的任务等待表中不含有任何等待任务。该函数被OSXXXCreateOSXXXCre

51、ate()创建时所调用。()创建时所调用。 XXX Sem XXX Sem 信号量信号量 Mutex Mutex 互斥信号量互斥信号量 Mbox Mbox 消息邮箱消息邮箱 Q Q 消息队列消息队列37 使一个任务进入等待状态的函数使一个任务进入等待状态的函数 void OS_EventTaskWait( OS_ENENT void OS_EventTaskWait( OS_ENENT * * pevent) pevent) 将在任务调用函数将在任务调用函数OSXXXPendOSXXXPend()请求一个事件时调用。()请求一个事件时调用。 使一个正在等待任务进入就绪状态的函数使一个正在等待任

52、务进入就绪状态的函数 INT8U OS_EventTaskRdy( OS_EVENT INT8U OS_EventTaskRdy( OS_EVENT * * pevent, pevent, void void * *msg , INT8U msk) msg , INT8U msk) 作用:把调用这个函数的任务在任务等待表中的位置清作用:把调用这个函数的任务在任务等待表中的位置清0 0后,再把后,再把任务在任务就绪表中的对应的位置任务在任务就绪表中的对应的位置1 1,然后引发一次任务调度,然后引发一次任务调度 将在任务调用函数将在任务调用函数OSXXXPostOSXXXPost()发送一个事件时

53、,被调用。()发送一个事件时,被调用。 使一个等待超时的任务仅需就绪状态的函数使一个等待超时的任务仅需就绪状态的函数 void OS_EventTo(OS_EVENT void OS_EventTo(OS_EVENT * *pevent)pevent) 作用:当任务已经超过了等待的时间,却要使它进入就绪状态。作用:当任务已经超过了等待的时间,却要使它进入就绪状态。 将在任务调用函数将在任务调用函数OSXXXPendOSXXXPend()请求一个事件时,被调用。()请求一个事件时,被调用。38(2)信号量管理 使用信号量可以在任务间传递信息,实现任务使用信号量可以在任务间传递信息,实现任务与任务

54、或中断服务子程序的同步。与任务或中断服务子程序的同步。 C/OS-IIC/OS-II中的信中的信号量由两部分组成:号量由两部分组成:1616位的无符号整数信号量的计数值(位的无符号整数信号量的计数值(0 06553565535);另);另一部分是由等待该信号量的任务组成的等待任务列表。一部分是由等待该信号量的任务组成的等待任务列表。 C/OS-II C/OS-II提供了提供了以下以下6 6个函数对信号量进行操作。个函数对信号量进行操作。 操作操作 创建信号量创建信号量OSSemCreatOSSemCreat(INT16U cntINT16U cnt)创建,返回)创建,返回已创建信号量的指针。已

55、创建信号量的指针。 请求信号量请求信号量OSSemPendOSSemPend(OS_EVENT OS_EVENT * *pevent,INT16U pevent,INT16U timeout,NT8U timeout,NT8U * *errerr)39 time time为为0 0,则表示无限等待。,则表示无限等待。 不等待调用的函数为不等待调用的函数为OSSemAcceptOSSemAccept(OS_EVENT OS_EVENT * * pevent pevent)。)。 发送信号量发送信号量 INT8U OSSemPost INT8U OSSemPost(OS_EVENT OS_EVEN

56、T * * pevent pevent) 当获得信号量,访问共享资源结束以后,释放当获得信号量,访问共享资源结束以后,释放信号量,调用该函数。先检查是否有等待该信号信号量,调用该函数。先检查是否有等待该信号量的任务。没有,信号量计数器加量的任务。没有,信号量计数器加1 1,有,则调,有,则调用调度器用调度器OS_SchedOS_Sched()。()。40 删除信号量删除信号量 OS_EVENT OS_EVENT * *OSSemDel( OS_EVENT OSSemDel( OS_EVENT * * pevent, pevent, INT8U opt, INT8U INT8U opt, INT

57、8U * *err)err) opt OS_DEL_NO_PEND opt OS_DEL_NO_PEND 没有等待任务删除没有等待任务删除 OS_DEL_ALLWAYS OS_DEL_ALLWAYS 立即删除立即删除 只能任务执行,不能在中断服务程序中删除只能任务执行,不能在中断服务程序中删除 查询信号量的状态查询信号量的状态 INT8U OSSemQuery INT8U OSSemQuery(OS_EVENT OS_EVENT * * pevent, pevent, OS_SEM_DATA OS_SEM_DATA * *pdatapdata) pdata pdata是一个结构指针,存储信号量

58、的状态。是一个结构指针,存储信号量的状态。41(3)消息邮箱管理 消息邮箱是消息邮箱是C/OS-IIC/OS-II中的一种通信机制,通常使用时要先中的一种通信机制,通常使用时要先定义一个指针型的变量该指针指向一个包含了消息内容的定义一个指针型的变量该指针指向一个包含了消息内容的特定数据结构。发送消息的任务或中断服务子程序把这个特定数据结构。发送消息的任务或中断服务子程序把这个变量送往邮箱,接收消息的任务从邮箱中取出该指针变量,变量送往邮箱,接收消息的任务从邮箱中取出该指针变量,完成信息交换。完成信息交换。 C/OS-II C/OS-II提供提供6 6种对消息邮箱的操作,它种对消息邮箱的操作,它

59、们通过以下函数实现:们通过以下函数实现: 创建创建OS_EVENT OS_EVENT * * OSMoxCreate( void OSMoxCreate( void * * msg) msg)MsgMsg为消息指针,一般初始为为消息指针,一般初始为NuLLNuLL。42 向消息邮箱发送消息向消息邮箱发送消息INT8U OSMboxPostINT8U OSMboxPost(OS_EVENT OS_EVENT * * pevent, pevent, void void * * msg msg)发送广播消息发送广播消息INT8U OSMboxPostOptINT8U OSMboxPostOpt(OS

60、_EVENT OS_EVENT * * pevent, pevent, void void * * msg, INT8U opt msg, INT8U opt)opt: OS_POST_OPT_BROADCAST opt: OS_POST_OPT_BROADCAST 广播消息广播消息 OS_POST_OPT_NONE OS_POST_OPT_NONE 最高优先级最高优先级43 请求消息邮箱请求消息邮箱void void * * OSMboxPend OSMboxPend(OS_EVENT OS_EVENT * * pevent, pevent, INT16U timeout, INT16U t

温馨提示

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

评论

0/150

提交评论