任务同步.pptVIP

  1. 1、本文档共96页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
任务同步

任务之间的同步 本章主要讲述: 任务之间的关系 事件控制块 信号量及其相关函数 任务之间的单向同步 任务之间的双向同步 任务之间的资源访问同步 多个任务同步一个任务 一、任务之间的关系 事件控制块 信号量概述 一、信号量的功能 标志某个事件的发生(一般用旗帜表示),用于实现任务之间的同步 表示对共享资源的使用权(一般用钥匙表示),用于实现对共享资源的互斥访问 二、信号量的组成 信号量的计数值 等待该信号量的任务组成的等待任务表 三、如何设定信号量的初始计数值? 如果表示一个事件的发生,则其初始值应为0; 如果表示对一个共享资源的使用权,则初始值应为1;如果有n个相同的共享资源,则初始值应为n。 信号量的定义 信号量的创建 申请(等待)一个信号量 调用函数成功后,函数返回值为OS_ON_ERR,否则会根据具体错误返回: OS_ERR_PEND_ISR:不能在中断服务程序中申请信号量 OS_ERR_PEVENT_NULL:信号量指针为空指针 OS_ERR_EVENT_TYPE:事件类型错误 OS_SEM_TIMEOUT:超时 OSSemPend()函数类似与操作系统中的wait操作(P操作)。 当一个任务调用该函数时,如果信号量有效(信号量计数值0),则将信号量计数值减1并继续执行; 如果信号量无效(信号量计数值=0),则该任务进入等待状态,并引发任务调度。 问题:如何知道哪些任务是在等该信号量? 释放(发出)一个信号量 信号量的删除 注意! 删除一个信号量之前,必须检查是否有任务在等待该信号量。 如果参数opt为OS_DEL_NO_PEND,则如果有任务在等待该信号量,则不允许删除该信号量。 如果参数opt为OS_DEL_ALWAYS,则先将所有等待该信号量的任务置为就绪状态,然后在删除该信号量。 通过信号量实现任务之间的单向同步 问题讨论分析: 控制任务、被控任务优先级设计:?? 信号量计数值初始值设置。 控制方(生产者)在同步点调用“发送信号量”服务函数,被控制方(消费者)在任务的同步点调用“等待信号量”的服务函数。如果信号量的值大于0,则将信号量的值减1并继续运行下去;如果计数型信号量的值为0,则使自己挂起,等待控制方发送信号量。 任务之间的单向同步示例 设计两个任务:MyTask(优先级为6)和YourTask(优先级为5)。YourTask任务的优先级较高,任务调度后进入运行状态。 YourTask首先创建一个初始值为0的信号量, 然后进入循环,进入循环后的第一个语句为OSSemPend(sem,0,err),由于信号量sem的值为0,所以任务YourTask进入等待状态; 任务MyTask调度进入运行状态,进入任务循环,首先显示字符串“任务MyTask:等待按Enter键!”,等待用户按键,按Enter键后执行发送信号量命令OSSemPost(sem); 任务YourTask获得等待的信号量,由等待状态进入就绪,由于其优先级较高,马上被调度进入执行状态,播放一段音频。然后在进行下一次循环,等待信号量。 任务单向同步要注意的地方 被控制任务(等待信号量的任务、消费者)优先级较高,控制任务(发送信号量任务、生产者)优先级较低,这样才能实现被控制任务总是处于等待同步信号量的状态,一旦控制任务发送信号量,被控制任务又能够立即投入运行。 一般情况下消费者消费速度较快、生产速度较慢,所以一般能够达到生产-消费-生产-消费。。。的平衡,否则就可能打破这种平衡。 任务之间的双向同步 问题讨论: 生产任务、消费任务的优先级设计 信号量设计 同步设计 任务之间双向同步示例 如果消费者的消费速度未必大于生产者生产速度,但仍希望达到生产、消费平衡,亦即生产后才能消费,消费完后才能继续生产。 该程序通过两个二值信号量实现两个任务的双向同步,达到生产-消费-生产-消费。。。的平衡。 void MyTask(void *pdata) { INT16U i,j; INT8U err; while(1) { OSSemPend(sem1,0,err); if(err == OS_NO_ERR) { printf(任务MyTask:我制造快乐!\n); Beep(1950, 20); //for(i=0;i3000;i++) { //通过空循环延时,可尝试去掉看看结果如何? // for(j=0;j50000;j++); //} } OSSemPost(sem2); } } void YourTask(void *pdata) { IN

您可能关注的文档

文档评论(0)

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

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

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档