嵌入式实时操作系统复习课_第1页
嵌入式实时操作系统复习课_第2页
嵌入式实时操作系统复习课_第3页
嵌入式实时操作系统复习课_第4页
嵌入式实时操作系统复习课_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式操作系统总结复习课课程目标学会一个基于嵌入式操作系统开发的嵌入式应用软件的设计与实现理解嵌入式操作系统基本概念与技术理解嵌入式操作系统内核的工作原理理解并掌握嵌入式应用软件的设计与实现原理理解并掌握嵌入式软件的运行机制评价嵌入式软件运行性能嵌入式系统定义上面举例说明的两个系统实例中,表可以看成是一个机械系统,洗衣机可以看成是一个嵌入式系统,是一个具有嵌入软件和计算机硬件,并受嵌入软件和计算机硬件的运行控制,完成特定功能的系统。嵌入式系统就是一个具有嵌入软件和计算机硬件,并受嵌入软件和计算机硬件的运行控制,完成特定功能的系统。通常将嵌入式计算机系统简称为嵌入式系统。嵌入式应用系统 把计算机

2、可执行程序嵌入到(或称安装到)某个设备中,如,手机、汽车、照相机、洗衣机、空调器等家用电器,或飞机、导弹、卫星等大型设备,控制这些设备的运转,使设备工作运行的自动化程度大大提高,并在功能和性能方面都得到提升,整体系统的质量大大提高。这些设备就可视为嵌入式系统这些预制或安装的软件就是嵌入式软件。如何开发嵌入式软件? 从嵌入式操作系统的实时性上分类可分为实时操作系统和非实时操作系统时限要求严格的系统称为硬实时系统时限要求不严格的称为软实时系统。嵌入式软件系统应用软件这些软件功能通常以并发运行的进程、任务或线程的形式运行在系统中,控制系统的多项功能。实时操作系统(RealTime Operating

3、 System)负责管理运行于硬件系统之上的应用软件,按照系统任务优先级控制系统资源的分配和使用,负责调用任务调度处理器运行并发系统和应用任务,并负责完成任务运行和任务间的上下文切换。嵌入式开发需要操作系统的支持由于日益增长的嵌入式软件的开发需求及其开发平台的不断发展,嵌入式系统与嵌入式操作系统硬件软件体系结构已密不可分,成为一个公认稳定的系统平台,共同承担开发嵌入式系统及其软件的必备工具和平台的任务。开发服务于嵌入式系统的嵌入式软件,采用基于嵌入式操作系统内核功能进行开发,是功能、性能较为有力的保障。 嵌入式操作系统概念内核是嵌入式操作系统的基础,也是必备的部分。它提供任务管理、内存管理、通

4、信、同步与互斥机制、中断管理、时间管理及任务扩展等功能。内核还提供特定的应用编程接口。嵌入式应用程序概述 基于实时操作系统进行嵌入式软件研发,有效率高、实时性好、易于移植等特点从应用软件设计与实现角度分析,需要设计者首先掌握实时操作系统内核功能及调用接口,熟悉内核基本技术及其实现方法;对应用程序进行任务分析及分解、中断分析及设计、数据分析和实现。完成应用代码程序设计,由此生成一个具有实时特性的嵌入式应用软件的可执行程序。 嵌入式应用程序结构任务结构与构建 任务分解任务通信任务创建任务运行响应任务与内核连接任务调度公开源代码可移植性(Portable) 绝大部分 C/OS-II的源码是用移植性很

5、强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得 C/OS-II便于移植到其他微处理器上。 C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器 、数字信号处理器(DSP)上运行。可固化(ROMable) C/OS-II是为嵌入式应用而设计的,这就意味着,只要用户有固化手段(C编译、连接、下载和固化), C/OS-II可以嵌入到用户的产品中成为产品的一部分。可裁剪(Scalable) 可以只使用 C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个 C/OS-II调用,而另一个产品则使用了几

6、乎所有 C/OS-II的功能,这样可以减少产品中的 C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。C/OS的性能特点(一)抢占式(Preemptive)多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性。任务栈 每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。中断管理 中断

7、可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。稳定性与可靠性C/OS的性能特点(二)C/OS-II提供的系统服务信号量带互斥机制的信号量事件标志消息信箱消息队列内存管理时钟管理任务管理1、嵌入式系统与通用计算机系统的区别?2、嵌入式操作系统的实时性分类?3、简述嵌入式软件系统的构成。4、按照运行平台划分嵌入式软件5、嵌入式系统软件的特征6、嵌入式开发为什么需要操作系统的支持?嵌入式操作系统的主要概念前后台系统 多任务与任务 任务Task 中断技术与性能调度Scheduler 优先级Priority 代码临

