嵌入式系统arm大连理工第5章ii实时操作系统_第1页
嵌入式系统arm大连理工第5章ii实时操作系统_第2页
嵌入式系统arm大连理工第5章ii实时操作系统_第3页
嵌入式系统arm大连理工第5章ii实时操作系统_第4页
嵌入式系统arm大连理工第5章ii实时操作系统_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

1、1 绪、绪、 Jean J. Labrosse Jean J. Labrosse的故事的故事8080年代末,我设计了一个基于年代末,我设计了一个基于Intel 80C188Intel 80C188的产品,的产品,需要一个实时内核。需要一个实时内核。使用一个知名的内核太贵了,廉价的内核使用一个知名的内核太贵了,廉价的内核B B(当时大约(当时大约10001000美元以下美元以下) )让我总给该厂商打电话求援。该厂商让我总给该厂商打电话求援。该厂商声称内核声称内核B B是用是用C C语言写的,可我还得用汇编语言初语言写的,可我还得用汇编语言初始化程序的每个对象,实在是烦透了,产品的开发始化程序的每

2、个对象,实在是烦透了,产品的开发也耽误了。也耽误了。后来我得知我是该厂商的第一个客户后来我得知我是该厂商的第一个客户第五章第五章 C/OS-IIC/OS-II在在ARMARM系统中的系统中的应用与开发应用与开发2 至今, C/OS的书已售出了15,000多册。 C/OS已被移植到以下一些CPU上。Analog 设备公司 AD21xxARM公司 ARM 6, ARM7日立公司 64180,H8/3xx,SH系列Intel公司 80 x86(Real and PM),Pentium, Pentium II, 8051,8052, MCS-251,80196,8096三菱公司 M16和M32摩托罗拉

3、公司 PowerPC, 飞利浦公司 XA西门子公司 80C166和TriCoreTI公司 TMS320Zilog公司 Z80 和Z1803C/OS-II意为“微控制器操作系统版本2”。世界上已有数千人在各个领域使用C/OS,例如,照相机行业、医疗器械、音响设施、发动机控制、网络设备、高速公路电话系统、自动提款机、工业机器人等等。很多高等院校将C/OS用于实时系统教学。4C/OS 的几个典型应用NSA2010NSA2010便携式电话,在日本便携式电话,在日本大约有大约有1500015000台投入市场。使用台投入市场。使用C/OSC/OS实时操作系统。实时操作系统。CYCLONECYCLONE移动

4、电话,移动电话,Hitachi Hitachi H8S/2318kH8S/2318k微程序控制器,微程序控制器,256K256K闪存和闪存和8K Ram8K Ram, C/OS C/OS 实时操实时操作系统。作系统。选择选择C/OS的原因:的原因:INFEA R&D的职员从的职员从1996年以来开始应用年以来开始应用Micrim实时操作系统。通过比较,还实时操作系统。通过比较,还没有发现比没有发现比C/OS更好的实时操作系统。我们将继续应用更好的实时操作系统。我们将继续应用C/OS以及以及Micrim的的其它产品包括下一代其它产品包括下一代C/OS-II V2.52的产品。的产品。 5

5、三轴运动控制卡Hitachi SH2Hitachi SH2微处理器;微处理器;77个任务;个任务;时钟频率时钟频率10Hz10Hz;用于加工眼镜的塑料镜用于加工眼镜的塑料镜片的计算机控制车床片的计算机控制车床的运动控制。的运动控制。选择选择C/OS-IIC/OS-II的原因:的原因: 主要原因是它与其它市场上的实时操作系统相比的相对低廉的费用。主要原因是它与其它市场上的实时操作系统相比的相对低廉的费用。另一个主要原因是资源和内设的可获得性。最后一点,另一个主要原因是资源和内设的可获得性。最后一点,C/OS-IIC/OS-II有足够有足够的能力使我们能够顺利完成工作。的能力使我们能够顺利完成工作

