ucos邮箱问题请教

[复制链接]
 楼主| sytu_chyq 发表于 2011-4-14 12:26 | 显示全部楼层 |阅读模式
pMsg = OSMboxPend(InMsg,OS_TICKS_PER_SEC * 2,&err);

以下俩个在不同的文件中
uint8 key;
OSMboxPost(InMsg,&key);

uint16 input;
OSMboxPost(InMsg,&input);

问:
1、为啥key或input定义成局部变量不行而定义成全局变量可以
2、另外一个问题

情况1:

  1. uint8 key;
  2. void EINT2_IRQHandler (void)
  3. {
  4.     ...
  5.    get key;
  6.    OSMboxPost(InMsg,&key);
  7.    ...
  8. }

  9. void TIMER0_IRQHandler (void)
  10. {
  11.    ...
  12.    ReadInput();
  13.    ...
  14. }

  15. uint16 input;
  16. ReadInput()

  17. {
  18.    ...
  19.    get input;
  20.    OSMboxPost(InMsg,&input);
  21.    ...
  22. }
以上函数在不同文件中,这样运行正常

情况2:

  1. uint8 key;
  2. void ReadKey (void)
  3. {
  4.     ...
  5.    get key;
  6.    OSMboxPost(InMsg,&key);
  7.    ...
  8. }

  9. void TIMER0_IRQHandler (void)
  10. {
  11.    ...
  12.    ReadInput();
  13.    ReadKey();
  14.    ...
  15. }

  16. uint16 input;
  17. ReadInput()
  18. {
  19.    ...
  20.    get input;
  21.    OSMboxPost(InMsg,&input);
  22.    ...
  23. }
以上函数在不同文件中,这样的话,ReadInput()没问题,ReadKey()不对
就是OSMboxPost(InMsg,&key);时key是正确的,pMsg = OSMboxPend(InMsg,OS_TICKS_PER_SEC * 2,&err);获得的值不对

不知道有没描述清楚
有知道的帮帮忙
谢谢
 楼主| sytu_chyq 发表于 2011-4-14 12:33 | 显示全部楼层
