关于ucos下邮箱使用的两个经验.pdfVIP

  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文档。上传文档
查看更多
关于 UCOS 下邮箱使用的两个经验 在使用 UCOS 的邮箱时,遇到一些问题,现将一些小总结写下,希望对大家有所 帮助。 邮箱使用总 1.数据的存放。 邮箱一般用来传递数据,不管何种类型都可以传递。在传递时,先把数据数据用 void *进行类型变化,化为 void *这种万用类型,而在接收邮箱的数据时,再还 原成本身的数据类型。比如以下的两个例子: 一是传递指向一个数组的指针。发端采用如下方式: OSMboxPost(ComSendMbox, (void *)ComBufRec); 其中的 ComBufRec 就是数组名,也表示指向该数组的指针,将原来的字符型数组 名(或指针)变成(void *)类型,而接收端,利用 send_ptr = (uint8 *)OSMboxPend(ComSendMbox, 0, err); 将 (void *)类型还原为指针。 二是传递一个字符型变量。发端采用如下方式: OSMboxPost(KeyMbox, (void *)key_value); 其中的 key_value 就是字符型变量,将原来的字符型变量变成 (void *)类型,而 接收端,利用 key = (INT8U)OSMboxPend(KeyMbox, 0, err); 将 (void *)类型还原为字符型变量。 2、关于在邮箱中不能存放传递 0 值的问题 在邮箱的传递中,如果把一个0值放入邮箱,经过void *类型变化后,变成了void *0,而判断邮箱中是否有数据正是通过判断邮箱中指向Message 的指针是否为 0 来判断,这样虽然放入了一个 0 变量,但邮箱中却无法判断这个 0 值,认为邮箱 中还是空。 ucos 觉得使用它还是需要很多技巧性的,也就是说 ucos 需要技巧性的操作, 今天我就我对邮箱这一块的看法说说。下面我用一个例子说一下 首先例子的功能就是创建一个邮箱 myMbox 利用它所存取的 msg 不同而进行 相应的任务调度。程序片段如下 OS_EVENT *myMbox; Static INT8U TaskAMsg,TaskBMsg; myMbox = OSMboxCreate ((void *)TaskAMsg) void TaskA(void *i) { for (;;) { if(OSMboxPend(myMbox,0,myErr)== (void *) TaskAMsg) { Uart_Printf(TaskA\n); OSTimeDly(100); (1) OSMboxPost(myMbox,(void *) TaskBMsg); OSTimeDly(100); (2) } } } void TaskB(void *i) { for (;;) { if(OSMboxPend(myMbox,0,myErr) == (void *) TaskBMsg) { Uart_Printf(TaskB\n); OSTimeDly(100); (1) OSMboxPost(myMbox,(void *) TaskAMsg); OSTimeDly(100); (2) } } OSTaskCreate(TaskA, (void *)0, (void *)Task_Stk5[STK_size_S - 1], 6); OSTaskCreate(TaskB, (void *)0, (void *)Task_Stk6[STK_size_S - 1], 7); 大概的程序片度如上,这里我特地把 OSTimeDly 分成两种情况放置,但程序 运行的结果是一样的,个人认为放置在位置(2)上容易理解,下面我们要讨论 的是放在位置一上是个怎么回事。 从程序中我们可以大概看出,首先创建了一个邮箱 myMbox 初始化它的消息 内容为TaskAMsg (想想这里可以初始化为TaskBMsg 吗?)好了从任务A 开始看 起。首先程序运行当然是先执行 TaskA 了,因为它的优先级是最高的是吧。那么 由于邮箱有初始化也就是msg != (void*)0;的情况,这个时候OSMboxPend 就直接返回了 Msg,它是一个地址。在 if 语句中判断是不是 TaskA 要等的消息, 如果是就执行

文档评论(0)

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

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

1亿VIP精品文档

相关文档