6、。SH-2SH-2快速,有效的执行与快速,有效的执行与C/OS-IIC/OS-II的的实时内核是使工作顺利完成的最重要的条件。实时内核是使工作顺利完成的最重要的条件。6MB-20-M信用卡处理装置 TCP/IPTCP/IP协议;协议;20MHz Am188ES20MHz Am188ES;1010项任务;项任务;时钟频率时钟频率100Hz100Hz; MB-20-M MB-20-M被用于对很多的教被用于对很多的教学和商务设备的控制使用和收学和商务设备的控制使用和收费费, ,包括身份证,安全卡和图包括身份证,安全卡和图书馆借阅卡,现在只要应用标书馆借阅卡,现在只要应用标准磁条的用户卡都可以在准磁条

7、的用户卡都可以在MB-MB-20-M20-M终端上使用。终端上使用。选择选择C/OS-IIC/OS-II的原因:的原因: 价格便宜,代码尺寸小,缩短开发周期价格便宜,代码尺寸小,缩短开发周期7独立静态交换机 Hitachi H8S/2357 CPU Hitachi H8S/2357 CPU 4 4个任务个任务 时钟频率时钟频率1000Hz1000Hz 独立静态交换机(独立静态交换机(SIELSIEL交换机)交换机)是一个可以连续的瞬时改变电源的是一个可以连续的瞬时改变电源的装置从而控制两条电线的状态,最装置从而控制两条电线的状态,最终保证负载的最佳电力供给。这种终保证负载的最佳电力供给。这种机

8、器同样可以保护负载以防短路。机器同样可以保护负载以防短路。选择选择C/OSIIC/OSII的原因:的原因: 与其它实时方案相比低廉的价格,与很多微处理器可与其它实时方案相比低廉的价格,与很多微处理器可以进行数据传输,对源代码的完全控制。以进行数据传输,对源代码的完全控制。8COS-是一个免费的、源代码公开的实时嵌入式内是一个免费的、源代码公开的实时嵌入式内核,其内核提供了实时系统所需要的一些基本功能。其核,其内核提供了实时系统所需要的一些基本功能。其中包含全部功能的核心部分代码占用中包含全部功能的核心部分代码占用8.3 KB,全部的源,全部的源代码约代码约5500行,结构合理、清晰易懂,且注解

9、详尽,非行,结构合理、清晰易懂,且注解详尽,非常适合初学者进行学习分析。常适合初学者进行学习分析。COS-不仅使用户得不仅使用户得到廉价的解决方案,而且由于到廉价的解决方案,而且由于COS-的开放源代码的开放源代码特性,还使用户可针对自己的硬件优化代码,获得更好特性,还使用户可针对自己的硬件优化代码,获得更好的性能。的性能。 COS-是在是在PC机上开发的,机上开发的,C编辑器使用的是编辑器使用的是Borland C/C+3.1版。从早期使用的版。从早期使用的COS到现在的到现在的COS- V2.52版,应用的实例也进一步说明了该内核版,应用的实例也进一步说明了该内核的实用性和可靠性。的实用性

10、和可靠性。5.1 5.1 C/OS-IIC/OS-II系统的特点及结构系统的特点及结构 95.1.1 5.1.1 C COS-OS-系统的特点系统的特点1 1有源代码,有源代码,C COS-OS-源代码是开放的,用户可登源代码是开放的,用户可登录录C COS-OS-的网站的网站(www(wwwuCOS-IIuCOS-IIcom)com)下载针对不下载针对不同微处理器的移植代码。这极大地方便了实时嵌入式同微处理器的移植代码。这极大地方便了实时嵌入式系统系统C COS-OS-的开发,降低了开发成本。的开发,降低了开发成本。2 2可移植可移植(Portable)(Portable),C COS-OS

11、-的源代码中,除了的源代码中,除了与微处理器硬件相关的部分是使用汇编语言编写的,与微处理器硬件相关的部分是使用汇编语言编写的,其绝大部分是使用移植性很强的其绝大部分是使用移植性很强的ANSI CANSI C来编写的。并来编写的。并且把用汇编语言编写的部分已经压缩到最低的限度,且把用汇编语言编写的部分已经压缩到最低的限度,以使以使C COS-OS-更方便于移植到其他微处理器上使用。更方便于移植到其他微处理器上使用。如如IntelIntel公司、公司、ZilogZilog公司、公司、MotorolaMotorola公司的微控制器公司的微控制器和和TITI公司的公司的DSPDSP,以及包括,以及包括