当定义成局部变量时
[

  1. ReadInput()
  2. {
  3.    uint16 input;
  4.    ...
  5.    get input;
  6.    OSMboxPost(InMsg,&input);
  7.    ...
  8. }
pMsg = OSMboxPend(InMsg,OS_TICKS_PER_SEC * 2,&err);就没收到消息
ayb_ice 发表于 2011-4-14 13:24 | 显示全部楼层
这就是变量作用域的问题
发消息一般通过动态内存分配来做好些,
要发送时分配内存,接收方处理后释放内存
你的局部变量发送方函数结束时,变量也被释放了,其实能收到,只不过此时可能已经是其它变量了
 楼主| sytu_chyq 发表于 2011-4-14 13:48 | 显示全部楼层
那情况2两种函数结构一摸一样的
为啥一个可以一个不可以呢
johnwjl 发表于 2011-4-14 14:03 | 显示全部楼层
两个不同的消息,通过同一个邮箱InMsg来传输,LZ是怎样识别处理的?
把整个程序代码贴出来才可以进一步看看。
 楼主| sytu_chyq 发表于 2011-4-14 14:17 | 显示全部楼层
识别肯定是有办法的啦,程序就是上面的情况了
其中每个函数都在不同的文件中
pMsg = OSMboxPend(InMsg,OS_TICKS_PER_SEC * 2,&err);又在另一个文件中
5# johnwjl
johnwjl 发表于 2011-4-14 14:30 | 显示全部楼层
可以用不同邮箱来传输试试,可能会解决情况2的问题。
 楼主| sytu_chyq 发表于 2011-4-14 15:21 | 显示全部楼层
两个消息用同一个变量后就可以了。。
为啥。。
一个用uint16 input;
另一个extern uint16 input;
johnwjl 发表于 2011-4-14 15:32 | 显示全部楼层
你要注意到: 你的key类型为uint8,input类型为uint16。
pMsg = OSMboxPend(InMsg,OS_TICKS_PER_SEC * 2,&err);

你的pMsg是什么类型?
我估计是uint16 *。
如果是,在接收key消息时就有问题啦。 本来想传送的是字节数据,接收到的却是字数据。

所以,按我5楼所说,如果LZ想让大家帮你解决问题,请把整个程序代码贴出来,应该不会涉及到国家机密吧?
 楼主| sytu_chyq 发表于 2011-4-14 15:40 | 显示全部楼层
说笑了
俺的程序乱七八糟
又有点长
上面的过程应该很清楚了吧

pMsg确实是uint16*
但如果把key定义成uint16也是有问题的
况且情况1并没问题
情况2之前收到的是FFFF
后来又是没收到消息

用同一变量后就没问题了
其实之前就有发现这个问题 9# johnwjl
johnwjl 发表于 2011-4-14 15:47 | 显示全部楼层
就好像你拿一根羽毛,问别人:这是什么鸟?
没几个人能猜出。
hgjinwei 发表于 2011-4-14 18:47 | 显示全部楼层
胡说的,仅供参考:

情况1:情况1只能说或许正常,当两个中断(函数名为XXX_Handler,姑且当成中断。如果不是,那就算了)紧挨着,也就是说当一个中断向 InMsg 发送了邮件后,还没有任务提取邮件前,另一个中断发生,则后一个邮件将被丢弃;

情况2:参考情况1,不用多说了,情况2就是情况1的极端情况,OSMboxPost(InMsg,&input); 将被无情地抛弃了;

局部变量:按理说是可以收到邮件的,只是不一定正确罢了,不知楼主为何说收不到。如果是在中断例程的局部变量,那么接收到正确邮件只是偶然,错误才是应该的。在中断例程退出之前,不会发生调度。中断例程退出后,局部变量失效,相应的内存将被其他程序使用,因此数值上将发生变化。于是邮件接收方就将接收到错误的邮件了。
而在普通任务中,只要接收方在这个局部变量失效前能收到邮件,就不会出问题。
比如:

  1. void Task1(void *arg)
  2. {
  3.         uint8  err;
  4.         uint8  mail = 0;

  5.         while(1){
  6.                   OSMboxPost(InMsg1,&mail);
  7.                   OSMboxPend(InMsg2,0,&err);
  8.         }
  9. }
  10. void Task2(void *arg)
  11. {
  12.         uint8  err;
  13.         uint8  mail = 0;

  14.         while(1){
  15.                   OSMboxPost(InMsg2,&mail);
  16.                   OSMboxPend(InMsg1,0,&err);
  17.         }
  18. }
而这样,就不好说了:

  1. void PostMail1(void)
  2. {
  3.          uint8  mail = 0;

  4.          OSMboxPost(InMsg1,&mail);
  5. }

  6. void Task1(void *arg)
  7. {
  8.         uint8  err;

  9.         while(1){
  10.                   PostMail1();
  11.                   OSMboxPend(InMsg2,0,&err);
  12.         }
  13. }
  14. void PostMail2(void)
  15. {
  16.          uint8  mail = 0;

  17.          OSMboxPost(InMsg2,&mail);
  18. }
  19. void Task2(void *arg)
  20. {
  21.         uint8  err;

  22.         while(1){
  23.                   PostMail2();
  24.                   OSMboxPend(InMsg1,0,&err);
  25.         }
  26. }
dong_abc 发表于 2011-4-14 23:28 | 显示全部楼层
本帖最后由 dong_abc 于 2011-4-14 23:29 编辑

我也有个问题,一直不知道为什么?
https://bbs.21ic.com/viewthread.php?tid=228971&highlight=
a305566 发表于 2011-4-15 08:05 | 显示全部楼层
关注
 楼主| sytu_chyq 发表于 2011-4-15 12:38 | 显示全部楼层
很有道理
谢谢 有点明白了
但偶的程序没有两个同时发邮件的情况啊
情况2和局部变量时确实没响应
12# hgjinwei
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

223

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部