网站大量收购独家精品文档,联系QQ:2885784924

S.D.LuuCOS II 入门学习笔记(4):消息邮箱.doc

S.D.LuuCOS II 入门学习笔记(4):消息邮箱.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
S.D.Lu的uC/OS II 入门学习笔记(4):消息邮箱 在多任务操作系统中,常常需要在任务与任务之间通过传递一个数据(这种数据叫做“消息”)的方式来进行通信。为了达到这个目的,可以在内存中创建一个存储空间作为该数据的缓冲区。如果把这个缓冲区叫做消息缓冲区,那么在任务之间传递数据(消息)的一个最简单的方法就是传递消息缓冲区的指针。因此,用来传递消息缓冲区指针的数据结构就叫做消息邮箱。 ——摘自任哲老师的书(第2版)第五章5.1节。 本篇实验在上一篇的基础上进行,仍然是运行两个任务,每个任务控制一个LED的亮灭。但是这两个任务使用了消息邮箱进行通信。任务Task_LED2通过消息邮箱发送消息,Task_LED根据接收到的消息内容选择执行不同的代码。 例4-1 将app.c中的内容改为如下:(红框标识了消息邮箱的相关操作) 编译下载,运行后LED2以固定的频率闪烁。LED2闪烁10次后,LED1闪一下,点亮时间很短;LED2继续闪烁10次后,LED1再闪一下,点亮时间比第一次稍长;LED2再闪烁10次后,LED1再闪一下,点亮时间比前两次都长。三种点亮时间反复循环。 代码分析: 程序第5、6行定义了消息和消息邮箱,但是定义时消息邮箱为空,并没有指向消息。 简单地说,消息邮箱就是指针,就是消息存储的地址。 Task_LED的while(1)中有一个if/else语句,用于请求消息。注意,本例中else语句中的延时函数是必须的,否则当接受不到消息时Task_LED会长时间占用CPU导致程序无法切换到Task_LED2。 Task_LED2中发送消息的语句(msg_p = msg;)事实上就是将消息的地址赋给了消息邮箱。Task_LED中请求消息的操作,就是检测邮箱是否为空,如果不为空,说明有其中有消息,然后把消息读出来,并把邮箱清空以便下次传递消息。 例4-1用一个指针和一个变量演示了两个任务之间使用消息邮箱传递消息的过程。 和信号量一样,在μC/OS II中也使用事件控制块来描述一个消息邮箱,这样使用起来会更加方便。 例4-2 将app.c中的内容改为如下:(红框标识了消息邮箱的相关操作) 本例程序编译下载,执行的结果和例4-1类似,只是为了区别而将Task_LED2中的延时函数最后一个参数改成了100,运行时LED2的闪烁频率是例4-1的2倍。 在程序中,如果将消息msg定义成数组,或者其他数据结构,就可以在任务中传递多个数据了。 应该注意,因为本例用到了消息邮箱,所以在os_cfg.h配置文件中必须将OS_SEM_EN置1,如下图: OSMboxPend()函数的原型如下: 当timeout取值为0时,表示一直等待,直到接收到消息。 OSMboxPost()函数的原型如下: 深入了解消息邮箱的相关知识,请参考任哲《嵌入式实时操作系统μCOS-II原理及应用》 (第2版)第五章 5.1、5.5节关于消息邮箱的内容。 作者:S.D.Lu 深圳 2014-5-29

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档