8、界区Critical Section可预测性predictability上下文切换Context Switch 前后台系统-3多任务设计实时应用程序的设计过程,主要包括如何把问题分割成多个任务,每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间(如下图所示)。 任务的管理典型的实时系统中,每个任务都是一个无限的循环。每时每刻每个任务都处在以下5种状态之一,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态。参见下图 OSRdyTbl 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/

9、0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0任务就绪表的示意图01234567xy01234567嵌入式系统开

10、发及其环境 嵌入式系统开发需要宿主机(Host)和目标机(Target)的支持。宿主机属于嵌入式软件的开发平台,宿主机用于嵌入式软件的设计、实现、调试和运行等;目标机属于最终系统的运行平台,目标机作为可执行程序的最终运行平台,目标机是嵌入式系统的硬件部分,运行程序属于嵌入式系统的软件部分。 什么是交叉编译技术?把在宿主机上编写的高级语言程序,编译成可以运行在目标机上的代码,即在宿主机上能够编译生成另一种CPU(嵌入式微处理器)上的二进制程序。 采用交叉编译技术的原因在于,嵌入式软件必须在开发过程中,进行反复调试才能产生正确的运行结果。此时才有必要将可执行程序移植到目标机上,移植技术关键在于在宿

11、主机上可以生成目标机上运行的可执行程序。具有交叉编译技术的编译程序,实现了这一目标。 采用宿主机和目标机支持嵌入式系统开发的原因宿主机是用于开发嵌入式系统的计算机,一般为PC机或者工作站,具备丰富的软硬件资源,为嵌入式软件的开发提供方便易行的全过程支持。目标机即所开发的嵌入式系统,是嵌入式软件的运行环境,其硬件软件是为特定应用定制的,一般由处理器、装入嵌入式系统的ROM映像的ROM内存芯片、堆栈、中间变量、缓冲区、外设和接口组成。 实时软件分析设计方法 嵌入式实时软件系统的生命周期分为以下几个阶段:需求分析与详细说明:描述系统功能及性能需求。系统设计:任务分解, 定义任务间接口关系。任务设计:

12、按模块设计每个任务,定义模块间接口。模块设计与实现:完成每个模块的详细设计、编码和单元测试。任务与系统集成:任务单独运行及并发运行调试,查看每个任务的运行结果。系统测试:针对需求分析结果,对系统功能性能进行测试和验证。 实现具体实时应用业务逻辑一般采用分解任务的方法将一个实时应用功能划分为多个并发执行的任务。分配任务不同的优先级,赋予任务自主延迟功能,进行必要的任务通信,设置关键任务的中断响应。明确任务的执行条件、中断条件和挂起条件等因素。每个任务是系统中一个独立的执行调度单位和资源分配单位。调用RTOS内核系统函数接口,创建实时任务;任务的运行从接受内核调度开始,按照自身流程设计循环执行。直

13、至系统运行结束。实时应用软件功能运行界面实时操作系统内核系统硬件平台实时应用任务2实时应用任务1实时应用任务n任务模型的框架结构与构建 任务分解任务通信任务创建任务响应任务与内核连接任务分解的设计阶段、编码阶段设计阶段的主要工作包括:根据应用程序功能需求,将应用程序功能划分为若干并发任务。首先将需要并发执行的子功能确立为任务,任务优先级按响应的迫切程度确定。确定每个任务处理流程,确保完成任务功能。确定任务功能实现是否与其它任务的执行有关联。编码阶段的主要工作包括完成每个任务的程序设计。将任务流程使用C语言编写为独立的函数。根据应用需求,不同的任务也可共用同一个函数的代码段。由于实时任务有确定优

14、先级,为确保低优先级任务有机会运行。每个任务函数中需包括睡眠、挂起、等待指定时间等一些自主放弃CPU的语句,调用内核函数实现。1、简述嵌入式系统开发及其环境2、简述交叉开发环境3、什么是交叉编译技术?4、采用宿主机和目标机支持嵌入式系统开发的原因?5、简述软件仿真开发及软件仿真开发环境6、简述实时软件分析设计方法 7、简述任务分解方法及任务分解的设计阶段、编码阶段的基本工作。实时系统多任务多任务运行令CPU在许多任务之间转换、调度多任务运行与前后台系统的最大区别在于后台任务有多个。一个任务,也称作一个线程,是一个具有完整逻辑含义的程序段任务Task指拥有所有CPU资源的简单程序。在进行实时应用