12、ARMARM公司、公司、Analog DeviceAnalog Device公司、三菱公司、日立公司、飞利浦公司和西门子公公司、三菱公司、日立公司、飞利浦公司和西门子公司的各种微处理器。司的各种微处理器。 103 3可固化可固化(ROMable)(ROMable),C COS-OS-是为嵌入式应用而设是为嵌入式应用而设计的操作系统,只要具备有合适的软硬件工具,就可将计的操作系统,只要具备有合适的软硬件工具,就可将C COS-OS-嵌入到产品中去,从而成为产品的一部分。嵌入到产品中去,从而成为产品的一部分。 4 4可裁剪可裁剪(Scalable)(Scalable),C COS-OS-可根据实际

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

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

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

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

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

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

19、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文文件中用定义常数语句件中用定义常数语句#def

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

21、OSTaskChangePrio()OSTaskChangePrio()或者或者OSTaskDel()OSTaskDel()。 为了使为了使C COS-IIOS-II能管理用户任务,用户必能管理用户任务,用户必须在建立一个任务的时候,将任务的起始须在建立一个任务的时候,将任务的起始地址与其他参数一起传给地址与其他参数一起传给OSTaskCreate()OSTaskCreate()或者或者OSTaskCreateExt()OSTaskCreateExt()这两个函数中的任这两个函数中的任何一个函数。图何一个函数。图5-15-1是是C COS-IIOS-II控制下的控制下的任务状态转换图,在任一时

22、刻,任务的状任务状态转换图,在任一时刻,任务的状态一定是这五种状态之一。态一定是这五种状态之一。14由于,由于,C COS-IIOS-II总是运行进入就绪态任务中优先级最高的那个总是运行进入就绪态任务中优先级最高的那个任务。那么确定哪一个任务优先级最高、该哪个任务将要运行,任务。那么确定哪一个任务优先级最高、该哪个任务将要运行,这样的工作是由调度器完成的。这样的工作是由调度器完成的。C COS-IIOS-II任务调度所花的时间任务调度所花的时间是常数,与应用程序中建立的任务数无关。任务切换很简单,一是常数,与应用程序中建立的任务数无关。任务切换很简单,一般由以下两步完成:首先将被挂起任务的微处

23、理器寄存器推入堆般由以下两步完成:首先将被挂起任务的微处理器寄存器推入堆栈;然后将较高优先级的任务的寄存器值从堆栈中恢复到寄存器栈;然后将较高优先级的任务的寄存器值从堆栈中恢复到寄存器中。在中。在C COS-IIOS-II中,就绪任务的栈结构总是看起来跟刚刚发生中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,C COS-IIOS-II运行就绪态的任务所要做的一切,只是恢复所有的运行就绪态的任务所要做的一切,只是恢复所有的CPUCPU寄存器并运行中断返回指令。寄存器并运行中断返回指令。 155

24、.1.3 5.1.3 主要模块介绍主要模块介绍1 1内存管理内存管理在在ANSI CANSI C中,一般采用内存分配函数中,一般采用内存分配函数malloc()malloc()和内存释和内存释放函数放函数free()free()两个函数动态地分配和释放内存。为了消两个函数动态地分配和释放内存。为了消除多次动态分配与释放内存所引起的内存碎片和分配、除多次动态分配与释放内存所引起的内存碎片和分配、释放函数执行时间的不确定性的现象,释放函数执行时间的不确定性的现象,C COS-OS-把连把连续的大块内存按分区来进行管理。每个分区中都包含若续的大块内存按分区来进行管理。每个分区中都包含若干个存储容量大

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

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

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

28、SMemPut()函数,释放一个内存块。当某一任务函数,释放一个内存块。当某一任务不再使用一个内存块时,必须及时地把它放回到相应的不再使用一个内存块时,必须及时地把它放回到相应的内存分区中,以便下一次的分配操作。内存分区中,以便下一次的分配操作。 OSMemQuery()OSMemQuery()函数,用于查询一个特定内存分区函数,用于查询一个特定内存分区的状态。如查询某内存分区中内存块的大小、可用内存的状态。如查询某内存分区中内存块的大小、可用内存块数和正在使用的内存块数等信息。块数和正在使用的内存块数等信息。17(3 3)时间管理)时间管理与大部分内核一样,与大部分内核一样,C COS-OS

