书签 分享 收藏 举报 版权申诉 / 193
上传文档赚钱

类型嵌入式系统原理与开发Ch5-μCOS-II嵌入式操作系统课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3495551
  • 上传时间:2022-09-07
  • 格式:PPT
  • 页数:193
  • 大小:8.03MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《嵌入式系统原理与开发Ch5-μCOS-II嵌入式操作系统课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    嵌入式 系统 原理 开发 Ch5 COS II 操作系统 课件
    资源描述:

    1、C/OS-II嵌入式操作系统嵌入式操作系统本课程的主要内容本课程的主要内容uC/OS-II是由是由Jean J.Labrosse于于1992年编写年编写的一个嵌入式多任务实时操作系统。的一个嵌入式多任务实时操作系统。u最早这个系统叫做最早这个系统叫做C/OS,后来经过近,后来经过近10年的应用年的应用和修改,在和修改,在1999年年Jean J.Labrosse推出了推出了C/OS-II,并在,并在2000年得到了美国联邦航空管理局年得到了美国联邦航空管理局对用于商用飞机的、符合对用于商用飞机的、符合RTCA DO-178B标准的认证标准的认证,从而证明,从而证明C/OS-II具有足够的稳定性

    2、和安全性。具有足够的稳定性和安全性。u目前,最新版本为目前,最新版本为C/OS-III。u1.C/OS-II的特点的特点lC/OS-II是用是用C语言和汇编语言编写的。用户只要做很少工语言和汇编语言编写的。用户只要做很少工作就可把它移植到各类作就可把它移植到各类8位、位、16位和位和32位嵌入式处理器上。位嵌入式处理器上。lC/OS-II最多可以管理最多可以管理64个任务。个任务。lC/OS-II是可剥夺型内核。是可剥夺型内核。l由于由于C/OS-II的构思巧妙、结构简洁精练、可读性的构思巧妙、结构简洁精练、可读性极强极强,同时又具备了实时操作系统的全部功能,并且源码开放。同时又具备了实时操作

    3、系统的全部功能,并且源码开放。l虽然虽然C/OS-II只是一个内核,但非常适合初次接触嵌入式只是一个内核,但非常适合初次接触嵌入式实时操作系统的学生、开发人员和爱好者学习,并且通过适当实时操作系统的学生、开发人员和爱好者学习,并且通过适当地扩展之后,还可应用到实际系统中去。地扩展之后,还可应用到实际系统中去。lC/OS-II已经有已经有ARM7TDMI、ARM9等各种等各种ARM CPU移植,移植,支持包含支持包含Atmel、Hynix、Intel、Motorola、Philips、Samsung、Sharp等公司的等公司的ARM核的核的CPU。u1.C/OS-II的特点的特点lC/OS-II

    4、的移植也相当容易,与的移植也相当容易,与CPU相关的代码包装在三相关的代码包装在三个文件中:个文件中:os_cpu.h、os_cpu_a.asm和和os_cpu_c.c。lC/OS-II内核含有内核含有60多个系统调用,覆盖任务、定时器、多个系统调用,覆盖任务、定时器、信号量、事件标志、邮箱、队列和内存管理,已经包含了传统信号量、事件标志、邮箱、队列和内存管理,已经包含了传统嵌入式操作系统内核嵌入式操作系统内核(如如PSOS,VRTX)的功能,还支持互斥型的功能,还支持互斥型信号量,这是如信号量,这是如VxWorks和和VRTXsa才有的技术。才有的技术。lC/OS-II没有用户态和内核态,任

    5、务没有用户态和内核态,任务(线程线程)或中断和任务或中断和任务切换的响应可以很快,主要是和切换的响应可以很快,主要是和ARM CPU相关的。相关的。lC/OS-II的的2.7x之后的版本还增加了算法以避免在移植中之后的版本还增加了算法以避免在移植中修改堆栈指针,这样可以保证修改堆栈指针,这样可以保证C/OS-II在不同的在不同的CPU上运行上运行更稳定,移植更方便。更稳定,移植更方便。u1.C/OS-II的特点的特点lC/OS-II目前除了内核外,还有商业化文件系统目前除了内核外,还有商业化文件系统C/FS,图形系统图形系统C/GUI以及任务调试工具以及任务调试工具C/KA和和C/View,但

    6、是,但是C/OS-II自己目前还没有自己目前还没有TCP/IP协议系统。协议系统。lC/OS-II是一个非常容易学习,结构简单,功能完备和实是一个非常容易学习,结构简单,功能完备和实时性很强的嵌入式操作系统内核,适合于各种嵌入式应用以及时性很强的嵌入式操作系统内核,适合于各种嵌入式应用以及大专院校教学和科研。大专院校教学和科研。l最后需要说明,最后需要说明,C/OS-II不是免费软件,任何人学习使用不是免费软件,任何人学习使用C/OS-II需要购买需要购买嵌入式实时操作系统嵌入式实时操作系统C/OS-II一书一书,使用,使用C/OS-II的产品需要购买产品生产授权,购买了此授的产品需要购买产品

    7、生产授权,购买了此授权的还可以得到开发期间的技术支持和升级服务。权的还可以得到开发期间的技术支持和升级服务。u2.C/OS-II的移植的移植l移植移植C/OS-II对目标处理器有一定要求,整个嵌入式系统对目标处理器有一定要求,整个嵌入式系统分为两大层:硬件层和软件层。分为两大层:硬件层和软件层。l软件层主要分为四个部分:实时操作系统内核,与处理器相软件层主要分为四个部分:实时操作系统内核,与处理器相关部分,与应用相关部分,用户的应用系统。这里主要研究软关部分,与应用相关部分,用户的应用系统。这里主要研究软件层的架构。件层的架构。C/OS-II的体系结构如图的体系结构如图6.1所示。所示。u2.

    8、C/OS-II的移植的移植lC/OS-II的体系结构如图的体系结构如图6.1所示。所示。用户程序用户程序C/OS-IIC/OS-II与处理器无关的代码与处理器无关的代码 C/OS-II与应用程序相关的代码与应用程序相关的代码OS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.CC/OS-II.CC/OS-II.HOS_CFG.HINCLUDES.HC/OS-II与处理器相关的代码与处理器相关的代码OS_CPU.HOS_CPU_A.ASMOS_CPU_C.C软件层软件层硬件层硬件层CPUTIMER

    9、图图6.1:C/OS-II的体系结构的体系结构u2.C/OS-II的移植的移植lC/OS-II的文件说明的文件说明OS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.CC/OS-II.CC/OS-II.HOS_CFG.HINCLUDES.HuC/OS-II操作系统内核的主要工作就是对任务进操作系统内核的主要工作就是对任务进行管理和调度。弄清楚什么是任务、任务的结构和任行管理和调度。弄清楚什么是任务、任务的结构和任务的管理方法,对于理解务的管理方法,对于理解C/OS-II的体系结构无疑的体系结构无

    10、疑是极其重要的。是极其重要的。u在在C/OS-II中,把完成特定功能的程序实体就叫中,把完成特定功能的程序实体就叫做做任务任务。C/OS-II就是一个能对这些任务的运行就是一个能对这些任务的运行进行管理和调度的多任务操作系统内核。进行管理和调度的多任务操作系统内核。u从应用程序设计的角度来看,从应用程序设计的角度来看,C/OS-II的任务就的任务就是一个线程,就是一个用来解决用户问题的是一个线程,就是一个用来解决用户问题的C语言函数语言函数和与之相关联的一些数据结构而构成的一个实体。和与之相关联的一些数据结构而构成的一个实体。u从任务的类型来看,从任务的类型来看,C/OS-II的任务有两种:用

    11、的任务有两种:用户任务和系统任务。由应用程序设计者编写的任务,户任务和系统任务。由应用程序设计者编写的任务,叫做用户任务;由系统提供的任务叫做系统任务。用叫做用户任务;由系统提供的任务叫做系统任务。用户任务是为解决应用问题而编写的;系统任务是为应户任务是为解决应用问题而编写的;系统任务是为应用程序来提供某种服务的。用程序来提供某种服务的。u从任务的存储结构来看,从任务的存储结构来看,C/OS-II的任务由如图的任务由如图6.2所示的三个组成部分构成:任务程序代码、任务所示的三个组成部分构成:任务程序代码、任务堆栈和任务控制块。其中,任务控制块用来保存任务堆栈和任务控制块。其中,任务控制块用来保

    12、存任务属性;任务堆栈用来保存任务工作环境;任务程序代属性;任务堆栈用来保存任务工作环境;任务程序代码是任务的执行部分。码是任务的执行部分。u为了管理上的方便,为了管理上的方便,C/OS-II把每一个任务都作把每一个任务都作为一个节点,然后把它们链接成如图图为一个节点,然后把它们链接成如图图6.3所示的一所示的一个任务链表。目前,个任务链表。目前,C/OS-II最多可以对最多可以对64个任务个任务(包括用户任务和系统任务)进行管理。(包括用户任务和系统任务)进行管理。uC/OS-II的任务结构如图的任务结构如图6.2所示所示uC/OS-II任务管理链表如图任务管理链表如图6.3所示所示u1.任务

    13、的状态任务的状态l在单处理器的嵌入式系统中,某一个具体时刻只能允许一个在单处理器的嵌入式系统中,某一个具体时刻只能允许一个任务占用任务占用CPU。根据任务是否占用。根据任务是否占用CPU,及是否处于被中断、,及是否处于被中断、等待等情况,任务在等待等情况,任务在C/OS-II中可能处于表中可能处于表2-1所列的所列的5种种状态之一。状态之一。表表6.1:任务的:任务的5种状态种状态任务的状态任务的状态说明说明睡眠状态睡眠状态任务只是以代码的形式驻留在程序空间(任务只是以代码的形式驻留在程序空间(ROM或或RAM),还没有交给操作系),还没有交给操作系统管理时的情况叫做睡眠状态。简单地说,任务在

    14、没有被配备任务控制块或统管理时的情况叫做睡眠状态。简单地说,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态被剥夺了任务控制块时的状态叫做任务的睡眠状态就绪状态就绪状态如果系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,则任如果系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,则任务就具备了运行的充分条件,这时任务的状态叫做就绪状态务就具备了运行的充分条件,这时任务的状态叫做就绪状态运行状态运行状态处于就绪状态的任务如果经调度器判断获得了处于就绪状态的任务如果经调度器判断获得了CPU的使用权,则任务就进入的使用权,则任务就进入运行状态任何时刻只能有一个

    15、任务处于运行状态,就绪的任务只有当所有优运行状态任何时刻只能有一个任务处于运行状态,就绪的任务只有当所有优先级高于本任务的任务都转为等待状态时,才能进入运行状态先级高于本任务的任务都转为等待状态时,才能进入运行状态等待状态等待状态正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把任务就会把CPU的使用权让给其它任务而使任务进入等待状态的使用权让给其它任务而使任务进入等待状态中断服务状态中断服务状态一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,一个正在运行的任务一旦响应中断申请就会中

    16、止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态这时任务的状态叫做中断服务状态u1.任务的状态任务的状态l任务在不同状态之间的转换和相关的函数见图任务在不同状态之间的转换和相关的函数见图6.4。等待等待状态状态运行运行状态状态中断中断状态状态就绪就绪状态状态睡眠睡眠状态状态图图6.:任务状态的转换:任务状态的转换中断中断任务的任务的CPU使用权被剥夺使用权被剥夺OSStart()OSIntExit()OS_TASK_SW()OSTaskDel()OSIntExit()OSTaskDel()OSTaskDel()OSTaskCreate()OSTaskCreateExt()OSFlag

    17、Pend()OSMboxPend()OSMutexPend()OSQPend()OSSemPend()OSTaskSuspend()OSTimeDel()OSTimeDelHMSM()OSFlagPost()OSMboxPost()OSMboxPostOpt()OSMutexPost()OSQPost()OSQPostFront()OSQPostOpy()OSSemPost()OSTaskResume()OSTimeTick()u2.用户任务用户任务l任务的执行代码通常是一个无限循环结构,并且在这个循环任务的执行代码通常是一个无限循环结构,并且在这个循环中可以响应中断,这种结构也叫做超循环结构

    18、。中可以响应中断,这种结构也叫做超循环结构。l实例实例6.1:一个具有超循环结构的任务的示意性代码。一个:一个具有超循环结构的任务的示意性代码。一个用用C语言编写的任务。语言编写的任务。void UserTask(void)for(;)/可以被中断的用户代码可以被中断的用户代码OS_ENTER_CRITICAL();/进入临界段(关中断)进入临界段(关中断)/不可以被中断的用户代码不可以被中断的用户代码OS_EXIT_CRITICAL();/退出临界段(开中断)退出临界段(开中断)/可以被中断的用户代码可以被中断的用户代码/调用的系统服务调用的系统服务u2.用户任务用户任务l从程序设计的角度来

    19、看,一个从程序设计的角度来看,一个C/OS-II任务的代码就是一任务的代码就是一个个C语言函数。为了传递各种不同类型的数据甚至是函数,任语言函数。为了传递各种不同类型的数据甚至是函数,任务的参数是一个务的参数是一个void类型的指针。类型的指针。l为了有效地对中断进行控制,在任务的代码里可使用为了有效地对中断进行控制,在任务的代码里可使用C/OS-II定义的进入临界段宏定义的进入临界段宏OS_ENTER-CRITICAL()和和退出临界段宏退出临界段宏OS_EXIT-CRITICAL()来控制任务何时响应中来控制任务何时响应中断,何时屏蔽中断。断,何时屏蔽中断。l在运行这两个宏之间的代码时是不

    20、会响应中断的,这种受保在运行这两个宏之间的代码时是不会响应中断的,这种受保护的代码段叫做临界段。护的代码段叫做临界段。l在具体应用中可以,根据实际需要在一个任务中使用这对宏在具体应用中可以,根据实际需要在一个任务中使用这对宏设置多个临界段。因此可以说,设置多个临界段。因此可以说,C/OS-II任务的代码结构是任务的代码结构是一个带有临界段的无限循环。一个带有临界段的无限循环。u3.系统任务系统任务lC/OS-II预定义了两个为应用程序服务的系统任务:空闲预定义了两个为应用程序服务的系统任务:空闲任务和统计任务。其中空闲任务是每个应用程序必须使用的,任务和统计任务。其中空闲任务是每个应用程序必须

    21、使用的,而统计任务则是应用程序可以根据实际需要来选择使用的。而统计任务则是应用程序可以根据实际需要来选择使用的。l(1)空闲任务空闲任务空闲状态:在多任务系统运行时,系统经常会在某个时间内无用户任空闲状态:在多任务系统运行时,系统经常会在某个时间内无用户任务可运行而处于所谓的空闲状态。务可运行而处于所谓的空闲状态。为了使为了使CPU在没有用户任务可执行时有事可做,在没有用户任务可执行时有事可做,C/OS-II提供了一个提供了一个叫做空闲任务叫做空闲任务OSTaskIdle()的系统任务。的系统任务。空闲任务几乎不做什么事情,只是对系统定义的一个空闲任务运行次空闲任务几乎不做什么事情,只是对系统

    22、定义的一个空闲任务运行次数计数器数计数器OSIdleCtr进行加进行加1操作。当然,如果用户认为有必要,那么操作。当然,如果用户认为有必要,那么也可在空闲任务中编写一些做用户工作的代码。也可在空闲任务中编写一些做用户工作的代码。C/OS-II规定,一个用户应用程序必须使用这个空闲任务,而且这个规定,一个用户应用程序必须使用这个空闲任务,而且这个任务是不能用软件来删除的。任务是不能用软件来删除的。u3.系统任务系统任务l(2)统计任务统计任务C/OS-II提供的另一个系统任务是统计任务提供的另一个系统任务是统计任务OSTaskstat()。这个统计任务每秒计算一次这个统计任务每秒计算一次CPU在

    23、单位时间内被使用的时间,并把计算在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问中,以便应用程序通过访问它来了解它来了解CPU的利用率,所以该系统任务的利用率,所以该系统任务OSTaskstat()叫做统计任务叫做统计任务.用户应用程序是否使用统计任务,可以根据应用程序的实际需要来进用户应用程序是否使用统计任务,可以根据应用程序的实际需要来进行选择。行选择。如果应用程序要使用这个统计任务,则必须把定义在系统头文件如果应用程序要使用这个统计任务,则必须把定义在系统头文件OS_CFG.H中的系统配置常数中的系统配置

    24、常数OS_TASK_STAT_EN设置为设置为1,并且必须在,并且必须在创建统计任务之前调用函数创建统计任务之前调用函数OSStatInit()对统计任务进行初始化。对统计任务进行初始化。u4.任务的优先级任务的优先级lC/OS-II的每个任务都必须具有一个惟一的优先级别。的每个任务都必须具有一个惟一的优先级别。C/OS-II把任务的优先权分为把任务的优先权分为64个优先级别,每一个级别都个优先级别,每一个级别都用一个数字来表示。数字用一个数字来表示。数字0表示任务的优先级别最高;数字越表示任务的优先级别最高;数字越大则表示任务的优先级别越低。大则表示任务的优先级别越低。l通常,一个应用程序的

    25、任务数小于通常,一个应用程序的任务数小于64。为了节省内存,用户。为了节省内存,用户可以根据应用程序的需要,在文件可以根据应用程序的需要,在文件OS_CFG.H中通过给表示最中通过给表示最低优先级别的常数低优先级别的常数OS_LOWEST_PRIO赋值的方法,来说明应赋值的方法,来说明应用程序中任务优先级别的数目。用程序中任务优先级别的数目。l该常数一旦被定义,就意味着系统中可供使用的优先级别为该常数一旦被定义,就意味着系统中可供使用的优先级别为0、1、2、OS_LOWEST_PRIO,共,共OS_LOWEST_PRIO+1个。同时也限制了应用程序中任务的总数最多不能超过个。同时也限制了应用程

    26、序中任务的总数最多不能超过OS_LOWEST_PRIO十十1个。个。u4.任务的优先级任务的优先级l系统总是把最低优先级别系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任自动赋给空闲任务。如果应用程序中还使用了统计任务,则系统会把优先级别务。如果应用程序中还使用了统计任务,则系统会把优先级别OS_LOWEST_PRIO-1自动赋给统计任务,因此用户任务可使自动赋给统计任务,因此用户任务可使用的优先级别是用的优先级别是0、1、OS_LOWEST_PRIO_2,共,共OS_LOWEST_PRIO_1个。个。u4.任务的优先级任务的优先级l实例实例6.2:如果希望应用程序中任务的优先

    27、级别为:如果希望应用程序中任务的优先级别为28个,个,则表示最低优先级别的常数则表示最低优先级别的常数OS_LOWEST_PRIO值应该是多少值应该是多少?如果应用程序中使用了系统提供的空闲任务和统计任务,则该如果应用程序中使用了系统提供的空闲任务和统计任务,则该应用程序最多可以安排多少个任务应用程序最多可以安排多少个任务?l解:表示最低优先级别的常数解:表示最低优先级别的常数OS_LOWEST_PRIO值应该为值应该为27,优先级别分别为,优先级别分别为0、1、2、3、27;由于系统空闲任;由于系统空闲任务占用了优先级别务占用了优先级别27,统计任务占用了优先级别,统计任务占用了优先级别26

    28、,则应用,则应用程序中最多可以安排优先级别分别为程序中最多可以安排优先级别分别为0、1、2、25的的26个个任务。任务。l给某一个用户任务的定义优先级别的方法:在调用系统函数给某一个用户任务的定义优先级别的方法:在调用系统函数OSTaskCreate()来创建任务时,用该函数的第来创建任务时,用该函数的第4个参数个参数prio为用户任务指定优先级。为用户任务指定优先级。l优先级别是优先级别是C/OS-II识别任务的唯一标识。识别任务的唯一标识。u所谓堆栈,就是在存储器中按数据所谓堆栈,就是在存储器中按数据后进先出(后进先出(LIFO)的原则组织的连续存储空间。的原则组织的连续存储空间。u为了满

    29、足任务切换和响应中断时保存为了满足任务切换和响应中断时保存CPU寄存器中寄存器中的内容及存储任务私有数据的需要,每个任务都有自的内容及存储任务私有数据的需要,每个任务都有自己的堆栈。己的堆栈。u任务堆栈是任务的重要组成部分。任务堆栈是任务的重要组成部分。u1.任务堆栈的创建任务堆栈的创建l在文件在文件OS_CPU.H中专门定义了一个数据类型中专门定义了一个数据类型OS_STK:typedef unsigned intOS_STK;l在应用程序中定义任务堆栈的栈区就是定义一个在应用程序中定义任务堆栈的栈区就是定义一个OS_STK类类型的一个数组。例如:型的一个数组。例如:#define TASK

    30、_STK_SIZE 512/定义堆栈的长度为定义堆栈的长度为1024BOS_STK TaskStkTASK_STK_SIZE;/定义数组作为任务堆栈定义数组作为任务堆栈l当调用函数当调用函数OSTaskCreate()来创建一个任务时,把数组的来创建一个任务时,把数组的指针传递给函数指针传递给函数OSTaskCreate()中的堆栈栈顶参数中的堆栈栈顶参数ptos,就可以把该数组与任务关联起来而成为该任务的任务堆栈。就可以把该数组与任务关联起来而成为该任务的任务堆栈。l堆栈增长方向:在使用堆栈增长方向:在使用OSTaskCreate()创建任务时,一定创建任务时,一定要注意处理器要求堆栈增长方

    31、向。如要注意处理器要求堆栈增长方向。如ARM处理器就是满递减栈处理器就是满递减栈(FD栈),其堆栈指令为栈),其堆栈指令为LDMFD/STRFD。u1.任务堆栈的创建任务堆栈的创建l如果处理器堆栈增长方向是向上的,则堆栈指针的设置为:如果处理器堆栈增长方向是向上的,则堆栈指针的设置为:&MyTaskStk0/任务堆栈栈顶指针任务堆栈栈顶指针l如果处理器堆栈增长方向是向下的,则堆栈指针的设置为:如果处理器堆栈增长方向是向下的,则堆栈指针的设置为:&MyTaskStkMyTaskStkN-1/任务堆栈栈顶指针任务堆栈栈顶指针l为了提高应用程序的可移植性,在编写程序时需要将两种代为了提高应用程序的可

    32、移植性,在编写程序时需要将两种代码 都 编 写 出 来,利 用码 都 编 写 出 来,利 用 O S _ C F G.H 文 件 中 的 常 量文 件 中 的 常 量OS_STK_GROWTH作为选择开关,使用户可以通过该常量的值作为选择开关,使用户可以通过该常量的值来选择相应的代码段,以适应不同堆栈增长方向的需要。来选择相应的代码段,以适应不同堆栈增长方向的需要。u2.任务堆栈的初始化任务堆栈的初始化l在系统启动任务时,在系统启动任务时,CPU从何处可以获得这些数据呢从何处可以获得这些数据呢?最方最方便的方法就是让便的方法就是让CPU从这个任务的任务堆找里获得这些数据。从这个任务的任务堆找里

    33、获得这些数据。l应用程序在创建一个新任务时,就必须把在系统启动这个任应用程序在创建一个新任务时,就必须把在系统启动这个任务时务时CPU各寄存器所需要的初始数据各寄存器所需要的初始数据(任务指针、任务堆核指任务指针、任务堆核指针、程序状态字等针、程序状态字等)事先存放在任务的堆核中。这样,当任务事先存放在任务的堆核中。这样,当任务获得获得CPU使用权时,就能把堆栈中的初始数据复制到使用权时,就能把堆栈中的初始数据复制到CPU的各的各寄存器里,从而可使任务顺利地启动并运行。寄存器里,从而可使任务顺利地启动并运行。l任务堆栈的初始化工作应该是由操作系统完成的。任务堆栈的初始化工作应该是由操作系统完成

    34、的。C/OS-II在创建任务函数在创建任务函数OSTaskCreate()中通过调用任务堆找初中通过调用任务堆找初始化函数始化函数OSTaskStkInit()来完成任务堆钱初始化工作的。来完成任务堆钱初始化工作的。l目前,由于各种处理器的寄存器及对堆栈的操作方式不尽相目前,由于各种处理器的寄存器及对堆栈的操作方式不尽相同,因此该函数需要用户在进行同,因此该函数需要用户在进行C/OS-II的移植时,按所使的移植时,按所使用的处理器由用户来编写。用的处理器由用户来编写。u用来记录任务的堆核指针、任务的当前状态、任务用来记录任务的堆核指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的

    35、表就叫做的优先级别等一些与任务管理有关的属性的表就叫做任务控制块任务控制块(OS_TCB)。u从图从图6.2中可以看到,任务控制块负责把任务代码中可以看到,任务控制块负责把任务代码和任务堆钱进行关联,而使任务控制块、任务代码和和任务堆钱进行关联,而使任务控制块、任务代码和任务堆栈成为一个整体,并且系统要通过这个任务控任务堆栈成为一个整体,并且系统要通过这个任务控制块来感知和管理一个任务。制块来感知和管理一个任务。u因此,任务控制块就相当于一个任务的身份证,没因此,任务控制块就相当于一个任务的身份证,没有任务控制块的任务是不能被系统承认和管理的。有任务控制块的任务是不能被系统承认和管理的。u为了

    36、管理系统中多个任务,为了管理系统中多个任务,C/OS-II把系统所有把系统所有任务的控制块链接为两条链表,通过这两条链表管理任务的控制块链接为两条链表,通过这两条链表管理任务控制块,通过任务控制块来对任务进行相关操作任务控制块,通过任务控制块来对任务进行相关操作.u1.任务控制块的结构任务控制块的结构l任务控制块是一个结构类型数据。任务控制块是一个结构类型数据。l当用户应用程序调用当用户应用程序调用OSTaskCreate()函数创建一个用户任函数创建一个用户任务时,这个函数就会对任务控制块中的所有成员赋予与该任务务时,这个函数就会对任务控制块中的所有成员赋予与该任务相关的数据,并驻留在相关的

    37、数据,并驻留在RAM中。中。l任务控制块结构的定义如下:任务控制块结构的定义如下:功能:任务控制块结构的定义功能:任务控制块结构的定义Typedef struct os_tcbOS_STK*OSTCBStkPtr;/指向任务堆栈栈顶的指针指向任务堆栈栈顶的指针#if OS_TASK_CREATE_EXT_ENVoid*OSTCBExtPrt;OS_STK*OSTCBStkBottom;INT32UOSTCBStkSize;INT16UOSTCBOpt;INT16UOSTCBId;#endif/如果使用扩展的任务定义,则如果使用扩展的任务定义,则/指向任务控制块扩展的指针指向任务控制块扩展的指针

    38、/指向任务堆栈栈底的指针指向任务堆栈栈底的指针/任务堆栈的长度任务堆栈的长度/创建任务时的选择项创建任务时的选择项/目前该域未被使用目前该域未被使用Struct os_tcb*OSTCBNext;Struct os_tcb*OSTCBPrev;/指向后一个任务控制块的指针指向后一个任务控制块的指针/指向前一个任务控制块的指针指向前一个任务控制块的指针u1.任务控制块的结构任务控制块的结构l任务控制块结构的定义如下:任务控制块结构的定义如下:#if(OS_Q_ EN&(OS_MAX_OS=2)|OS_MBOX_EN|OS_Sem_EN/如果使用队列、消息邮箱、信号量如果使用队列、消息邮箱、信号量

    39、OS_EVENT*OSTCBEventPrt;#endif/指向事件控制块的指针指向事件控制块的指针#if(OS_Q_ EN&(OS_MAX_QS=2)|OS_MBOX_EN/如果使用队列、消息邮箱如果使用队列、消息邮箱void*OSTCBMsg;#endif/指向传递给任务消息的指针指向传递给任务消息的指针INT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;/任务等待的时限(节拍数)任务等待的时限(节拍数)/任务的当前状态标志任务的当前状态标志/任务的优先级别任务的优先级别INT8UOSTCBX;INT8UOSTCBY;INT8UOSTCBBitX;IN

    40、T8UOSTCBBitY;/用于快速访问就续表的数据用于快速访问就续表的数据=prio&07=同组位号同组位号/用于快速访问就续表的数据用于快速访问就续表的数据=prio3=组号组号/快速访问就续表快速访问就续表=OSMapTblprio&07/快速访问就续表快速访问就续表=OSMapTblprio3#if(OS_TASK_DEL_ EN)/如果允许任务删除如果允许任务删除BOOLEANOSTCBDelReg;#endif/请求删除任务时用到的标志请求删除任务时用到的标志u1.任务控制块的结构任务控制块的结构l其中成员其中成员OSTCBStat用来存放任务的当前状态,该成员变量用来存放任务的当

    41、前状态,该成员变量可能的值见表可能的值见表6.2。表表6.2:OSTCBStat可能的值可能的值值值说明说明OS_STAT-RDY表示任务处于就绪状态表示任务处于就绪状态OS_STAT-SEM表示任务处于等待信号量状态表示任务处于等待信号量状态OS_STAT-MBOX表示任务处于等待消息邮箱状态表示任务处于等待消息邮箱状态OS_STAT-Q表示任务处于等待消息队列状态表示任务处于等待消息队列状态OS_STAT-SUSPEND 表示任务处于被挂起状态表示任务处于被挂起状态OS_STAT-MUTEX表示任务处于等待互斥型信号量状态表示任务处于等待互斥型信号量状态u2.任务控制块链表任务控制块链表l

    42、C/OS-II用两条链表来管理任务控制块。用两条链表来管理任务控制块。l一条是空任务块链表(所有任务控制块还没有分配给任务)一条是空任务块链表(所有任务控制块还没有分配给任务)l一条是任务块链表(所有任务控制块已经分配给任务)。一条是任务块链表(所有任务控制块已经分配给任务)。l空任务块链表是在应用程序调用函数空任务块链表是在应用程序调用函数OSInit()对对C/OS-II系统进行初始化时建立的;而任务块链表则是在调用函数系统进行初始化时建立的;而任务块链表则是在调用函数OSTaskCreate()创建任务时建立的。创建任务时建立的。l建立任务控制块链表的具体方法:从空任务控制块链表摘取建立

    43、任务控制块链表的具体方法:从空任务控制块链表摘取一个空任务控制块,然后填充上任务属性后,形成新的链表。一个空任务控制块,然后填充上任务属性后,形成新的链表。l系统调用函数系统调用函数OSInit()对对C/OS-II系统进行初始化时,系统进行初始化时,先在先在RAM中建立一个中建立一个OS_TCB结构类型的数组结构类型的数组OSTCBTbl,这样每个数组元素就是一个任务控制块,然后把这些控制块链这样每个数组元素就是一个任务控制块,然后把这些控制块链接成了一个如图接成了一个如图6.5所示的链表。由于链表中的这些控制块所示的链表。由于链表中的这些控制块还没有与具体任务相关联,因此这个链表叫做空任务

    44、块链表。还没有与具体任务相关联,因此这个链表叫做空任务块链表。u2.任务控制块链表任务控制块链表l控制块链接成了一个如图控制块链接成了一个如图6.5所示的链表。所示的链表。u2.任务控制块链表任务控制块链表l从图从图6.5中可以看到,中可以看到,C/OS-II初始化时建立的空任务链初始化时建立的空任务链表的元素一共是表的元素一共是OS_MAX_TASKS+OS_N_SYS_TASKS个。个。l其中,定义在文件其中,定义在文件OS_CFG.H中的常数中的常数OS_MAX_TASKS指明指明了用户任务的最大数目;定义在文件了用户任务的最大数目;定义在文件UCOS_II.H中的常数中的常数OS_N_

    45、SYS_TASKS指明了系统任务的数目(在图指明了系统任务的数目(在图6.5中,其中,其值为值为2:一个空闲任务,一个统计任务)。:一个空闲任务,一个统计任务)。l每当应用程序调用系统函数每当应用程序调用系统函数OSTaskCreate()或或OSTaskCreateExt()创建一个任务时,系统就会将空任务创建一个任务时,系统就会将空任务控制块链表头指针控制块链表头指针OSTCBFreeList指向的任务控制块分配给指向的任务控制块分配给该任务。该任务。l在给任务控制块中的各成员赋值后,就按任务控制块链表的在给任务控制块中的各成员赋值后,就按任务控制块链表的头指针头指针OSTCBList将其

    46、加入到任务控制块链表中。将其加入到任务控制块链表中。u2.任务控制块链表任务控制块链表l图图6.6是在图是在图6.5所示空任务控制块链表基础上,应用程序所示空任务控制块链表基础上,应用程序创建了两个用户任务并使用了两个系统任务(空闲任务和统计创建了两个用户任务并使用了两个系统任务(空闲任务和统计任务)的情况时,空任务块链表和任务块链表的结构示意图(任务)的情况时,空任务块链表和任务块链表的结构示意图(图中阴影区域为任务块链表)。图中阴影区域为任务块链表)。l为了加快对任务控制块的访问速度,除了任务控制块链表被为了加快对任务控制块的访问速度,除了任务控制块链表被创建为双向链表之外,创建为双向链表

    47、之外,C/OS-II在在uCOS_II.H文件中还定文件中还定义了一个数据类型为义了一个数据类型为OS_TCB*的数组的数组OSTCBPrioTbl,专,专门用来以任务的优先级别为顺序在各个数组元素里存放指向各门用来以任务的优先级别为顺序在各个数组元素里存放指向各个任务控制块的指针。这样系统在访问一个任务的任务控制块个任务控制块的指针。这样系统在访问一个任务的任务控制块时,就 可 以 不 必 遍 历 任 务 控 制 块 链 表 了。数 组时,就 可 以 不 必 遍 历 任 务 控 制 块 链 表 了。数 组OSTCBPrioTbl与任务控制块链表中任务控制块之间的关与任务控制块链表中任务控制块

    48、之间的关系如图系如图6.6所示。所示。u2.任务控制块链表任务控制块链表u2.任务控制块链表任务控制块链表l另外,为了另外,为了C/OS-II能随时访问正在运行任务的任务控制能随时访问正在运行任务的任务控制块,块,C/OS-II还定义了一个还定义了一个OS_TCB*类型的变量类型的变量OSTCBCur,专门存放当前正在运行的任务的任务控制块指针。图,专门存放当前正在运行的任务的任务控制块指针。图6.6是在假设任务优先级别为是在假设任务优先级别为3的任务正在运行时指针变量的任务正在运行时指针变量OSTCBCur的指向。的指向。lC/OS-II允许用函数允许用函数OSTaskDel()删除一个任务

    49、。删除一删除一个任务。删除一个任务,实质上就是把该任务的任务从任务控制块链表中删掉个任务,实质上就是把该任务的任务从任务控制块链表中删掉,并把它归还给空任务控制块链表。这样,并把它归还给空任务控制块链表。这样,C/OS-II对这个对这个没有任务控制块的任务就不再理会了,因为与这个任务对应的没有任务控制块的任务就不再理会了,因为与这个任务对应的任务控制块已经被任务控制块已经被吊销吊销了。了。l由此可见,任务的任务控制块就如同人的身份证一样重要。由此可见,任务的任务控制块就如同人的身份证一样重要。u3.任务控制块的初始化任务控制块的初始化l给用户任务分配任务控制块及对其进行初始化也是操作系统给用户

    50、任务分配任务控制块及对其进行初始化也是操作系统的职责。当应用程序调用函数的职责。当应用程序调用函数OSTaskCreate()创建一个任创建一个任务时,这个函数会调用系统函数务时,这个函数会调用系统函数OSTCBInit()来为任务控制来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块;然后用任务的属性对任务控制块各个表获取一个任务控制块;然后用任务的属性对任务控制块各个成员进行赋值;最后再把这个任务控制块链入到任务控制块链成员进行赋值;最后再把这个任务控制块链入到任务控制块链表的头部。表的头部。l初始化

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:嵌入式系统原理与开发Ch5-μCOS-II嵌入式操作系统课件.ppt
    链接地址:https://www.163wenku.com/p-3495551.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库