15、设计时通常要把工作分割成多个任务,每个任务处理一部分问题,并被赋予一定的优先级、一套自己的CPU寄存器及堆栈。实时系统中的大部分任务是周期的,体现在编程上每个任务则是一个典型的无限循环。任务的状态多任务设计与实现实时应用程序的设计与实现过程,主要包括如何把问题分割成多个任务,每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有一套CPU寄存器和栈空间如下图所示 任务的管理典型的实时系统中,每个任务都是一个无限的循环。每时每刻每个任务都处在以下5种状态之一,这5种状态是休眠态,就绪态、运行态、挂起态和被中断态。休眠态:该任务驻留在内存中,不能被多任务内核调度。如已经删除!就绪态:该任务

16、已经准备好运行,但由于该任务优先级比正在运行任务的优先级低,暂时不能运行。运行态:该任务占用CPU,正在运行中。挂起状态,即等待态:该任务在等待某一事件的发生,例如等待某外设的I/O操作,等待某互斥资源,等待定时脉冲或等待超时信号等等。被中断态:发生中断时,CPU执行ISR,原来正在运行的任务暂不能运行,进入被中断态。见状态转换图(下图)任务task典型的一个无限循环。Void mytask(void *pdata)for (;) do something;waiting;do something;支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。系统占用了两个任务,空闲任务和统

17、计任务。实时内核应对死锁内核大多允许用户在申请信号量时定义等待超时,即超时后自动结束任务的运行,不再等待信号量,以此解除死锁。当等待时间超过了某一确定值,信号量还是无效状态,就会返回某种形式的出现超时错误的代码,这个出错代码告知该任务,不是得到了资源使用权,而是系统错误。互斥(mutual exclusion)资源的使用必须独占,叫做互斥。解决办法:关中断禁止任务切换利用信号量信号量应用 在C/OS-中如何用信号量处理共享数据。实现的具体方法如下:任务调用等待信号量函数OSSemPend( )处理互斥数据再调用释放信号量函数OSSemPost( )在使用信号量之前,一定要利用内核系统函数,对该

18、信号量做创建、初始化操作。作为互斥条件,信号量的值应初始化为1,表示互斥访问该共享数据。 程序清单3-7 通过获得信号量处理共享数据OS_EVENT *SharedDataSem;SharedDataSem=OSSemCreate(1);/*信号量创建并赋初值*/void Function (void) INT8U err; OSSemPend(SharedDataSem, 0, &err); /* access shared data here (interrupts are recognized) */ /*共享数据的处理在此进行,允许中断*/ OSSemPost(SharedDataSe

19、m);同步的实现可以利用信号量使某任务与中断服务同步,或者任务与另一个任务同步同步关系:这两个任务间并没有数据交换,只是执行时序的关系。 不可剥夺性内核可剥夺性内核 为了找到就绪态优先级最高的任务,不需要从OSRdyTbl0开始扫描整个就绪任务表的各个元素值,算法设计查表,即优先级判定表OSUnMapTbl,见文件OS_CORE.C中关于该数组表定义:INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /*0 x00 to 0 x0F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1

20、, 0, 2, 0, 1, 0, /* 0 x10 to 0 x1F*/ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 x20 to 0 x2F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 x30 to 0 x3F*/ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 x40 to 0 x4F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 x50 to

21、 0 x5F*/ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 x60 to 0 x6F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 x70 to 0 x7F*/ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 x80 to 0 x8F*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 x90 to 0 x9F*/ 5, 0, 1, 0, 2, 0, 1

22、, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 xA0 to 0 xAF*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 xB0 to 0 xBF*/ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 xC0 to 0 xCF*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0 xD0 to 0 xDF*/ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

23、 /* 0 xE0 to 0 xEF*/ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* 0 xF0 to 0 xFF*/;C/OS-II内核的核心功能(OS_CORE.C)可裁减的如果用户应用程序不去调用该项内核功能,这部分功能代码就不用包含在应用软件中。不可裁减的分别实现了中断的关闭和打开,内核初始化,任务调度,中断ISR的入口函数和出口函数,任务调度的关闭和打开等。 不可裁减的内核功能C/OS-II内核功能函数OS_CFG.H中置1表示函数有效函数功能OS_ENTER_CRITICAL()必有关中断OS_EXIT_CRITICAL()必

24、有开中断OSInit()必有内核初始化OSStart()必有任务调度OSIntEnter()必有中断进入OSIntExit()必有中断退出OSSchedLock()OS_SCHED_LOCK_EN置1任务调度加锁OSSchedUnlock()OS_SCHED_LOCK_EN置0任务调度解锁OSVersion()必有版本typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN /*如果使用扩展任务创建*/ Void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBSt

25、kSize; INT16U OSTCBOpt; INT16U OSTCBId;#endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN/*如果使用事件*/ OS_EVENT *OSTCBEventPtr;#endif#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN /*如果使用消息*/ Void *OSTCBMsg;#endif INT16U OSTCBDly; INT8U OSTCBSt

26、at; INT8U OSTCBPrio; INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN /*如果允许删除任务*/ BOOLEAN OSTCBDelReq;#endif OS_TCB;空闲任务表 C/OS-初始化时,所有任务控制块OS_TCBs被链接成一个单向空闲任务表。任务建立时空闲任务控制块指针OSTCBFreeList指向的任务控制块,便分配给该任务,OSTCBFreeList的值调整为指向下链表中下一个空闲的任务控制块。任务删除时任务控制块就链入空闲任务表尾。 1、采用查表法

27、确定高优先级任务查表法具有确定时间,增加系统可预测性,C/OS II所有系统调用时间确定。High3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(High3 3;OSRdyTblprio 3 |= OSMapTblprio & 0 x07;附加说明:TCB表中有四个变量用来记录相关值。任务进入就绪态或进入等待事件发生状态算法使用。使得任务进入就绪表或进入等待表的时间是个常数,便于控制性能。避免在运行中去计算这些值。这些值在任务建立时确定,或在改变任务优先级时更新。 OSTCBY= priority 3;OSTCBBitY=

28、OSMapTblpriority 3;OSTCBX= priority & 0 x07;OSTCBBitX= OSMapTblpriority & 0 x07;运用TCB成员算法代码:使任务进入就绪态程序清单 OSRdyGrp |= OSMapTblpriority 3;OSRdyTblpriority 3 |= OSMapTblpriority & 0 x07;使任务进入就绪态程序清单 OSRdyGrp |= OSTCBBitY;OSRdyTblOSTCBY |= OSTCBBitX;任务调度(Task Scheduling) C/OS-内核总是运行就绪态任务中优先级最高的。前面算法已确定最

29、高优先级任务。下面由调度程序(Scheduler)完成该任务运行。任务级调度由函数OSSched()完成中断级调度由函数OSIntExt()完成 根据实时内核的设计需求,C/OS-任务调度程序运行所花费时间是个常数,与应用程序中建立的任务数无关。 程序清单任务调度程序(Task Scheduler)void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) (1) Y = OSUnMapTblOSRdyGrp; (2) OSPrioHighRdy=(INT8U)(y 0) OS

30、LockNesting-; if (OSLockNesting | OSIntNesting) = 0) OS_EXIT_CRITICAL(); OSSched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 时钟节拍 嵌入式系统本身运行的需要,同时也是嵌入式软件程序设计的需要,C/OS内核需要为用户应用程序提供周期性信号源,也就是时钟节拍,时钟节拍用于实现有关任务的时间延时和等待事件的超时确认。时钟频率,即时钟节拍率,应在每秒10次到100次之间,或者说10Hz到100Hz。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决

31、于应用程序时间精度。 启动时钟节拍用户必须在多任务系统启动后,即在调用OSStart()之后,再开启时钟节拍。调用OSStart( )后,第一件事是初始化定时中断。如误将允许时钟节拍器中断设置,放在系统初始化函数OSInit()之后,调用函数OSStart()之前,如程序清单4.19所示。这样做的潜在危险是,时钟节拍中断发生在C/OS-启动第一个任务之前,此时C/OS-内核及其各值处在一种不确定状态中,用户应用程序有可能会崩溃。 Chap4_JOB1、简述嵌入式实时操作系统C/OS-任务代码定义的基本结构。举例说明任务控制块是如何实现代码裁剪的?2、以嵌入式实时操作系统C/OS-任务就绪表结构

32、为例,说明就绪队列的基本操作及操作算法。进一步说明该算法及其数据结构的特点是什么?3、能够运用查表法选出优先级最高的任务。比如:当最高优先级为4、9等。4、能够运用查表法将某就绪的任务(priority已知)插入就绪任务表。比如当优先级为5、10等。5、能够结合任务调度函数源代码,解释任务调度程序的算法处理过程,并结合任务调度关闭函数和打开函数源代码,解释任务调度程序关闭和打开的算法处理过程。6、任务管理函数创建任务OSTaskCreate()扩展创建任务OSTaskCreateExt ()堆栈检验OSTaskStkChk()删除任务OSTaskDel()请求删除任务OSTaskDelReq(

33、)改变任务优先级OSTaskChangePrio()挂起任务OSTaskSuspend()恢复任务OSTaskResume() 任务查询OSTaskQuery()任务创建范例:任务管理数据结构:1、空闲任务链表。2、任务块链表C/OS-II内核启动 C/OS-II进行任务的管理是从调用启动函数OSStart( )开始的,当然其前提条件是在调用该函数之前至少创建了一个用户任务。任务可以在调用函数OSStart( )启动任务调度前创建,也可以在任务中创建。C/OS-II规定:在调用启动任务函数OSStart( )前,必须已经创建至少一个任务。习惯上在调用函数OSStart( )前先创建一个任务,并