29、-要求提供定时中断,以实现延时要求提供定时中断,以实现延时与超时控制等功能。这个定时中断也可以被叫作为时钟节拍。在与超时控制等功能。这个定时中断也可以被叫作为时钟节拍。在相关的内容中,介绍了时钟的中断服务子程序(相关的内容中,介绍了时钟的中断服务子程序(ISRISR)和时钟节)和时钟节拍函数拍函数OSTimeTick()OSTimeTick()。时钟节拍函数的作用是用于通知。时钟节拍函数的作用是用于通知C COS-OS-发生了时钟节拍中断,下面再介绍几个可以处理时间问题的函发生了时钟节拍中断,下面再介绍几个可以处理时间问题的函数。数。任务延时函数任务延时函数OSTimeDIy()OSTimeD

30、Iy() 调用该函数会使调用该函数会使C COS-OS-进行一次任务调度,并且执行下进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用一个优先级最高的就绪态任务。任务调用OSTimeDly()OSTimeDly()后,一旦后,一旦规定的时间期满或者有其他任务通过调用规定的时间期满或者有其他任务通过调用OSTimeDlyResume()OSTimeDlyResume()取取消了延时,它就会立即进入就绪状态。只有当该任务在所有就绪消了延时,它就会立即进入就绪状态。只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。任务中具有最高的优先级时,它才会立即运行。恢复延时的任务函

31、数恢复延时的任务函数OSTimeDlyResume()OSTimeDlyResume() C COS-IIOS-II具有允许结束正处于延时期的任务的功能。具体具有允许结束正处于延时期的任务的功能。具体方法是通过调用方法是通过调用OSTimeDlyResume()OSTimeDlyResume()和指定要恢复的任务的优先和指定要恢复的任务的优先级的方式,这样延时的任务就可以不用等待延时期满,而是通过级的方式,这样延时的任务就可以不用等待延时期满,而是通过其 他 任 务 取 消 延 时 来 使 自 己 处 于 就 绪 态 。 实 际 上 ,其 他 任 务 取 消 延 时 来 使 自 己 处 于 就

32、 绪 态 。 实 际 上 ,OSTimeDlyResume()OSTimeDlyResume()也可唤醒正在等待事件的任务。也可唤醒正在等待事件的任务。18按时、分、秒、毫秒延时函数按时、分、秒、毫秒延时函数OSTimeDlyHMSM()OSTimeDlyHMSM() OSTimeDly() OSTimeDly()是一个非常有用的函数,但用户的应用程序须要是一个非常有用的函数,但用户的应用程序须要知道延时时间所对应的时钟节拍的数目。增加了知道延时时间所对应的时钟节拍的数目。增加了OSTimeDlyHMSM()OSTimeDlyHMSM()函数后,就可按时、分、秒和毫秒来定义时间了,这样会显得更

33、函数后,就可按时、分、秒和毫秒来定义时间了,这样会显得更加方便。与加方便。与OSTimeDly()OSTimeDly()一样,调用一样,调用OSTimeDIyHMSM()OSTimeDIyHMSM()函数也会使函数也会使C COS-IIOS-II进行一次任务调度,并且执行下一个优先级最高的就进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用绪态任务。任务调用OSTimeDlyHMSM()OSTimeDlyHMSM()后,一旦规定的时间期满后,一旦规定的时间期满或有其他任务通过调用或有其他任务通过调用OSTimeDlyResume()OSTimeDlyResume()取消了延时,它

34、就会取消了延时,它就会立即处于就绪态。同样,只有当该任务在所有就绪态任务中具有立即处于就绪态。同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。最高的优先级时,它才会立即运行。系统时间函数系统时间函数OSTimeGet()OSTimeGet()和和OSTimeSet()OSTimeSet() 无论时钟节拍何时发生,无论时钟节拍何时发生,C COS-IIOS-II都会将一个都会将一个3232位的计数位的计数器加器加1 1。这个计数器在调用。这个计数器在调用OSStart()OSStart()初始化多任务和初始化多任务和 个节拍执行完一遍后,从个节拍执行完一遍后,从0 0开始

