第5章:任务间通信.pptVIP

  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文档。上传文档
查看更多
(六)信号量 程序样例 — 对共享资源的竞争访问 改进的方法 使任务申请Blk失败时挂起,有缓冲区被释放时使优先级最高的任务就绪 优点:大大提升CPU使用效率, 避免任务做“无用功” 如何实现? (六)信号量 程序样例 — 对共享资源的竞争访问 使用信号量 OS_EVENT *pevent = NULL; pevent = OSSemCreate( 8 ); void* IReqBlk( void ) { void * p = NULL; INT8U err; OSSemPend( pevent, 0, err); p = ReqBlk( ); if(p) { return p; } return NULL; } void IFreeBlk(void *p) { FreeBlk(p); OSSemPost( pevent ); } 在任务中申请/释放缓冲区时, 调用该函数对即可 (六)信号量 程序样例 — 临界区保护(互斥) 程序场景及功能描述 系统中设有全局数据区,用于存放运行参数 任务1对参数进行设置 其他任务读取参数并根据参数运行 任务1在设置参数时其他任务不允许读取参数以免数据错误 (六)信号量 程序样例 —临界区保护(互斥) 程序实现 struct { ... } Parameters OS_EVENT *pevent = NULL; pevent = OSSemCreate( 1 ); void Task1( void ) { INT8U err; OSSemPend( pevent, 0, err); /* Set Parameters 临界区*/ OSSemPost( pevent ); } void TaskN( void ) { INT8U err; OSSemPend( pevent, 0, err); /* Read Parameters 临界区*/ OSSemPost( pevent ); } 也可用互斥型信号量实现, 关于uC/OS-II中的互斥信号量请参看教材! (六)信号量 程序样例 — 任务间同步 程序场景及功能描述 任务1运行至A处,生成数据并写入全局数据区 任务2等待任务1完成写入操作后开始运行,从全局数据区中读出数据进行后续操作 任务2需等待任务1发出信号后方能继续运行,即任务2与任务1同步 (六)信号量 程序样例 —任务间同步 程序实现 struct { ... } Parameters OS_EVENT *pevent = NULL; pevent = OSSemCreate( 0 ); void Task1( void ) { INTU8 err; /* Set Parameters */ OSSemPost( pevent ); } void Task2( void ) { INTU8 err; OSSemPend( pevent, 0, err); /* Read Parameters 继续运行 */ } 任务2先运行至此挂起 发出信号同步任务2 在uC/OS-II中也可采用事件标志 进行同步,请参看教材! (六)信号量 代码实现 OSSemCreate } return (pevent); (7) } OSEventWaitListInit(pevent); (6) pevent-OSEventCnt = cnt; (5) pevent-OSEventType = OS_EVENT_TYPE_SEM; (4) if (pevent != (OS_EVENT *)0) { (3) OS_EXIT_CRITICAL(); } OSEventFreeList = (OS_EVENT *)OSEventFreeList-OSEventPtr; if (OSEventFreeList != (OS_EVENT *)0) { (2) pevent = OSEventFreeList; (1) OS_ENTER_CRITICAL(); OS_EVENT *pevent; { OS_EVENT *OSSemCreate (INT16U cnt) 初始化一个事件控制块。当创建一个信号量、邮箱或消息队列时,相应的创建函数会调用该函数对ECB的内容进行初始化,将OSEventGrp和OSE

文档评论(0)

188****7657 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档