欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    嵌入式操作系统uCUS2简介.ppt

    • 资源ID:6569772       资源大小:1MB        全文页数:68页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式操作系统uCUS2简介.ppt

    第五章 嵌入式实时操作系统分析,1,2023/11/13,第5章 实时操作系统C/OS-简介,2023/11/13,第五章 嵌入式实时操作系统分析,2,本章提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,第五章 嵌入式实时操作系统分析,3,2023/11/13,RTOS是32位的嵌入式CPU的软件基础,RTOS内核 提供CPU的管理硬件初时化,MMU,定时器,中断RTOS 内核提供任务,内存管理RTOS提供设备管理,文件和网络的支持RTOS提供C/C+,JAVA,图形模块等编程接口,1,C/OS-简介,第五章 嵌入式实时操作系统分析,4,2023/11/13,C/OSMicro Controller O S,微控制器操作系统C/OS简介美国人Jean Labrosse 1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 1998年C/OS-II,目前的版本C/OS-II V2.612000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中网站(),1,C/OS-简介,第五章 嵌入式实时操作系统分析,5,2023/11/13,公开源代码可移植性(Portable)绝大部分 C/OS-II的源码是用移植性很强的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调用,而另一个产品则使用了几乎所有 C/OS-II的功能,这样可以减少产品中的 C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。,C/OS的性能特点(一),1,C/OS-简介,第五章 嵌入式实时操作系统分析,6,2023/11/13,占先式(Preemptive)多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性。任务栈 每个任务有自己单独的栈,C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。稳定性与可靠性,C/OS的性能特点(二),1,C/OS-简介,第五章 嵌入式实时操作系统分析,7,2023/11/13,C/OS-II图书,描述了C/OS-II内部的工作原理随书的CD中包含了源代码工业界最清晰的源代码除英文版外,有中文和韩文版,Chinese,Korean,English,ISBN 1-57820-103-9美国CMP BOOK,ISBN 7-81077-290-2北京航空航天大学出版社,ISBN 89-951540-5-5,1,C/OS-简介,第五章 嵌入式实时操作系统分析,8,2023/11/13,C/OS-II的各种商业应用,全世界有数百种产品在应用:AvionicsMedicalCell phonesRouters and switchesHigh-end audio equipmentWashing machines and dryersUPS(Uninterruptible Power Supplies)Industrial controllersGPS Navigation SystemsMicrowave RadiosInstrumentationPoint-of-sale terminals更多,1,C/OS-简介,第五章 嵌入式实时操作系统分析,9,2023/11/13,C/OS-II提供的系统服务,信号量带互斥机制的信号量减少优先级倒置的问题事件标志消息信箱消息队列内存管理时钟管理任务管理,1,C/OS-简介,2023/11/13,第五章 嵌入式实时操作系统分析,10,本章提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,第五章 嵌入式实时操作系统分析,11,2023/11/13,本部分给出C/OS-的主要结构概貌。将学习以下一些内容;C/OS-是怎样处理临界段代码的;什么是任务,怎样把用户的任务交给C/OS-;任务是怎样调度的;应用程序CPU的利用率是多少,C/OS-是怎样知道的;怎样写中断服务子程序;什么是时钟节拍,C/OS-是怎样处理时钟节拍的;C/OS-是怎样初始化的,以及怎样启动多任务;还描述以下函数,这些服务于应用程序:OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL(),OSInit(),OSStart(),OSIntEnter()和 OSIntExit(),OSSchedLock()和 OSSchedUnlock(),以及 OSVersion().,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,12,2023/11/13,C/OS-II的文件结构,H,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,13,2023/11/13,临界段(Critical Sections),OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。因为这两个宏的定义取决于所用的微处理器,故在文件OS_CPU.H中可以找到相应宏定义。每种微处理器都有自己的OS_CPU.H文件。,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,14,2023/11/13,任务task,典型的任务一个无限循环。void mytask(void*pdata)for(;)do something;waiting;do something;,2,C/OS-内核结构,C/OS II 2.5版本支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO-0。,第五章 嵌入式实时操作系统分析,15,2023/11/13,一个任务通常是一个无限的循环。一个任务看起来像其它C的函数一样,有函数返回类型,有形式参数变量,但是任务是绝不会返回的。故返回参数必须定义成void。,不同的是,当任务完成以后,任务可以自我删除,如清单所示。注意任务代码并非真的删除了,C/OS-只是简单地不再理会这个任务了,这个任务的代码也不会再运行,如果任务调用了OSTaskDel(),这个任务绝不会返回什么。,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,16,2023/11/13,Task Structure,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,17,2023/11/13,任务状态,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,18,2023/11/13,任务级的任务调度-OSSched,C/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文(任务)切换。C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。,两个关键:优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号;,根据就绪表确定最高优先级,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,19,2023/11/13,任务调度(Task Scheduling),C/OS-总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的。这个函数将在以后描述。OSSched()的代码如程序清单,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,20,2023/11/13,Task scheduler,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,21,2023/11/13,C/OS-任务调度所花的时间是常数,与应用程序中建立的任务数无关。如程序清单中L(1)条件语句的条件不满足,任务调度函数OSSched()将退出,不做任务调度。这个条件是:如果在中断服务子程序中调用OSSched(),此时中断嵌套层数OSIntNesting0,或者由于用户至少调用了一次给任务调度上锁函数OSSchedLock(),使OSLockNesting0。如果不是在中断服务子程序调用OSSched(),并且任务调度是允许的,即没有上锁,则任务调度函数将找出那个进入就绪态且优先级最高的任务L(2),进入就绪态的任务在就绪任务表中有相应的位置位。一旦找到那个优先级最高的任务,OSSched()检验这个优先级最高的任务是不是当前正在运行的任务,以此来避免不必要的任务调度L(3)。注意,在C/OS中曾经是先得到OSTCBHighRdy然后和OSTCBCur做比较。因为这个比较是两个指针型变量的比较,在8位和一些16位微处理器中这种比较相对较慢。而在C/OS-中是两个整数的比较。并且,除非用户实际需要做任务切换,在查任务控制块优先级表OSTCBPrioTbl时,不需要用指针变量来查OSTCBHighRdy。综合这两项改进,即用整数比较代替指针的比较和当需要任务切换时再查表,使得C/OS-比C/OS在8位和一些16位微处理器上要更快一些。,2,C/OS-内核结构,Task scheduler,第五章 嵌入式实时操作系统分析,22,2023/11/13,为实现任务切换,OSTCBHighRdy必须指向优先级最高的那个任务控制块OS_TCB,这是通过将以OSPrioHighRdy为下标的OSTCBPrioTbl数组中的那个元素赋给OSTCBHighRdy来实现的L(4)。接着,统计计数器OSCtxSwCtr加1,以跟踪任务切换次数L(5)。最后宏调用OS_TASK_SW()来完成实际上的任务切换L(6)。,2,C/OS-内核结构,Task scheduler,第五章 嵌入式实时操作系统分析,23,2023/11/13,任务切换很简单,由以下两步完成,将被挂起任务的微处理器寄存器推入堆栈,然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。在C/OS-中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,C/OS-运行就绪态的任务所要做的一切,只是恢复所有的CPU寄存器并运行中断返回指令。为了做任务切换,运行OS_TASK_SW(),人为模仿了一次中断。多数微处理器有软中断指令或者陷阱指令TRAP来实现上述操作。中断服务子程序或陷阱处理(Trap hardler),也称作事故处理(exception handler),必须提供中断向量给汇编语言函数OSCtxSw()。OSCtxSw()除了需要OS_TCBHighRdy指向即将被挂起的任务,还需要让当前任务控制块OSTCBCur指向即将被挂起的任务。OSSched()的所有代码都属临界段代码。在寻找进入就绪态的优先级最高的任务过程中,为防止中断服务子程序把一个或几个任务的就绪位置位,中断是被关掉的。为缩短切换时间,OSSched()全部代码都可以用汇编语言写。为增加可读性,可移植性和将汇编语言代码最少化,OSSched()是用C写的。,Task scheduler,第五章 嵌入式实时操作系统分析,24,2023/11/13,给调度器上锁函数OSSchedlock()用于禁止任务调度,直到任务完成后调用给调度器开锁函数OSSchedUnlock()为止。调用OSSchedlock()的任务保持对CPU的控制权,尽管有个优先级更高的任务进入了就绪态。然而,此时中断是可以被识别的,中断服务也能得到(假设中断是开着的)。OSSchedlock()和OSSchedUnlock()必须成对使用。变量OSLockNesting跟踪OSSchedLock()函数被调用的次数,以允许嵌套的函数包含临界段代码,这段代码其它任务不得干预。C/OS-允许嵌套深度达255层。当OSLockNesting等于零时,调度重新得到允许。函数OSSchedLock()和OSSchedUnlock()的使用要非常谨慎,因为它们影响C/OS-对任务的正常管理。,给调度器上锁和开锁(Locking and UnLocking the Scheduler),2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,25,2023/11/13,给调度器上锁,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,26,2023/11/13,当OSLockNesting减到零的时候,OSSchedUnlock()调用OSSched。OSSchedUnlock()是被某任务调用的,在调度器上锁的期间,可能有什么事件发生了并使一个更高优先级的任务进入就绪态。调用OSSchedLock()以后,用户的应用程序不得使用任何能将现行任务挂起的系统调用。也就是说,用户程序不得调用OSMboxPend()、OSQPend()、OSSemPend()、OSTaskSuspend(OS_PR1O_SELF)、OSTimeDly()或OSTimeDlyHMSM(),直到OSLockNesting回零为止。因为调度器上了锁,用户就锁住了系统,任何其它任务都不能运行。,2,C/OS-内核结构,给调度器上锁,当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时(见 任务间通讯和同步),用户不希望高优先级的任务在邮箱、队列和信号量没有得到消息之前就取得了CPU的控制权,此时,用户可以使用禁止调度器函数。,第五章 嵌入式实时操作系统分析,27,2023/11/13,给调度器开锁,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,28,2023/11/13,任务切换,将被挂起的任务寄存器入栈将较高优先级任务的寄存器出栈,任务级的任务切换OS_TASK_SW(),OS_TASK_SW()是宏调用,含有微处理器的软中断指令OS_TASK_SW()将处理器相关的软件中断机制封装起来,便于操作系统移植,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,29,2023/11/13,调用OS_TASK_SW()前的数据结构,低优先级任务 OS_TCB,OSTCBCur(1),存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTCBHighRdy(3),(2),CPU,(4),(5),2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,30,2023/11/13,保存当前CPU寄存器的值,低优先级任务 OS_TCB,OSTCBCur,存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTCBHighRdy(3),(2),CPU,(4),(5),(1),(3),2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,31,2023/11/13,重新装入要运行的任务,低优先级任务 OS_TCB,OSTCBCur,存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTCBHighRdyOSTCBCur(1),(2),CPU,(4),(1),(3),(4),2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,32,2023/11/13,任务切换OS_TASK_SW()的代码,Void OSCtxSw(void)将R1,R2,R3及R4推入当前堆栈;OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdy OSTCBStkPtr;将R4,R3,R2及R1从新堆栈中弹出;执行中断返回指令;,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,33,2023/11/13,C/OS-II中的中断,中断:由于某种事件的发生,而导致程序流程的改变。产生中断的事件称为中断源。CPU响应中断的条件:至少有一个中断源向CPU发出中断信号;系统允许中断,且对此中断信号未予屏蔽中断类型:硬件中断 外部中断 陷井中断 现场控制量的中断,C/OS中,中断服务子程序要用汇编语言来写。然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。中断服务子程序的示意码如程序清单所示。,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,34,2023/11/13,C/OS-II中的中断服务子程序,用户中断服务子程序:保存全部CPU寄存器;(1)调用OSIntEnter()或OSIntNesting直接加1;(2)if(OSIntNesting=1)OSTCBCur-OSTCBStkPtr=SP;清中断源;重新开中断;执行用户代码做中断服务;(3)调用OSIntExit();(4)恢复所有CPU寄存器;(5)执行中断返回指令;(6),2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,35,2023/11/13,中断服务,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,36,2023/11/13,进入中断函数OSIntEnter()的代码如程序清单L16所示,从中断服务中退出函数OSIntExit()的代码如程序清单L17所示。如前所述,OSIntEnter()所做的事是非常少的。,2,C/OS-内核结构,中断服务,程序清单 L16 通知C/OS-,中断服务子程序开始了.void OSIntEnter(void)OS_ENTER_CRITICAL();OSIntNesting+;OS_EXIT_CRITICAL();,第五章 嵌入式实时操作系统分析,37,2023/11/13,2,C/OS-内核结构,中断服务,L17 通知C/OS-,脱离了中断服务,第五章 嵌入式实时操作系统分析,38,2023/11/13,空闲任务OSTaskIdle(),2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,39,2023/11/13,初始化统计任务,2,C/OS-内核结构,第五章 嵌入式实时操作系统分析,40,2023/11/13,C/OS-的启动,2,C/OS-内核结构,2023/11/13,第五章 嵌入式实时操作系统分析,41,本章提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,第五章 嵌入式实时操作系统分析,42,2023/11/13,建立任务,Use one of two servicesOS TaskCreate()OSTaskCreateExt(),3,C/OS-任务管理,第五章 嵌入式实时操作系统分析,43,2023/11/13,在前面的章节中,我们知道:任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。这里要注意的是,任务代码并不是被真正的删除了,而只是C/OS-不再理会该任务代码,所以该任务代码不会再运行。任务看起来与任何C函数一样,具有一个返回类型和一个参数,只是它从不返回。任务的返回类型必须被定义成void型。在本节中所提到的函数可以在OS_TASK文件中找到。如前所述,任务必须是以下两种结构之一:,3,C/OS-任务管理,建立任务,第五章 嵌入式实时操作系统分析,44,2023/11/13,3,C/OS-任务管理,建立任务,第五章 嵌入式实时操作系统分析,45,2023/11/13,或,3,C/OS-任务管理,建立任务,第五章 嵌入式实时操作系统分析,46,2023/11/13,堆栈检验,OSTaskStkChk()删除任务,OSTaskDel()请求删除任务,OSTaskDelReq()改变任务的优先级,OSTaskChangePrio()挂起任务,OSTaskSuspend()恢复任务,OSTaskResume(),其它相关函数,3,C/OS-任务管理,2023/11/13,第五章 嵌入式实时操作系统分析,47,本章提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,第五章 嵌入式实时操作系统分析,48,2023/11/13,C/OS-(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等功能。这个定时中断叫做时钟节拍,它应该每秒发生10至100次。时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就越重。前面讨论了时钟的中断服务子程序和时钟节拍函数OSTimeTick该函数用于通知C/OS-发生了时钟节拍中断。本节主要讲述五个与时钟节拍有关的系统服务:OSTimeDly()OSTimeDlyHMSM()OSTimeDlyResume()OSTimeGet()OSTimeSet()本节所提到的函数可以在OS_TIME.C文件中找到。,4,C/OS-时间管理,第五章 嵌入式实时操作系统分析,49,2023/11/13,无论时钟节拍何时发生,C/OS-都会将一个32位的计数器OSTime加1。这个计数器在用户调用OSStart()初始化多任务和4,294,967,295个节拍执行完一遍的时候从0开始计数。在时钟节拍的频率等于100Hz的时候,这个32位的计数器每隔497天就重新开始计数。用户可以通过调用OSTimeGet()来获得该计数器的当前值。也可以通过调用OSTimeSet()来改变该计数器的值。OSTimeGet()和OSTimeSet()两个函数的代码如程序清单 L5.4所示。注意,在访问OSTime的时候中断是关掉的。这是因为在大多数8位处理器上增加和拷贝一个32位的数都需要数条指令,这些指令一般都需要一次执行完毕,而不能被中断等因素打断。,系统时间,OSTimeGet()和OSTimeSet(),4,C/OS-时间管理,第五章 嵌入式实时操作系统分析,50,2023/11/13,#if OS_TIME_GET_SET_EN 0INT32U OSTimeGet(void)#if OS_CRITICAL_METHOD=3/*Allocate storage for CPU status register*/OS_CPU_SR cpu_sr;#endif INT32U ticks;OS_ENTER_CRITICAL();ticks=OSTime;OS_EXIT_CRITICAL();return(ticks);#endif,4,C/OS-时间管理,系统时间,OSTimeGet(),第五章 嵌入式实时操作系统分析,51,2023/11/13,#if OS_TIME_GET_SET_EN 0void OSTimeSet(INT32U ticks)#if OS_CRITICAL_METHOD=3/*Allocate storage for CPU status register*/OS_CPU_SR cpu_sr;#endif OS_ENTER_CRITICAL();OSTime=ticks;OS_EXIT_CRITICAL();#endif,4,C/OS-时间管理,系统时间,OSTimeSet(),2023/11/13,第五章 嵌入式实时操作系统分析,52,本章提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,2023/11/13,第五章 嵌入式实时操作系统分析,53,C/OS-任务通信与同步目录,5.1 事件控制块ECB,5.2 信号量,5.3 邮箱,5.4 消息队列,第五章 嵌入式实时操作系统分析,54,2023/11/13,任务间通信手段,C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护OSSchedLock()禁止调度保护任务级的共享资源。提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,5,C/OS-任务通信与同步,第五章 嵌入式实时操作系统分析,55,2023/11/13,一个任务或者中断服务子程序可以通过事件控制块ECB(Event Control Blocks)来向另外的任务发信号。这里,所有的信号都被看成是事件(Event)。这也说明为什么上面把用于通讯的数据结构叫做事件控制块。一个任务还可以等待另一任务或中断服务程序给它发送信号。这里要注意的是,只有任务可以等待事件发生,中断服务子程序是不能这样做的A。对于处于等待状态的任务,还可以给它指定一个最长等待时间,以此来防止因为等待的事件没有发生而无限期地等下去。多个任务可以同时等待同一个事件的发生。在这种情况下,当该事件发生后,所有等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪状态,准备执行B。上面讲到的事件,可以是信号量、邮箱或者消息队列等。当事件控制块是信号量时,任务可以等待它,也可以给它发送消息C。,5,C/OS-任务通信与同步,任务间通信手段,第五章 嵌入式实时操作系统分析,56,2023/11/13,5,C/OS-任务通信与同步,任务间通信手段,事件控制块ECB(Event Control Blocks)的应用,第五章 嵌入式实时操作系统分析,57,2023/11/13,事件控制块ECB,程序 ECB的结构如下-typedef struct void*OSEventPtr;/*指向消息或消息队列的指针*/INT8U OSEventTblOS_EVENT_TBL_SIZE;/*等待任务列表*/INT16U OSEventCnt;/*计数器(当事件是信号量时)*/INT8U OSEventType;/*事件类型:信号量、邮箱等*/INT8U OSEventGrp;/*等待任务组*/OS_EVENT;与TCB类似的结构,使用两个链表,空闲链表与使用链表,所有的通信信号都被看成是事件(event),一个称为事件控制块(ECB,Event Control Block)的数据结构来表征每一个具体事件,ECB的结构如下,5,C/OS-任务通信与同步,2023/11/13,第五章 嵌入式实时操作系统分析,58,C/OS-任务通信与同步目录,5.1 事件控制块ECB,5.2 信号量,5.3 邮箱,5.4 消息队列,第五章 嵌入式实时操作系统分析,59,2023/11/13,任务、中断服务子程序和信号量之间的关系,Task,ISR,Task,OSSemPend(),OSSemAccept(),OSSemQuery(),OSSemPost(),OSSemPost(),OSSemAccept(),OR,OSSemCreate(),N,N,5,C/OS-任务通信与同步,2023/11/13,第五章 嵌入式实时操作系统分析,60,C/OS-任务通信与同步目录,5.1 事件控制块ECB,5.2 信号量,5.3 邮箱,5.4 消息队列,第五章 嵌入式实时操作系统分析,61,2023/11/13,邮 箱,邮箱是C/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。为了在C/OS-II中使用邮箱,必须将OS_CFG.H中的OS_MBOX_EN常数置为1。使用邮箱之前,必须先建立该邮箱。该操作可以通过调用OSMboxCreate()函数来完成,并且要指定指针的初始值。C/OS-II提供了5种对邮箱的操作:OSMboxCreate(),OSMboxPend(),OSMboxPost(),OSMboxAccept()和OSMboxQuery()函数,5,C/OS-任务通信与同步,第五章 嵌入式实时操作系统分析,62,2023/11/13,任务、中断服务子程序和邮箱之间的关系,Task,ISR,Task,OSMboxPend(),OSMboxAccept(),OSMboxQuery(),OSMboxPost(),OSMboxPost(),OSMboxAccept(),OSMboxCreate(),Mailbox,Message,5,C/OS-任务通信与同步,第五章 嵌入式实时操作系统分析,63,2023/11/13,程序清单 L6.20 使用邮箱实现延时OS_EVENT*MboxTimeDly;void Task1(void*pdata)INT8U err;for(;)OSMboxPend(MboxTimeDly,TIMEOUT,/*取消任务1的延时*/.,5,C/OS-任务通信与同步,用邮箱实现延时,而不使用OSTimeDly(),如果在指定的时间段TIMEOUT内,没有消息到来,Task1()函数将继续执行。这和OSTimeDly(TIMEOUT)功能很相似。,但是,如果Task2()在指定的时间结束之前,向该邮箱发送了一个“哑”消息,Task1()就会提前开始继续执行。这和调用OSTimeDlyResume()函数的功能是一样的。,2023/11/13,第五章 嵌入式实时操作系统分析,64,C/OS-任务通信与同步目录,5.1 事件控制块ECB,5.2 信号量,5.3 邮箱,5.4 消息队列,第五章 嵌入式实时操作系统分析,65,2023/11/13,消息队列,消息队列是C/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。为了使用C/OS-II的消息队列功能,需要在OS_CFG.H 文件中,将OS_Q_EN常数设置为1,并且通过常数OS_MAX_QS来决定C/OS-II支持的最多消息队列数。在使用一个消息队列之前,必须先建立该消息队列。这可以通过调用OSQCreate()函数,并定义消息队列中的单元数(消息数)来完成。C/OS-II提供了7个对消息队列进行操作的函数:OSQCreate(),OSQPend(),OSQPost(),OSQPostFront()(LIFO),OSQAccept(),OSQFlush()和OSQQuery()函数,5,C/OS-任务通信与同步,第五章 嵌入式实时操作系统分析,66,2023/11/13,任务、中断服务子程序和消息队列之间的关系,5,C/OS-任务通信与同步,第五章 嵌入式实时操作系统分析,67,2023/11/13,5,C/OS-任务通信与同步,使用消息队列读取模拟量的值,使用消息队列读取模拟量的值,2023/11/13,第五章 嵌入式实时操作系统分析,68,本章提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,

    注意事项

    本文(嵌入式操作系统uCUS2简介.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开