35、计数。在时钟节拍频率等于开始计数。在时钟节拍频率等于100Hz100Hz时,这个时,这个3232位的计数器每隔位的计数器每隔497497天就重新开始计数。在执行的过天就重新开始计数。在执行的过程中可以通过调用程中可以通过调用OSTimeGet()OSTimeGet()函数来获得该计数器的当前值,函数来获得该计数器的当前值,也可以通过调用也可以通过调用OSTimeSet()OSTimeSet()函数来改变该计数器的值。函数来改变该计数器的值。192 2、任务的管理、任务的管理COS-II提过大量的提过大量的API函数实现对任务的管理,主要的任务函数实现对任务的管理,主要的任务有:有:(1)建立任

36、务)建立任务COS-II要管理用户的任务,就必须先建立任务。通过将任务要管理用户的任务,就必须先建立任务。通过将任务的地址和其他参数传递给以下两个函数来建立任务。的地址和其他参数传递给以下两个函数来建立任务。OSTaskCreate()和带有扩展附加功能的和带有扩展附加功能的OSTaskCreateExt()函数。函数。在在main()函数内开始多任务调度(函数内开始多任务调度(OSStart()前,必须至少建立一前,必须至少建立一个任务,而且任务不能由中断服务程序(个任务,而且任务不能由中断服务程序(ISR)建立。)建立。创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈创建一个任务控

37、制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。还有使刚创建的任务进入就绪状关联起来形成一个完整的任务。还有使刚创建的任务进入就绪状态,并引发一次任务调度(取决于任务是否处于多多任务工作状态,并引发一次任务调度(取决于任务是否处于多多任务工作状态)。态)。20两个函数两个函数OSTaskCreate()OSTaskCreate()和和OSTaskCreateExt()OSTaskCreateExt()原型如下:原型如下:INT8U OSTaskCreate(INT8U OSTaskCreate( void ( void (* *task)(void task)(void

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

39、 pdata; / pdata; /传递给任务的参数传递给任务的参数 OS_STK OS_STK * * ptos;/ ptos;/指向任务堆栈栈顶的指针指向任务堆栈栈顶的指针 INT8U prio / INT8U prio /任务的优先级任务的优先级 INT16U id / INT16U id /任务的标识任务的标识 OS_STK OS_STK * * pbos;/ pbos;/指向任务堆栈栈低的指针指向任务堆栈栈低的指针 INT32U stk_siaze; / INT32U stk_siaze; /任务堆栈容量任务堆栈容量 void void * * pext; / pext; /指向附加

40、数据域的指指向附加数据域的指针针 INT16U opt / INT16U opt /用于设定操作选项用于设定操作选项 ) ) 在调用任务建立函数后,在调用任务建立函数后, C COS-IIOS-II内核会首先从内核会首先从TCBTCB空闲列表内申请一个空的空闲列表内申请一个空的TCBTCB指针;然后根据用户给指针;然后根据用户给出的参数初始化任务堆栈,并在内部的任务就绪表中标出的参数初始化任务堆栈,并在内部的任务就绪表中标记该任务为就绪状态;最后返回。这样就建立了一个任记该任务为就绪状态;最后返回。这样就建立了一个任务。务。22(2 2)任务堆栈)任务堆栈在在C COS-IIOS-II中,每个

41、任务都有自己的堆栈空间。堆栈中,每个任务都有自己的堆栈空间。堆栈必须声明为必须声明为OS_STKOS_STK类型,并且由连续的内存空间组成。类型,并且由连续的内存空间组成。可以静态分配堆栈空间(在编译时分配),也可以动态可以静态分配堆栈空间(在编译时分配),也可以动态分配堆栈空间(在运行时分配),这两种声明方式都应分配堆栈空间(在运行时分配),这两种声明方式都应放置在函数外面。放置在函数外面。任务所需堆栈的容量由应用程序确定。但必须考虑到任任务所需堆栈的容量由应用程序确定。但必须考虑到任务调用的所有函数的嵌套情况、任务调用的所有函数为务调用的所有函数的嵌套情况、任务调用的所有函数为局部变量分配

42、的所有内存的数目,以及所有可能的中断局部变量分配的所有内存的数目,以及所有可能的中断服务子程序嵌套对堆栈的需求。此外,堆栈必须能够保服务子程序嵌套对堆栈的需求。此外,堆栈必须能够保存存CPUCPU所有的寄存器。所有的寄存器。C COS-IIOS-II提供了堆栈检验函数提供了堆栈检验函数OSTaskStkChk()OSTaskStkChk(),用来,用来确定任务实际需要的堆栈空间的大小。这样能够避免为确定任务实际需要的堆栈空间的大小。这样能够避免为任务分配过多的堆栈空间,从而减少应用程序代码所需任务分配过多的堆栈空间,从而减少应用程序代码所需的的RAMRAM数量。调用堆栈检验函数后,所得到的只是

43、一个数量。调用堆栈检验函数后,所得到的只是一个大致的堆栈使用情况,并不能说明堆栈使用的全部实际大致的堆栈使用情况,并不能说明堆栈使用的全部实际情况。为了适应系统以后的升级和扩展,应该多分配情况。为了适应系统以后的升级和扩展,应该多分配1010100100的堆栈空间。的堆栈空间。23(3 3)任务的挂起和恢复)任务的挂起和恢复挂起一个任务,就是停止这个任务的运行。在挂起一个任务,就是停止这个任务的运行。在uC/OS-IIuC/OS-II中,用户任务可以通过调用系统提供的中,用户任务可以通过调用系统提供的函数函数OSTaskSuspend()OSTaskSuspend()来挂起自身或者除空闲任来挂

44、起自身或者除空闲任务之外的其他任务。挂起的任务,只能在其他任务之外的其他任务。挂起的任务,只能在其他任务中通过调用恢复函数务中通过调用恢复函数OSTaskResume()OSTaskResume()使其恢复使其恢复为就绪状态。该函数并不要求和挂起函数为就绪状态。该函数并不要求和挂起函数OSTaskSuspend()OSTaskSuspend()成对使用。成对使用。但是,如果任务在被挂起的同时还在等待延迟时但是,如果任务在被挂起的同时还在等待延迟时间到,则需要对任务取消挂起操作,并且要继续间到,则需要对任务取消挂起操作,并且要继续等待延迟时间到,任务才能转入就绪状态。等待延迟时间到,任务才能转入

45、就绪状态。24(4 4)任务的删除)任务的删除 删除一个任务,就是把该任务置于睡眠状态,任务删除一个任务,就是把该任务置于睡眠状态,任务的代码不再被的代码不再被uC/OS-IIuC/OS-II使用,而并不是说任务的代码被使用,而并不是说任务的代码被删除了。调用删除了。调用OSTaskDel()OSTaskDel()后,先进行条件判断,当所后,先进行条件判断,当所有的条件都满足后,就会从所有可能的有的条件都满足后,就会从所有可能的uC/OS-IIuC/OS-II的数据的数据结构中去除任务的任务控制块结构中去除任务的任务控制块OS_TCB,OS_TCB,这样就不会被其这样就不会被其他的任务或中断服

46、务子程序置于就绪态,即任务置于休他的任务或中断服务子程序置于就绪态,即任务置于休眠状态。眠状态。函数原型如下:函数原型如下: INT8U OSTaskDel(INT8U prio) INT8U OSTaskDel(INT8U prio) 可删除任务自身或者除了空闲任务之外的其他任务。可删除任务自身或者除了空闲任务之外的其他任务。删除自己参数为:删除自己参数为: OS_PRIO_SELF OS_PRIO_SELF 直接调用这样的删除任务,可能出现某些问题,如直接调用这样的删除任务,可能出现某些问题,如果任务拥有一些动态的内存或者信号量之类的资源,那果任务拥有一些动态的内存或者信号量之类的资源,那

47、么如果它被删除了,它的资源就不会被释放而丢失,会么如果它被删除了,它的资源就不会被释放而丢失,会造成同样使用资源的其他任务进入死等待,出现错误情造成同样使用资源的其他任务进入死等待,出现错误情况。要慎重使用。提供了一个可以在请求删除方和被删况。要慎重使用。提供了一个可以在请求删除方和被删除方通信完成删除的函数。原型如下:除方通信完成删除的函数。原型如下: INT8U OSTaskDelReq(INT8U prio) INT8U OSTaskDelReq(INT8U prio) 返回是否被返回是否被删除和是否有要删除自己的要求。被删除方调用得知要删除和是否有要删除自己的要求。被删除方调用得知要删

48、除自己,释放资源后,在删除自己。删除自己,释放资源后,在删除自己。25(5 5)其他任务管理函数)其他任务管理函数任务优先级别修改任务优先级别修改 任务运行过程中,用户可以根据需要来改变任务的任务运行过程中,用户可以根据需要来改变任务的优先级别。调用的函数原型如下:优先级别。调用的函数原型如下: INT8U OSTaskChangePrio( INT8U OSTaskChangePrio( INT8U oldprio; / INT8U oldprio; /任务现在的优先级任务现在的优先级别别 INT8U newprio / INT8U newprio /要修改的优先级别要修改的优先级别 ) )

