嵌入式实时操作系统-------任务同步与通信_第1页
已阅读1页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、1第四章 任务同步与通信任务间并不是完全独立的,他们相互之间有合作.这就需要任务之间有交流-任务同步与任务同步与通信通信24.1 同步和事件控制块1、直接制约:、直接制约:(若共享资源是数据缓冲),任务B必须等到任务A把数据送到共享区,才能提取数据进行处理 -任务的执行顺序问题任务的执行顺序问题2、间接制约:、间接制约:(若共享资源是打印机),任务A占用了打印机,则任务B就无法得到打印机控制权了 -任务的互斥问题任务的互斥问题任务A任务B共享资源4.1.1 任务间的同步:任务间的同步:3 Uc/osii中的事件可能是信号量、邮箱(消息邮箱)、消息队列 一、信号 量: 表明资 源状态4.1.2

2、事件:任务同步依赖任务间通信,事件:任务同步依赖任务间通信,通信的手段是利用通信的手段是利用事件事件4单片机无操作系统编程的信号量实现 例4-1 不使用信号量情况,出现两个任务访问共享资源的交织情况 例4-2 使用状态参数标识资源占用情况 功能上实现互斥, 缺点是:程序的多个地方需要修改,程缺点是:程序的多个地方需要修改,程序可读性稍差,编程的复杂度也稍高。序可读性稍差,编程的复杂度也稍高。5 二、消息邮箱 任务间传递数据,新的数据结构-消息指针6 三、消息队列 消息邮箱指一个消息指针,若多个数据传递,则使用消息指针数组,也就是消息队列7 四、等待任务列表四、等待任务列表 以上三种实现了资源的

3、共享,但是对于没有取得共享权的任务(处于等待状态)仍需要进行等待任务管理。 一、等待任务记录并排序 二、允许一定的等待时限84.1.3 事件控制块事件控制块 数据结构数据结构(Ucos-II.h文件中文件中): typedef struct INT8U OSEventType; /* 事件类型 */ void *OSEventPtr; /* 指向消息或者消息队列的指针 */ INT16U OSEventCnt; /* 计数器(当事件是信号量时) */ INT8U OSEventGrp; /* 等待任务所在的组 */ INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等

4、待任务列表 */ OS_EVENT;9事件控制块结构的任务等待列表事件控制块结构的任务等待列表10任务等待表的基本操作 将一个任务插入事件等待列表 从等待任务列表中删除一个任务 在等待任务表中查找最高优先级任务pevent-OSEventGrp |= OSMapTblprio 3; pevent-OSEventTblprio 3 |= OSMapTblprio & 0 x07;if (pevent-OSEventTblprio 3 &= OSMapTblprio & 0 x07) = 0) pevent-OSEventGrp &= OSMapTblprio 3;