34、赋它最高优先级,称为起始任务。在这个起始任务中,再创建其他各任务。如果使用系统的统计任务,则统计任务的初始化函数也在起始任务中调用。 应用程序的一般结构第六章任务通信与同步任务通信功能与需求关闭中断方法关闭任务调度方法事件事件机制信号量互斥信号量消息邮箱消息队列信号量集任务间通信手段-3(事件event)C/OS-II内核提供了事件机制,用于数据共享和任务通讯的实现。在事件机制支持下,内核提供了信号量、邮箱和消息队列、互斥信号量,事件标志等功能,用于任务间通信。保护并发任务共享数据,提供任务通讯支持。信号量、消息邮箱和消息队列等统称为事件。 事件控制块ECB事件控制块ECB(Event Con

35、trol Blocks)用来表示事件各个状态、信息及与事件相关任务列表。实时操作系统内核一般通过创建事件、删除事件、发送事件、接收事件、获取有关事件集信息等系统操作,实现事件管理基本功能。 例如:一个任务或者中断服务子程序可以通过事件控制块向另外的任务发送信号。所以,所有信号都可当成事件。 事件通信的几种情况一个任务或者中断服务子程序可以通过事件控制块向另一任务发信号。一个任务还可以等待另一个任务或中断服务子程序给它发送信号。只有任务可以等待事件发生,中断服务子程序不能。对等待状态任务,指定一个最长等待时间,来防止因为等待事件没有发生而无限等待。多个任务可以等待同一个事件。在这种情况下,当该事

36、件发生后,所有等待该事件的任务中,优先级最高的任务得到该事件并进入就绪态。事件的实现机制ECB定义C/OS-II通过c/os-II.h 中定义的OS_EVENT数据结构维护一个事件控制块的所有信息。该结构定义:用于信号量的计数器用于指向邮箱的指针指向消息队列的指针数组等待该事件所有任务的列表该数据结构定义如下:事件的实现机制ECB定义-2typedef struct INT8U OSEventType;/事件的类型 INT16U OSEventCnt;/信号量计数器 void *OSEventPtr; /消息或消息队列的指针 INT8U OSEventGrp; /等待事件的任务组 INT8U

37、OSEventTblOS_EVENT_TBL_SIZE;/任务等待表 OS_EVENT;事件控制块实现-ECB定义-3-存储结构3、将一个任务插入到事件的等待任务列表中 pevent-OSEventGrp |= OSMapTblprio 3; pevent-OSEventTblprio 3 |= OSMapTblprio & 0 x07;1、从等待任务列表中删除一个任务if (pevent-OSEventTblprio 3 &= OSMapTblprio & 0 x07) = 0) pevent-OSEventGrp &= OSMapTblprio 3; 2、在等待任务列表中查找最高优先级的任

38、务 y = OSUnMapTblpevent-OSEventGrp; x = OSUnMapTblpevent-OSEventTbly; prio = (y 3) + x;书面作业请运用相关算法,实现以下操作(默认无其他优先级任务处于同一等待表) 1、从等待任务列表中删除一个优先级为8任务2、在等待任务列表中查找最高优先级的任务(假定该任务的优先级为5)3、将一个任务插入到事件的等待任务列表中(假定该任务优先级为13)提示:1、写出算法的每一步表达式的值2、参考课件中查表算法及表值信号量机制用于实现任务间同步和互斥关系!以控制关系为主!信号量的事件控制块C/OS-II的5个信号量操作函数创建一

39、个信号量函数OSSemCreate()等待一个信号量函数OSSemPend()发送一个信号量函数OSSemPost()无等待申请一个信号量函数OSSemAccept()信号量查询函数OSSemQuery()书面作业请编写一个基于嵌入式内核的应用程序,通过调用信号量通信机制,实现两个任务间的互斥关系。请编写一个基于嵌入式内核的应用程序,通过调用信号量通信机制,实现两个任务间的同步(时序)关系。消息邮箱机制用于实现任务间单一数据的传递!由发送操作和接受操作完成!以传递信息为主!通信机制邮箱邮箱是C/OS-II中的一种通讯机制,用于实现一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指