49、 查询任务的信息查询任务的信息 查询一些任务中的信息,函数原型如下:查询一些任务中的信息,函数原型如下: INT8U OSTaskQuery( INT8U OSTaskQuery( INT8U prio; INT8U prio; OS_TCB OS_TCB * * pdata pdata ) )263 3、任务间同步与通信的管理、任务间同步与通信的管理uC/OS-IIuC/OS-II中,使用信号量、邮箱(消息邮箱)和中,使用信号量、邮箱(消息邮箱)和消息队列来实现任务相互同步或相互之间的通信。消息队列来实现任务相互同步或相互之间的通信。 uC/OS-II uC/OS-II把关于它们的操作都定义

50、为全局函把关于它们的操作都定义为全局函数,以供应用程序的所有任务来调用数,以供应用程序的所有任务来调用等待任务列表等待任务列表 采用采用INT8UINT8U类型的数组类型的数组OSEventTblOSEventTbl作为记录作为记录等待事件任务的记录表,叫做等待任务表,每个等待事件任务的记录表,叫做等待任务表,每个任务占任务占1 1位,为位,为1 1表示是等待任务。表示是等待任务。任务的等待时限,记录在等待任务的任务控制块任务的等待时限,记录在等待任务的任务控制块TCBTCB的成员的成员OSTCBDlyOSTCBDly中中27(1 1)事件控制块)事件控制块 uC/OS-II uC/OS-II

