VxWorks的任务间通信.ppt

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

VxWorks及其应用开发 陈香兰 xlanchen@ /~xlanchen 2006年7月 课程内容 VxWorks和Tornado简介 任务和任务间通信 信号、中断处理与定时机制 调试环境与实例分析 网络编程 VxWorks操作系统配置 任务间通信(cont’d) xlanchen@2006.7.18 4、信号量 信号量是提供任务间通信、同步和互斥的最优选择 将对共享资源的访问上锁,比中断上锁、抢占上锁的粒度细 三种类型的信号量: 二进制信号量:用于同步或互斥 互斥信号量:特殊的二进制信号量 资源信号量:资源计数器,随着资源的分配和释放而变化 4.1、信号量控制接口 无论是上述哪一种信号量,Wind提供一套单一的接口用于控制信号量 semGive()、semFlush()、semDelete()的参数都是semID,表示要操作的信号量 但semTake()多了一个超时参数 4.2、二进制信号量 二进制信号量用于互斥和同步 二进制信号量对应的资源只有两个状态 可用或不可用(二进制的来由) 使用semBCreate创建 semTake()用于取一个信号量,其结果取决于相应资源是否可用 semGive()释放一个信号量,其结果也依赖信号量的状态 4.3 使用二进制信号量互斥 当两个或多个任务共享使用同一块内存缓冲或者同一个I/O设备资源时,可能会发生竞争状态 例如: 5个任务共享一个缓冲来处理气象信息, 任务A~D向缓冲写数据, 任务E从缓冲读数据 使用二进制信号量互斥 二进制信号量通过对共享资源上锁,实现高效的互斥访问 使用这种技术时,创建的二进制信号量的初始值为信号量可用 当任务需要访问共享资源时,必须使用semTake()获取信号量 当任务持有这个信号量时,所有其他想要访问这个资源的任务将被阻塞 因此,任务完成对资源的访问后,应当释放信号量,允许其他任务使用这个资源 一个典型的互斥访问资源的程序: 4.4 使用二进制信号量同步 用作任务同步时,信号量可看成是任务等待的一个状态或事件 初始信号量:不可用 由一个任务或中断处理程序来释放一个信号量,从而通知事件的发生 其他任务调用semTake()时会阻塞以等待事件的发生 举例 下面的例子使用信号量实现任务同步 包括3个子程序:Init、Task1以及一个ISR Init init()创建一个二进制信号量,将一个事件与一个ISR相连接 然后发起一个任务处理这个事件 task1 Task1一直运行到semTake(),在这个点上,它将一直阻塞,直到一个事件发生引起ISR调用semGive() 在中断处理中释放信号量,引发task1要处理的事件 当ISR完成task1将恢复执行处理这个事件 注意 使用二进制信号量实现互斥与同步差别 信号量的初始化状态不同 互斥:资源一开始是可用的 同步:资源一开始是不可用的(事件还没有发生) 使用模式也不同 互斥:任务必须先取得信号量,而后释放 同步:某些任务中取得信号量,另外一些任务释放信号量(当事件发生时) 4.5 互斥信号量 互斥信号量是一种特殊的二进制信号量,主要用于解决具有内在的互斥问题: 优先级继承、删除安全、对资源的递归访问等等 互斥信号量的基本行为与二进制信号量一致,不同之处在于: 它仅能用于互斥 仅能由执行semTake()的任务释放、不能在ISR中释放 semFlush()操作非法 使用semMCreate()创建互斥信号量 优先级倒转 优先级倒转发生在一个高优先级的任务被迫等待一段不确定的时间,等待一个低优先级任务完成 例如 优先级倒转现象 VxWorks允许使用优先级继承算法,可以保证系统的可预测性 互斥信号量的SEM_INVERSION_SAFE选项指明使用优先级继承算法 优先级继承算法: 假设一个低优先级的任务1拥有互斥资源 若有一个高优先级的任务2希望获得该资源,但由于资源被其他任务占用,任务2被阻塞,任务1继承任务2的优先级在高优先级上运行 若又有一个更高优先级的任务3希望获得这个资源,同样的,任务3被阻塞,任务1继承任务3的优先级在更高优先级上运行 ……(任务1总是继承被阻塞任务中的最高优先级) 当任务1最终释放互斥资源时,唤醒等待队列上的第一个任务 (优先级继承选项必须与SEM_Q_PRIORITY一齐使用) 使用优先级继承解决优先级倒转问题 举例,优先级倒转 编译 运行inversion 上机作业,将上述程序修改,以解决优先级倒转问题 删除安全 互斥的另一个问题涉及到任务删除 在一个受信号量保护的临界区,经常需要保护在临界区执行的任务不会被意外的删除 可能造成保护资源的信号量不可用 可能导致资源处于破坏状态 使得其他需要访问该资源的任务无法得到满足 SEM_DELETE_SAFE选项 互斥信号量的

文档评论(0)

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

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

1亿VIP精品文档

相关文档