40、针指向一个包含“消息”的数据结构。邮箱机制的裁剪方法:在C/OS-II中使用邮箱机制,将OS_CFG.H的OS_MBOX_EN常数置1。 消息邮箱及其操作消息邮箱的事件控制块事件控制块成员OSEventPrt指向数据缓冲区事件控制块成员OSEventType置为常数OS_EVENT_TYPE_MBOX消息邮箱在两个任务之间传递数据缓冲区指针进行通信。 消息邮箱的事件控制块实例邮箱操作-2C/OS-II提供了5种对邮箱的操作:创建OSMboxCreate()申请OSMboxPend()发送OSMboxPost()无等待申请OSMboxAccept()查询OSMboxQuery()下图 F6.6描

41、述了任务、中断服务子程序和邮箱间关系这里用符号“I”表示邮箱。邮箱包含的内容是一个指向一条消息的指针。一个邮箱只能包含一个这样的指针(邮箱为满时),或者一个指向NULL的指针(邮箱为空时)。程序清单 6.19:互斥资源OS_EVENT *MboxSem; MboxSem =OSMboxCreate (void *)1);void Task1 (void *pdata) INT8U err; for (;) OSMboxPend(MboxSem, 0, &err); /* 获得对资源的访问权 */ . /* 任务获得信号量,对资源进行访问 */ OSMboxPost(MboxSem, (void

42、*)1); /* 释放对资源的访问权 */ 使用邮箱作为二值信号量程序清单 6.20 使用邮箱实现延时OS_EVENT *MboxTimeDly; MboxTimeDly =OSMboxCreate (void *)0);void Task1 (void *pdata) INT8U err; for (;) OSMboxPend(MboxTimeDly, TIMEOUT, &err); /* 延时该任务 */ . /* 延时结束后执行的代码 */ void Task2 (void *pdata) INT8U err; for (;) OSMboxPost(MboxTimeDly, (void

43、*)1); /* 取消任务1的延时 */ 书面作业编写一个应用程序,实现两个任务间的消息邮箱的发送和接收,用以检验邮箱是否能够实现连续发送和连续接收?消息队列及其操作使用消息队列可以在任务之间传递多条消息。消息队列由3个部分组成:事件控制块、消息队列控制块和消息队列。事件控制块成员OSEventType置为OS_EVENT_TYPE_Q时,该事件控制块描述的就是一个消息队列。消息队列的数据结构如下图所示。消息队列相当于共用一个任务等待列表的消息邮箱数组,事件控制块成员OSEventPtr指向消息队列控制块(OS_Q),管理一个指针数组MsgTbl 。消息队列-1消息队列是C/OS-II一种通讯

44、机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。C/OS-II消息队列裁剪,在OS_CFG.H 文件中的OS_Q_EN常数置为1;OS_MAX_QS设定消息队列数。使用消息队列前,必须先创建该消息队列,调用OSQCreate()函数,并定义消息队列中消息数。 消息队列-2-操作C/OS-II提供了7个对消息队列进行操作的函数:创建消息队列函数OSQCreate( )请求消息队列函数OSQPend( )发送消息队列函数OSQPost( )发送消息队列函数OSQPostFront( )无等待请求消息队列函数OSQAccept( )清空消息队列函数OSQFlush( )

45、查询消息队列函数OSQQuery( )下图是任务、中断服务子程序和消息队列之间的关系。使用消息队列读取模拟量的值 控制系统中,经常要频繁读取模拟量的值。可以建立一个定时任务使用OSTimeDly() ,并且设定一个抽样周期。如图所示,让A/D采样任务从一个消息队列中等待消息。该任务等待时限就是抽样周期。当没有其它任务向该消息队列中发送消息时,A/D采样任务因等待超时而退出等待状态并进行抽样。OSTimeDly()函数功能。 另外利用消息队列,可以让其它的任务向消息队列发送消息来终止A/D采样任务等待消息,使其马上执行一次A/D采样。再者通过消息队列通知A/D采样任务具体对哪个通道进行采样,告诉

46、它增加采样频率等等,从而使应用更智能化。例如:可以告诉A/D采样程序,“现在马上读取通道3的输入值!”之后,该采样任务将重新开始在消息队列中等待消息,准备开始一次新的扫描过程。 下面是如图 6.11所示的任务task运行过程。创建一个如图所示消息队列Queue。 任务调用等待消息队列函数OSQPend(),并设定等待时限。等待时限到时,任务开始执行,告知传感器MUX接受同步输入信号一次,即采样一次。(设计一个采样任务)任务通知模数转换器ADC,对来自MUX的信号进行转换和检测等操作。(设计一个转换检测任务)模数转换器ADC将数据转换结果发给任务,任务完成数据接收,对数据进行必要处理。完成一次采