51、使用叫做事件控制块使用叫做事件控制块ECBECB的数的数据结构来描述诸如信号量、邮箱和消息队列据结构来描述诸如信号量、邮箱和消息队列这些事件。事件控制块包含包括等待任务表这些事件。事件控制块包含包括等待任务表在内的所有有关事件的数据。在内的所有有关事件的数据。28操作事件控制块的函数操作事件控制块的函数 uC/OS-II uC/OS-II有有4 4个对事件控制块进行基本操作的个对事件控制块进行基本操作的函数(定义在函数(定义在OS_CORE.COS_CORE.C中)。中)。事件控制块的初始化函数事件控制块的初始化函数 void OS_EventWaitListInit(OS_ENENT voi

52、d OS_EventWaitListInit(OS_ENENT * * pevent )pevent ) 把变量把变量OSEventGrpOSEventGrp及任务等待表中的每一位都及任务等待表中的每一位都清清0 0,即令事件的任务等待表中不含有任何等待任,即令事件的任务等待表中不含有任何等待任务。该函数被务。该函数被OSXXXCreateOSXXXCreate()创建时所调用。()创建时所调用。 XXX Sem XXX Sem 信号量信号量 Mutex Mutex 互斥信号量互斥信号量 Mbox Mbox 消息邮箱消息邮箱 Q Q 消息队列消息队列29l使一个任务进入等待状态的函数使一个任务

