第4章 任务的同步和通信.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文档。上传文档
查看更多
* 这个函数的主要作用查看邮箱指针OSEventPtr是否为NULL,如果不为NULL,则把邮箱中的消息指针返回给调用函数的任务,同时用OS_NO_ERR通过函数的参数err统治任务获取消息成功,如果是NULL,则使任务进入等待状态,并引发一次任务调度。 * OS_MBOX_DATA结构如下: #if OS_MBOX_EN 0 typedef struct { void *OSMsg; INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; INT8U OSEventGrp; } OS_MBOX_DATA; #endif * * 从图中可以看到,消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员OSEventPtr指向一个叫做队列控制块(OS_Q)的结构,该结构管理一个数组MSGTbl[],该数组中的元素都是一些指向消息的指针。 .OSQPtr在空闲队列控制块中链接所有的队列控制块。一旦建立了消息队列,该域就不再有用了。 .OSQStart是指向消息队列的指针数组的起始地址的指针。用户应用程序在使用消息队列之前必须先定义该数组。 .OSQEnd是指向消息队列结束单元的下一个地址的指针。该指针使得消息队列构成一个循环的缓冲区。 .OSQIn是指向消息队列中插入下一条消息的位置的指针。当.OSQIn和.OSQEnd相等时,.OSQIn被调整指向消息队列的起始单元。 .OSQOut是指向消息队列中下一个取出消息的位置的指针。当.OSQOut和.OSQEnd相等时,.OSQOut被调整指向消息队列的起始单元。 .OSQSize是消息队列中总的单元数。该值是在建立消息队列时由用户应用程序决定的。在μC/OS-II中,该值最大可以是65,535。 .OSQEntries是消息队列中当前的消息数量。当消息队列是空的时,该值为0。当消息队列满了以后,该值和.OSQSize值一样。 在消息队列刚刚建立时,该值为0。 * 消息队列的核心是消息指针数组,图5-15表示了消息指针数组的结构,其中各参数含义见表5-2。 其中可移动的指针为OSQIn和OSQOut,而指针OSQStart和OSQEnd只是一个标志(常指针)。当可移动的指针OSQIn或OSQOut移动到数组末尾,也就是与OSQEnd相等时,可移动的指针将会被调整到数组的起始位置OSQStart。也就是说,从效果上看,指针OSQEnd与OSQStart等值。于是,这个由消息指针构成的数组就头尾衔接起来形成了一个环形队列。 向指针数组中插入消息指针的方式有2种:先进先出(FIFO)方式和后进先出(LIFO)方式。当采用先进先出方式时,消息队列将在指针OSQIn指向的位置插入消息指针,而把指针OSQOut指向的位置作为输出。当采用后进先出方式时,则只使用指针OSQOut,当向队列插入消息指针时,指针OSQOut将先移动到图5-15虚线所示位置,再按指针OSQOut指向的位置插入消息指针,输出时指针OSQOut无须进行移动,就把指针OSQOut指向的消息指针输出。 * 在uc/os-ii初始化时,系统将按文件OS_CFG.H中的配置常数OS_MAX_QS定义OS_MAX_QS个队列控制块,并用队列控制块中的指针OSQPtr将所有队列控制块链接为链表。由于这时还没有使用他们,因此这个链表叫做空队列控制块链表。 每当任务创建一个消息队列时,就会在空队列控制块链表中摘取一个控制块供消息队列来使用,并令该消息队列事件控制块中的指针OSEventPtr指向这个队列控制块;而当任务释放一个消息队列时,就会将该消息队列使用的队列控制块归还空队列控制块链表。 * * * OSQPost()为FIFO方式发送消息, OSQPostFront()为LIFO方式发送。 * * 查询消息队列的参数pdata是OS_Q_DATA类型的指针,结构如下: typedef struct { void *OSMsg; INT16U OSNMsgs; INT16U OSQSize; INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; INT8U OSEventGrp; } OS_Q_DATA; * * * * 应用程序中的各个任务,必须通过彼此之间的有效合作,才能完成一项大规模的工作。因为这些任务在运行时,经常需要互

文档评论(0)

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

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

1亿VIP精品文档

相关文档