47、样。其它任务也可根据需求,向消息队列发送消息,使得task任务能够随时提前执行任务的采样功能,不受设定的延迟周期的限制。(设计一个随机采样任务)应用实例任务设计主任务task采样任务转换检测任务随机采样任务使用一个消息队列作为计数信号量 在消息队列初始化时,可以将消息队列中的多个指针设为非NULL值(如void* 1),来实现计数信号量的功能。初始化为非NULL值的指针数就是可用的资源数。系统中的任务可以通过OSQPend()来请求资源,然后通过调用OSQPost()来释放资源,如下面程序清单所示。如果系统中只使用了计数信号量和消息队列,使用这种方法可以有效地节省代码空间。这时将OS_SEM_

48、EN设为0,就可以不使用信号量,而只使用消息队列。值得注意的是,这种方法为资源引入了大量的指针变量。为了节省代码空间,牺牲了RAM空间。对消息队列的操作要比对信号量的操作慢,因此,当用计数信号量同步的信号量很多时,这种方法的效率非常低。 程序清单 L6.28 使用消息队列作为一个计数信号量OS_EVENT *QSem;void *QMsgTblN_RESOURCESvoid main (void) OSInit(); QSem = OSQCreate(&QMsgTbl0, N_RESOURCES); for (i = 0; i N_RESOURCES; i+) OSQPost(Qsem, (v

49、oid *)1); OSTaskCreate(Task1, ., ., .); OSStart();void Task1 (void *pdata) INT8U err; for (;) OSQPend(&QSem, 0, &err); /* 得到对资源的访问权 */ . /* 任务获得信号量,对资源进行访问 */ OSMQPost(QSem, (void*)1); /* 释放对资源的访问权 */书面作业编写一个应用程序,应用消息队列建立一个定时运行的任务,每隔30秒,进行一次模拟采样操作,并将采样数据交由另一个任务使用。互斥型信号量及其数据结构描述互斥型信号量的事件控制块成员OSEventT

50、ype赋为OS_EVENT_TYPE_MUTEX以表明这是一个互斥型信号量没用成员OSEventPtr成员OSEventCnt被分成了低位和高位两部分:低位用来存放信号值(该值为0 xFF时,表示信号为有效,可以使用,否则信号为无效,只能等待!)高位用来存放为了避免出现优先级反转现象,而要提升的优先级别prio。 数据结构的具体分布如下图所示!互斥信号量操作:创建调用函数OSMutexCreate( )。函数OSMutexCreate( )的原型如下:OS_EVENT *OSMutexCreate (INT8U prio,/暂提升的优先级INT8U *err/错误信息);函数OSMutexCr

51、eate( )从空事件控制块链表获取一个事件控制块,把成员OSEventType赋为OS_EVENT_TYPE_MUTEX,表明这是一个互斥型信号量把成员OSEventCnt的高8位赋以prio欲提升的优先级,低8位赋以常数OS_MUTEX_AVAILABLE,该常数值为0 xFFFF的低8位0 xFF,以表明信号量尚未被任何任务占用,处于有效状态,可以申请。互斥型信号量操作:请求任务需要访问一个独占资源,可调用函数OSMutexPend( )请求该资源互斥信号量,如果信号量可用,OSEventCnt的低8位为0 xFF,则表明目前尚无任务占用资源,任务可以继续运行并对该资源进行访问,否则就进

52、入等待状态,直至占用这个资源的其他任务释放该信号量。 函数OSMutexPend( )的原型为:void OSMutexPend (OS_EVENT *pevent,/互斥信号量指针INT16U timeout, /等待时限INT8U *err/错误信息);发送一个互斥型信号量任务通过调用函数OSMutexPost( )发送一个互斥型信号量,这个函数的原型为:INT8U OSMutexPost (OS_EVENT *pevent );/互斥型信号量指针无等待请求互斥信号量函数原型:INT8U OSMutexAccept (OS_EVENT *pevent, INT8U *err)该函数检查互斥

53、信号量是否可用,如果资源不可用或事件未发生,并不挂起调用该函数的任务。删除互斥信号量OS_EVENT *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *err)该函数能够当没有等待任务时删除互斥信号量,或无条件删除互斥信号量,并就绪所有等待该信号量的任务。查询互斥信号量INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *pdata)该函数获取互斥信号量信息。OS_EVENT *pevent:指向指定互斥信号量的事件控制块指针。OS_MUTEX_DATA *pdata:指向包含互斥信号量信息的结

