2消息队列实验.doc

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

2.6 消息队列实验 2.6.1 实验目的 ? 掌握嵌入式实时操作系统 μC/OS-II 中消息队列机制的基本原理和使用方法。 2.6.2 实验设备 ? 硬件:STM32 实验平台,ULINK2 仿真器套件,PC 机; ? 软件:μVision IDE for ARM 集成开发环境。 2.6.3 实验设计 在本实验中,设计了 6 个普通应用任务:Task1(优先级为 1)、Task2(优先级为 2)、Task3(优先级为 3)、Task4(优先级为 4)、Task5(优先级为 5)、Task6(优先级为 6),以及一个控制任务 TaskCon(优先级为 7)。 μC/OS-II 中,等待消息的任务总是按照优先级的高低来决定获得消息的顺序的。具体的设计思路为: 创建队列的功能:创建一个等待属性为 FIFO 的消息队列 1;创建一个等待属性为 LIFO 的消息队列 2。 考察以 FIFO 方式释放消息的消息队列:由任务 Task1、Task2、Task3 等待队列 1 中的消息。Task1、Task2、Task3 使用相同的任务代码(Taskq1 函数)。 考察以 LIFO 方式释放消息的消息队列:由任务 Task4、Task5、Task6 等待队列 2 中的消息。Task4、Task5、Task6 使用相同的任务代码(Taskq2 函数)。 考察删除消息队列的安全性: 在任务 Task4、Task5、Task6 等待队列 2 中的消息的过程中,让 TaskCon 删除队列 2;当队列 2 被删除后,检查任务 Task4、Task5、Task6 调用接收消息的函数是否返回错误码。 2.6.4 本实验中所用到的 μC/OS-II 相关函数 1. OSQCreate() 该函数用于建立一个消息队列。任务或中断可以通过消息队列向一个或多个任务发送消息。消息的含义是和具体的应用密切相关的。 函数原型:OS_EVENT *OSQCreate( void **start, INT8U size); 参数说明:start 是消息内存区的首地址,消息内存区是一个指针数组。 Size 是消息内存区的大小。 返回值:OSQCreate()函数返回一个指向消息队列控制块的指针。如果没有空闲的控制块,OSQCreate()函数返回空指针。 2. OSQPend() 该函数用于任务等待消息。消息通过中断或任务发送给需要的任务。消息是一个指针变量,在不同的应用中消息的具体含义不同。如果调用 OSQPend()函数时队列中已经存在消息,那么该消息被返回给 OSQPend()函数的调用者,该消息同时从队列中清除。如果调用 OSQPend()函数时队列中没有消息,OSQPend()函数挂起调用任务直到得到消息或超出定义的超时时间。如果同时有多个任务等待同一个消息,μC/OS-默认最高优先级的任务取得消息。一个由STaskSuspend()函数挂起的任务也可以接受消息,但这个任务将一直保持挂起状态直到通过调用 OSTaskResume()函数恢复任务的运行。 函数原型:Void *OSQPend( OS_EVENT *pevent, INT16U timeout, INT8U *err); 参数:pevent 是指向消息队列的指针,该指针的值在建立该队列时可以得到。(参考OSMboxCreate()函数)。 Timeout 允许一个任务以指定数目的时钟节拍等待消息。超时后如果还没有得到消息则恢复成就绪状态。如果该值设置成零则表示任务将持续地等待消息,最大的等待时间为65535 个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差。 Err 是指向包含错误码的变量的指针。OSQPend()函数返回的错误码可能为下述几种: OS_NO_ERR :消息被正确地接受。 OS_TIMEOUT :消息没有在指定的时钟周期数内接收到消息。 OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断中调用该函数,但μC/OS-仍然包含了检测这种情况的功能。 OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。 返回值: OSQPend()函数返回取得的消息并将*err 置为 OS_NO_ERR。如果没有在指定数目的时钟节拍内接受到消息,OSQPend()函数返回空指针并将*err 设置为 OS_TIMEOUT。 3. OSQPostFront() 该函数用于向消息队列发送消息。OSQPostFront()函数和 OSQPost()函数非常相似,不同之处在于 OSQPostFront()函数将发送的消息插到消息队列的最前端。也就是说,OSQPostFront()函数使得消息队列按照后入先出(LIFO)的方式工作,而不是先入先

文档评论(0)

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

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

1亿VIP精品文档

相关文档