53、进入等待状态的函数l void OS_EventTaskWait( OS_ENENT void OS_EventTaskWait( OS_ENENT * * pevent) pevent)l 将在任务调用函数将在任务调用函数OSXXXPendOSXXXPend()请求一个事件时调用。()请求一个事件时调用。l使一个正在等待任务进入就绪状态的函数使一个正在等待任务进入就绪状态的函数l INT8U OS_EventTaskRdy( OS_EVENT INT8U OS_EventTaskRdy( OS_EVENT * * pevent, pevent, void void * *msg , INT8

54、U msk) msg , INT8U msk) l 作用:把调用这个函数的任务在任务等待表中的位置清作用:把调用这个函数的任务在任务等待表中的位置清0 0后,再把任务在任务就绪表中的对应的位置后,再把任务在任务就绪表中的对应的位置1 1,然后引发一次,然后引发一次任务调度任务调度l 将在任务调用函数将在任务调用函数OSXXXPostOSXXXPost()发送一个事件时,被调()发送一个事件时,被调用。用。l使一个等待超时的任务仅需就绪状态的函数使一个等待超时的任务仅需就绪状态的函数l void OS_EventTo(OS_EVENT void OS_EventTo(OS_EVENT * *pe

55、vent)pevent)l 作用:当任务已经超过了等待的时间,却要使它进入就作用:当任务已经超过了等待的时间,却要使它进入就绪状态。绪状态。l 将在任务调用函数将在任务调用函数OSXXXPendOSXXXPend()请求一个事()请求一个事 件时,被调件时,被调用用30(2 2)信号量管理)信号量管理使用信号量可以在任务间传递信息,实现任务使用信号量可以在任务间传递信息,实现任务与任务或中断服务子程序的同步。与任务或中断服务子程序的同步。 uC/OS-II uC/OS-II中中的信号量由两部分组成:的信号量由两部分组成:1616位的无符号整数信位的无符号整数信号量的计数值(号量的计数值(0 0

56、6553565535);另一部分是由等);另一部分是由等待该信号量的任务组成的等待任务列表。待该信号量的任务组成的等待任务列表。 uC/OS-IIuC/OS-II提供了以下提供了以下6 6个函数对信号量进行操作。个函数对信号量进行操作。操作操作创建信号量创建信号量OSSemCreatOSSemCreat(INT16U cntINT16U cnt)创建,)创建,返回已创建信号量的指针。返回已创建信号量的指针。请求信号量请求信号量OSSemPendOSSemPend(OS_EVENT OS_EVENT * *peventpevent INT16U timeout INT16U timeout IN

57、T8U INT8U * *errerr)31 time time为为0 0,则表示无限等待。,则表示无限等待。 不等待调用的函数为不等待调用的函数为OSSemAcceptOSSemAccept(OS_EVENT OS_EVENT * * pevent pevent)。)。发送信号量发送信号量 INT8U OSSemPost INT8U OSSemPost(OS_EVENT OS_EVENT * * pevent pevent) 当获得信号量,访问共享资源结束以后,释放当获得信号量,访问共享资源结束以后,释放信号量,调用该函数。先检查是否有等待该信号信号量,调用该函数。先检查是否有等待该信号量的

58、任务。没有,信号量计数器加量的任务。没有,信号量计数器加1 1,有,则调,有,则调用调度器用调度器OS_SchedOS_Sched()。()。32l删除信号量删除信号量l OS_EVENT OS_EVENT * *OSSemDel( OS_EVENT OSSemDel( OS_EVENT * * pevent, pevent,l INT8U opt, INT8U INT8U opt, INT8U * *err)err)l opt OS_DEL_NO_PEND opt OS_DEL_NO_PEND 没有等待任务删除没有等待任务删除l OS_DEL_ALLWAYS OS_DEL_ALLWAYS 立

59、即删除立即删除l 只能任务执行,不能在中断服务程序中删除只能任务执行,不能在中断服务程序中删除l查询信号量的状态查询信号量的状态l INT8U OSSemQuery INT8U OSSemQuery(OS_EVENT OS_EVENT * * pevent peventl OS_SEM_DATA OS_SEM_DATA * *pdatapdata)l pdata pdata是一个结构指针,存储信号量的状态。是一个结构指针,存储信号量的状态。33(3 3)消息邮箱管理)消息邮箱管理消息邮箱是消息邮箱是uC/OS-IIuC/OS-II中的一种通信机制,中的一种通信机制,通常使用时要先定义一个指针型

60、的变量该通常使用时要先定义一个指针型的变量该指针指向一个包含了消息内容的特定数据指针指向一个包含了消息内容的特定数据结构。发送消息的任务或中断服务子程序结构。发送消息的任务或中断服务子程序把这个变量送往邮箱,接收消息的任务从把这个变量送往邮箱,接收消息的任务从邮箱中取出该指针变量,完成信息交换。邮箱中取出该指针变量,完成信息交换。 uC/OS-IIuC/OS-II提供提供6 6种对消息邮箱的操作,它们种对消息邮箱的操作,它们通过以下函数实现:通过以下函数实现:创建创建OS_EVENT OS_EVENT * * OSMoxCreate( void OSMoxCreate( void * * msg) m

温馨提示

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

评论

0/150

提交评论