嵌入式实时操作系统-------任务同步与通信.ppt

嵌入式实时操作系统-------任务同步与通信.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式实时操作系统-------任务同步与通信

第四章 任务同步与通信 任务间并不是完全独立的,他们相互之间有合作. 这就需要任务之间有交流----任务同步与通信 4.1 同步和事件控制块 Uc/osii中的事件可能是信号量、邮箱(消息邮箱)、消息队列 一、信号 量: 表明资 源状态 单片机无操作系统编程的信号量实现 例4-1 不使用信号量情况,出现两个任务访问共享资源的交织情况 例4-2 使用状态参数标识资源占用情况 功能上实现互斥, 缺点是:程序的多个地方需要修改,程序可读性稍差,编程的复杂度也稍高。 二、消息邮箱 任务间传递数据,新的数据结构----消息指针 三、消息队列 消息邮箱指一个消息指针,若多个数据传递,则使用消息指针数组,也就是消息队列 ★四、等待任务列表 以上三种实现了资源的共享,但是对于没有取得共享权的任务(处于等待状态)仍需要进行等待任务管理。 一、等待任务记录并排序 二、允许一定的等待时限 4.1.3 事件控制块 数据结构(Ucos-II.h文件中): 任务等待表的基本操作 将一个任务插入事件等待列表 从等待任务列表中删除一个任务 在等待任务表中查找最高优先级任务 4.1.4 操作事件控制块的函数 Uc/os-ii中有四个事件控制块基本操作函数 (OS_CORE.C文件中) 1、初始化函数 EventWaitListInit()形成空事件控制块 2、使任务进入等待状态函数OS_EventTaskWait() 3、使一个任务进入就绪态,OSEventTaskRdy() 必须注意,此函数并不总是将任务调入就绪态,有一个条件判断,只有OSTCBStat参数变成0才这样做 4、使等待超时任务进入就绪态OS_EventTo() ,被OSXXXPend()函数调用 4.1.5空事件控制块链表 事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定。 该值由OS_CFG.H 中的#define OS_MAX_EVENTS定义 在调用OSInit()时,所有事件控制块被链接成一个单向链表——空闲事件控制块链表 。每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并初始化。 信号量的原理 为什么要用信号量 用一个参数来标识,先占用的任务A先执行,并设置该参数(信号量)无效,A完成后,再设置为有效,使其他任务可以获取。实现了避免多任务使用同一资源的冲突 信号量的六个函数 OSCreateSem()、OSSemPend()、OSSemPost() OSSemAccept()、OSSemDel()、OSSemQuery() OSSemPend()、OSSemAccept() OSSemPend() 等待信号量出现再继续执行,同时释放CPU使用权,挂起任务。 1、信号量为零表示无效,非零表示有效 2、中断中不允许请求信号量 3、timeout=0表示等待时间无限长 4、若希望无论有效与否都继续运行则调用函数OSSemAccept() OSSemPost() OSSemDel() 功能:删除信号量 执行:根据条件可选择是否立即删除。 注:只能在任务中删除,不能在中断中删除 OSSemQuery() 功能:将信号量信息保存到OS_SEM_DAT类型的变量中。 较少使用 互斥信号量 信号量的问题: 优先级反转(教材例4-6) 互斥型信号量(Mutex) 形式上与Sem类似,区别在于: 1) 二值性----OSEventCnt低8位为0xff时有效,否则无效 2) 提升优先级----暂时提升获得信号量的任务的优先级别 互斥信号量系统函数 创建OSMutexCreate() OSEvent OSMutexCreate(INT8U prio, INT8U *err) 请求互斥信号量OSMutexPend()和OSMutexAccept() void OSMutexPend(OSEvent *pevent, INT16U timeout, INT8U *err) 发送(释放)互斥信号量OSMutexPost() INT8U OSMutexPost( OSEvent *pevent) 获取状态OSMutexQuery()和删除互斥信号量OSMutexDel() 4.4 消息邮箱及其操作 任务间传递数据(不是某共享资源的占用问题),需要有个数据缓冲区。 把这个缓冲区的指针(地址)装载到一个事件控制块中,则只要通过事件控制

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档