嵌入式操作系统教程第九章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《嵌入式操作系统教程第九章课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 操作系统 教程 第九 课件
- 资源描述:
-
1、嵌入式操作系统基础 第九章 任务的同步与通信1 第九章 任务的同步与通信u任务间的同步和事件控制块u信号量及其操作u任务优先级反转和互斥型信号量u消息邮箱及其操作u消息队列及其操作嵌入式操作系统基础 第九章 任务的同步与通信2第九章 任务的同步与通信一、任务间的同步 鉴于任务间直接制约或间接制约性的关系,这种制约性的合作运行机制叫做任务的同步。二、事件 用于uC/OS-II任务间通信媒介的信号量、邮箱和消息队列等数据结构会影响到任务的程序流程,这些通信媒介又被称为事件(Events)。9.1 任务间的同步和事件控制块嵌入式操作系统基础 第九章 任务的同步与通信31.信号量互斥型信号量:通常表现
2、为一个二值型信号,用一位二进制位来表示(1/0),可以实现共享资源的独占式占用。信号量:通常表现为一个递减的计数器信号,可以实现若干个同类资源的共享,提高资源使用效率。嵌入式操作系统基础 第九章 任务的同步与通信42.消息邮箱 指向保存任务间传递信息的存储空间(缓存区)的指针结构称为消息邮箱。嵌入式操作系统基础 第九章 任务的同步与通信53.消息队列 若消息邮箱被定义成拥有若干个元素的数组,用来传递多个消息的地址指针,这样消息的数据结构称为消息队列。4.事件的等待任务队列两个功能:v对等待事件的所有记录进行登记并排序v允许任务有一定的等待时间嵌入式操作系统基础 第九章 任务的同步与通信6嵌入式
3、操作系统基础 第九章 任务的同步与通信7三、事件控制块v事件控制块的结构vOSEventPtr指针,只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构。typedef struct void *OSEventPtr;/*指向消息或者消息队列的指针*/INT8U OSEventTblOS_EVENT_TBL_SIZE;/*等待任务列表 */INT16U OSEventCnt;/*计数器(当事件是信号量时)*/INT8U OSEventType;/*事件类型 */INT8U OSEventGrp;/*等待任务所在的
4、组 */OS_EVENT;嵌入式操作系统基础 第九章 任务的同步与通信8v.OSEventTbl/.OSEventGrp 与前面提过的OSRdyTbl和OSRdyGrp非常相像,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。v.OSEventCnt:当事件是一个信号量时,.OSEventCnt是用于信号量的计数器。v.OSEventType:定义了事件的具体类型。它可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。用户要根据该域的具体值来调用相应的系统函数,以保证对其进行
5、的操作的正确性。嵌入式操作系统基础 第九章 任务的同步与通信9四、事件控制块的基本操作函数1.事件控制块的初始话函数 函数作用:把变量OSEventGrp及任务等待表中的每一位都清0,即令事件的任务等代表中不含有任何等待任务。void OSEventWaitListInit(OS_EVENT*pevent)INT8U i;pevent-OSEventGrp=0 x00;for(i=0;i OSEventTbli=0 x00;嵌入式操作系统基础 第九章 任务的同步与通信102.使一个任务进入等待状态的函数 当一个任务在请求一个事件而不能获得时,应把次任务登记在时间的等待任务列表中,并把任务控制块
6、中的任务状态置为等待状态和吧任务置为非就绪任务void OSEventTaskWait(OS_EVENT*pevent)OSTCBCur-OSTCBEventPtr=pevent;(1)if(OSRdyTblOSTCBCur-OSTCBY&=OSTCBCur-OSTCBBitX)=0)(2)OSRdyGrp&=OSTCBCur-OSTCBBitY;pevent-OSEventTblOSTCBCur-OSTCBY|=OSTCBCur-OSTCBBitX;(3)pevent-OSEventGrp|=OSTCBCur-OSTCBBitY;嵌入式操作系统基础 第九章 任务的同步与通信113.正在等待的
7、任务进入就绪状态 当一个正在等待的任务具备了可以运行的条件,这时需调用此函数来使它进入就绪状态。该函数的作用就是把调用这个函数的任务在任务等待表中的位置清O后,再把任务子啊任务就绪表中的对应位置1,然后引起一次任务调度。void OSEventTaskRdy(OS_EVENT*pevent,void*msg,INT8U msk)OS_TCB*ptcb;INT8U x;INT8U y;INT8U bitx;INT8U bity;INT8U prio;嵌入式操作系统基础 第九章 任务的同步与通信124.等待超时的任务转为就绪态 正在等待事件的任务在预先指定的时间内仍然没有获取事件,这时需调用此函数
8、来转换的它的状态。void OSEventTO(OS_EVENT*pevent)if(pevent-OSEventTblOSTCBCur-OSTCBY&=OSTCBCur-OSTCBBitX)=0)(1)pevent-OSEventGrp&=OSTCBCur-OSTCBBitY;OSTCBCur-OSTCBStat =OS_STAT_RDY;(2)OSTCBCur-OSTCBEventPtr=(OS_EVENT*)0;(3)嵌入式操作系统基础 第九章 任务的同步与通信13五、空事件控制块的的组织 和任务控制块的组织结构类似:所有的事件控制块也被组织成两个链表,当系统初始化时,通过控制块指针OS
9、EventPtr把所有的空时间控制块链接成一个空事件控制块链表。嵌入式操作系统基础 第九章 任务的同步与通信149.1 信号量及其操作一、信号量 由16位的无符号整数(0 到65,535之间)构成的信号量计数器和任务等待表两部分组成。计数器决定共享资源的任务数。嵌入式操作系统基础 第九章 任务的同步与通信15二、信号量的操作1.信号量的创建:信号量一旦建立就不能删除了,因此也就不可能将一个已分配的任务控制块再放回到空闲ECB链表中。OS_EVENT*OSSemCreate(INT16U cnt)OS_EVENT*pevent;OS_ENTER_CRITICAL();pevent=OSEvent
10、FreeList;(1)if(OSEventFreeList!=(OS_EVENT*)0)(2)OSEventFreeList=(OS_EVENT*)OSEventFreeList-OSEventPtr;OS_EXIT_CRITICAL();if(pevent!=(OS_EVENT*)0)(3)pevent-OSEventType=OS_EVENT_TYPE_SEM;(4)pevent-OSEventCnt =cnt;(5)OSEventWaitListInit(pevent);(6)return(pevent);(7)信号量创建嵌入式操作系统基础 第九章 任务的同步与通信162.等待一个信号
11、量,OSSemPend()/OSSemAccept()void OSSemPend(OS_EVENT*pevent,/信号量指针 INT16U timeout,/等待时限 INT8U*err);/错误信息 INT16U OSSEMAccept(OS_EVENT*PEVENT/信号量指针 )3.发送一个信号量发送一个信号量,OSSemPost()()任务获得信号量,并在访问共享资源结束以后,必须释放信号量,此过程需调用函数OSSemPost()完成。嵌入式操作系统基础 第九章 任务的同步与通信17INT8U OSSemPost(OS_EVENT*pevent)OS_ENTER_CRITICAL(
12、);if(pevent-OSEventType!=OS_EVENT_TYPE_SEM)(1)OS_EXIT_CRITICAL();return(OS_ERR_EVENT_TYPE);if(pevent-OSEventGrp)(2)OSEventTaskRdy(pevent,(void*)0,OS_STAT_SEM);(3)OS_EXIT_CRITICAL();OSSched();(4)return(OS_NO_ERR);else if(pevent-OSEventCnt OSEventCnt+;(5)OS_EXIT_CRITICAL();return(OS_NO_ERR);else OS_EX
展开阅读全文