5、 y = OSUnMapTblpevent-OSEventGrp; x = OSUnMapTblpevent-OSEventTbly; prio = (y OSEventGrp = 0 x00; for (i = 0; i OSEventTbli = 0 x00; 12 2、使任务进入等待状态函数OS_EventTaskWait()void OSEventTaskWait (OS_EVENT *pevent) OSTCBCur-OSTCBEventPtr = pevent; (1)(1)将指向事件控制块的指针放到将指向事件控制块的指针放到任务的任务控制块中任务的任务控制块中 if (OSRdy

6、TblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) (2)(2)将任务从就绪任务表中删除将任务从就绪任务表中删除 OSRdyGrp &= OSTCBCur-OSTCBBitY; pevent-OSEventTblOSTCBCur-OSTCBY |= OSTCBCur-OSTCBBitX; (3)(3)把该任务放到事件控制块的等待任务表把该任务放到事件控制块的等待任务表 pevent-OSEventGrp |= OSTCBCur-OSTCBBitY;13 3、使一个任务进入就绪态,OSEventTaskRdy() 必须注意,此函数并不总是

7、将任务调入就绪态,有一个条件判断,只有OSTCBStat参数变成0才这样做void OSEventTaskRdy ( OS_EVENT *pevent, /事件控制块指针 void *msg, /未使用 INT8U msk ) /清除TCB状态标志掩码 14 4、使等待超时任务进入就绪态OS_EventTo() ,被OSXXXPend()函数调用void OSEventTO (OS_EVENT *pevent) if (pevent-OSEventTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) (1)(1)从事件控制块中的等待任务列表里从事

8、件控制块中的等待任务列表里将任务删除将任务删除 pevent-OSEventGrp &= OSTCBCur-OSTCBBitY; OSTCBCur-OSTCBStat = OS_STAT_RDY; (2)(2)把它置成就绪状态把它置成就绪状态 OSTCBCur-OSTCBEventPtr = (OS_EVENT *)0; (3)(3)任务控制块中将任务控制块中将指向事件控制块的指针删除指向事件控制块的指针删除 154.1.5空事件控制块链表 事件控制块的总数总数由用户所需要的信号量、邮箱和消息队列的总数决定。 该值由OS_CFG.H 中的#define OS_MAX_EVENTS定义

9、在调用OSInit()时,所有事件控制块被链接成一个单向链表单向链表空闲事件控制块链表空闲事件控制块链表 。每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并初始化。 16信号量的原理 为什么要用信号量 用一个参数来标识,先占用的任务A先执行,并设置该参数(信号量)无效,A完成后,再设置为有效,使其他任务可以获取。实现了避免多任务使用同一资源的冲突 信号量的六个函数 OSCreateSem()、OSSemPend()、OSSemPost() OSSemAccept()、OSSemDel()、OSSemQuery()17中断,任务和信号量的关系18OS_EVENT *

10、OSSemCreate (INT16U cnt) OS_EVENT *pevent; OS_ENTER_CRITICAL(); pevent = OSEventFreeList; (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-OS

11、EventCnt = cnt; (5) OSEventWaitListInit(pevent); (6)19OSSemPend()、OSSemAccept() OSSemPend() 等待信号量出现再继续执行,同时释放CPU使用权,挂起任务。1、信号量为零表示无效,非零表示有效2、中断中不允许请求信号量3、timeout=0表示等待时间无限长4、若希望无论有效与否都继续运行则调用函数OSSemAccept()20OSSemPost()功能功能:任务释放信号量执行执行:检查是否有任务在等待该信号量,有则使之进入就绪态,并运行等待该信号量的最高优先级任务;没有则将OSEventCnt加1注:注:中

12、断子程序可以调用该函数,但不会在中断中进行任务切换21OSSemDel() 功能功能:删除信号量 执行执行:根据条件可选择是否立即删除。 注注:只能在任务中删除,不能在中断中删除22OSSemQuery() 功能:将信号量信息保存到OS_SEM_DAT类型的变量中。 较少使用23互斥信号量 信号量的问题: 优先级反转(教材例4-6) 互斥型信号量(Mutex) 形式上与Sem类似,区别在于区别在于: 1) 二值性-OSEventCnt低8位为0 xff时有效,否则无效 2) 提升优先级-暂时提升获得信号量的任务的优先级别 24互斥信号量系统函数 创建OSMutexCreate() OSEven

13、t OSMutexCreate(INT8U prio, INT8U *err) 请求互斥信号量OSMutexPend()和OSMutexAccept() void OSMutexPend(OSEvent *pevent, INT16U timeout, INT8U *err) 发送(释放)互斥信号量OSMutexPost() INT8U OSMutexPost( OSEvent *pevent) 获取状态OSMutexQuery()和删除互斥信号量OSMutexDel()254.4 消息邮箱及其操作消息邮箱及其操作 任务间传递数据(不是某共享资源的占用问题),需要有个数据缓冲区。 把这个缓冲区

14、的指针(地址)装载到一个事件控制块中,则只要通过事件控制块传递这个指针就实现了数据传递。因此,这个事件这个事件控制块就叫做邮箱。(参考图)控制块就叫做邮箱。(参考图)26邮箱的操作 创建邮箱OSMboxCreate() OSEvent OSMboxCreate(void *msg) 向邮箱发消息OSMboxPost()和OSMboxPostOpt() INT8U OSMboxPost(OS_Event *pevent, void *msg) INT8U OSMboxPost(OS_Event *pevent, void *msg, INT8U opt) 请求消息邮箱OSMboxPend()和OSMboxAccept() void OSMboxPend(OSEvent *pevent, INT16U timeout, INT8U *err) 查询邮箱信息OSMboxQuery() 删除邮箱OSMboxDel()274.5 消息队列及其操作 功能与概念功能与概念:任务间传递多条消息,相当于一个共用单一任务

温馨提示

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

评论

0/150

提交评论