嵌入式软件开发技术和工具 chp6 行为同步.pptVIP

嵌入式软件开发技术和工具 chp6 行为同步.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第6章 行为同步 mabo124@ 2009-2-7 6.1 用于行为同步的通信手段 6.2 行为同步 行为同步 一个任务的运行过程需要和其他任务的运行配合,才能得到预定的效果。任务之间的这种动作配合和协调关系称为“行为同步”。 行为同步的结果体现为任务之间的运行按某种预定的顺序来进行,故又称为“顺序控制”。 特点 在一次同步的过程中,其中一个任务(或ISR)为“控制方”,它使用OS提供的某种通信手段发出控制信息;另一个任务为“被控制方”,它通过通信手段得到控制信息后即进入就绪状态,根据优先级高低,或者立即进入运行状态,或者随后某个时刻进入运行状态。 被控制方的运行状态受到控制方发出的信息的控制,即被控制方的运行状态由控制方发出的信息来“同步”。 用于行为同步的通信方式 二值信号量 计数信号量 事件标志组 消息邮箱 消息队列 一个简单的信号量 小 结 当同步信号不需要传输具体内容时,可选择信号量手段 当同步过程需要传输具体内容时,可选择消息类手段 当满足”任何时候同步信息的生产速度都比同步信息的消费速度慢”时,可选择简单的通信手段 ISR与任务之间的同步 两个任务之间的单向同步 任务之间的双向同步 多个任务相互同步 “逻辑或”的同步控制 * * 内容 系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行。因此,操作系统必须具有对任务的运行进行协调的能力,从而使任务之间可以无冲突、流畅地同步运行,而不致导致灾难性的后果。 与人们依靠通信来互相沟通,从而使人际关系和谐、工作顺利的做法一样,计算机系统是依靠任务之间的良好通信来保证任务与任务的同步的。 例如,两个任务:任务A和任务B,它们需要通过访问同一个数据缓冲区合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责从缓冲区读取该数据。显然,当任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因不能从缓冲区得到有效数据而应该处于等待状态,只有等任务A向缓冲区写入了数据之后,才应该通知任务B去取数据。 例如,任务A和任务B共享一台打印机,如果系统已经把打印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等待状态,只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打印机的使用权。如果这两个任务不这样做,那么也会造成极大的混乱 。 总之,多个任务共享同一资源或有工作顺序要求时,在正式工作之前要互相打招呼 。 黄宏:别走啊! 宋丹丹:我自己的腿,我爱走就走,你管不着! 黄宏:腿是你自己的,但手是咱俩的呀! 事件 任务间的同步依赖于任务间的通信。在μC/OS-II中,是使用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务之间的通信的。 宋丹丹 黄宏 1/0 收信方 发信方 共享资源 收信方 发信方 共享资源 1→0 信号量 先请求信号量 后请求信号量 任务1先获得信号量并使用共享资源, 而任务2只能等待信号量 收信方 发信方 共享资源 0→1→0 信号量 发送信号量 请求信号量 任务1释放信号量后,任务2可获得 信号量并使用共享资源 信号量及其操作 在使用信号量之前,应用程序必须调用函数OSSemCreate( )来创建一个信号量,OSSemCreate( )的原型为: ? OS_EVENT *OSSemCreate ( INT16U cnt //信号量计数器初值 ); ? 函数的返回值为已创建的信号量的指针。 任务通过调用函数OSSemPend( )请求信号量,函数OSSemPend( )的原型如下: ? void OSSemPend ( OS_EVENT *pevent, //信号量的指针 INT16U timeout, //等待时限 INT8U *err); //错误信息 ? 参数pevent是被请求信号量的指针。 为防止任务因得不到信号量而处于长期的等待状态,函数OSSemPend允许用参数timeout设置一个等待时间的限制,当任务等待的时间超过timeout时可以结束等待状态而进入就绪状态。如果参数timeout被设置为0,则表明任务的等待时间为无限长。 任务获得信号量,并在访问共享资源结束以后,必须要释放信号量,释放信号量也叫做发送信号量,发送信号量需调用函数OSSemPost ( )。OSSemPost ( )函数在对信号量的计数器操作之前,首先要检查是否还有等待该信号量的任务。如果没有,就把信号量计数器OSEventCnt加一;如果有,则调用调度器OS_Sched( )去运行等待任务中优先级别最高的任务。 函数OSSemPost ( )的原型为: ? INT8U

文档评论(0)

bb213 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档