54、构体指针。书面作业编写两个程序,创建3个任务,分别使用信号量和互斥信号量,演示优先级反转和优先级反转的解决!信号量集机制实际应用中,任务需要与多个事件同步,根据多个信号量组合的结果,决定任务运行与否。C/OS-II为了实现多个信号量组合,专门定义了一种数据结构信号量集。信号量集管理的信号量都是二值信号,信号量集实质上是一种可以对多个输入的逻辑信号进行基本逻辑运算的组合逻辑示意图如下所示 :信号量集及其相关任务信号量集数据结构描述嵌入式实时内核C/OS-II的信号量集由两部分组成:标志组:存放信号量集中的所有信号等待任务链表:表中的每个结点都对应一个等待信号量集的任务。(事件)标志组OS_FLA

55、G_GRP等待信号量集的有效条件(逻辑关系)等待任务链表的节点示例信号量集的发送和接收信号量集的应用接口创建任务可以通过调用函数OSFlagCreate ( )来创建一个信号量集。OSFlagCreate ( )的函数原型为:OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags,/信号的初始值INT8U *err/错误信息);请求信号(等待一个设定的二进制位组合)任务可以通过调用函数OSFlagPend( )请求一个信号量集:OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, /请求信号量集指针OS_FLAGS flags, /滤波器I

56、NT8U wait_type, /逻辑运算类型INT16U timeout, /等待时限INT8U *err/错误信息); 功能:该函数可等待一个事件标志组设定的二进制位组合,可请求任意位或所有位置1。返回值:当任务恢复、等待时间到时,或错误发生时,事件标志组中flag的新状态值。发送信号(发送一个事件标志二进制组合)任务可以通过调用函数OSFlagPost ( )向信号量集发信号,函数原型:OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, /信号量集指针OS_FLAGS flags, /选择所要发送的信号INT8U opt, /信号有效的选项INT8U *err

57、/错误信息);任务向信号量集发信号,对信号量集标志组中的信号置1或置0操作。对信号量集中的哪些信号操作,用函数参数flags来指定对指定信号置1还是置0,函数参数opt指定。opt = OS_FLAG_SET为置1opt = OS_FLAG_CLR为置0 功能描述:调用该函数设置或清除一个事件标志组的若干二进制位,通过“位掩码”对指定二进制位进行设置。返回值:事件标志位的新值。*调用说明:由任务或 ISR调用,该函数的执行时间取决于等待该事件标志组的任务数量,禁止中断的时间长度取决于等待该事件标志组的任务数量。无等待请求信号(一个设定的二进制位组合)函数原型:OS_FLAGS OSFlagAc

58、cept (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err)该函数用于检测事件标志组中的二进制位组合的状态,是被设置还是被清除。应用程序能够通过检测,令任何二进制位或所有二进制位设置或清除。如果期望的标志不存在,该调用不会阻塞。无等待请求信号(一个设定的二进制位组合) -2OS_FLAGS OSFlagAccept(OS_FLAG_GRP *pgrp, /指向指定事件标志组指针OS_FLAGS flags, / 二进制位,指明希望检测等待的二进制位,例如,应用程序试图等待第0和1位,flag的值应设为0 x03INT

59、8U wait_type, /指明应用程序置1或清0所有或任意二进制位可以按以下方式指定:OS_FLAG_WAIT_CLR_ALL:检验flag所有位是否清零OS_FLAG_WAIT_CLR_ANY:检验flag任意位是否清零OS_FLAG_WAIT_SET_ALL:检验flag所有位是否置1OS_FLAG_WAIT_SET_ANY:检验flag任意位是否清零INT8U *err/错误代码)查询事件标志OS_FLAGS OSFlagQuery (OS_FLAG_GRP *pgrp, INT8U *err)功能:该函数用于检测事件标志组的值。参数:pgrp 指向指定的事件标志组的指针。 err

60、错误代码指针 OS_NO_ERR 调用成功 OS_FLAG_INVALID_PGRP 指针非法 OS_ERR_EVENT_TYPE 类型非法返回值:该该事件标志组当前的值。调用说明:可由任务或 ISR调用。作业创建3个任务,其中:一个任务每隔4秒接收信号量集中的第1、3、5位的信号“1”;另一个任务每隔3秒接收信号量集中的第0、2、4位的信号“1”;第三个任务每隔2秒向信号量集中信号发送信号“1”。多个分区的等长内存块内存控制块C/OS-II对内存进行两级管理,即把一个大片连续的内存空间分成了若干个分区,每个分区又分成了若干个大小相等的内存块来进行管理。操作系统以分区管理动态内存,任务以内存块

温馨提示

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

评论

0/150

提交评论