Ucosiii中的消息队列(message queue)与任务消息队列(task’s message queue)

2015-08-03 20:32 阅读 613 次 评论 0 条

消息队列可以包含若干个消息(包含消息的个数在消息队列定义时确定),一个消息队列可以和若干任务(task)相关联(在任务中通过OSQPend(),等待消息队列,则相关联)。一个ucos系统中可以包含多个消息队列。

对于一个确定的消息队列AppQ(假设定义为AppQ),与AppQ相关联的所有任务共享(可见)这个队列AppQ。在OSQPend()函数等待条件下,所有与此消息队列相关的任务都在等待消息,而消息产生后最终由哪个任务执行(comsume)是由相关联任务的优先级决定的。高优先级的任务取得消息并执行,低优先级任务得不到消息(消息执行后,将从消息队列中删除)不能执行。

==========================================

任务消息队列(task’s message queue)

任务消息队列,只针对一个任务,也就是这个消息产生后只被指定的任务接收消息并执行。这个队列同样可以包含若干个消息。

任务消息队列的使用需要在os_cfg.h中,定义OS_CFG_TASK_Q_EN为DEF_ENABLED。

这一点有点像mailbox(邮箱),只是通常的mailbox只能容纳一个消息,而任务消息队列可以容纳多个消息。是不是基于这一点在ucosiii中不再支持mailbox功能。

通用的消息与任务中的消息均只是传递消息的地址与长度,而不是拷贝数据后,将数据发送到另一个任务(这么花费时间,也占用空间),所以在传递消息时,需要自己分配一个存储空间存放消息,在消息被处理之后,然后释放空间。

当然如果消息比较短小,如一个int型,那么也可以猥琐的将这个值强制类型转换为地址,然后作为消息发送给接收任务。ucos的示例程序中也有这么做的。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:Ucosiii中的消息队列(message queue)与任务消息队列(task’s message queue) | 起点博客
分类:应用笔记 标签:

发表评论


表情