打印

ucos邮箱问题请教

[复制链接]
2495|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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:

uint8 key;
void EINT2_IRQHandler (void)
{
    ...
   get key;
   OSMboxPost(InMsg,&key);
   ...
}

void TIMER0_IRQHandler (void)
{
   ...
   ReadInput();
   ...
}

uint16 input;
ReadInput()

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

情况2:

uint8 key;
void ReadKey (void)
{
    ...
   get key;
   OSMboxPost(InMsg,&key);
   ...
}

void TIMER0_IRQHandler (void)
{
   ...
   ReadInput();
   ReadKey();
   ...
}

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

不知道有没描述清楚
有知道的帮帮忙
谢谢

相关帖子

沙发
sytu_chyq|  楼主 | 2011-4-14 12:33 | 只看该作者
当定义成局部变量时
[

ReadInput()
{
   uint16 input;
   ...
   get input;
   OSMboxPost(InMsg,&input);
   ...
}
pMsg = OSMboxPend(InMsg,OS_TICKS_PER_SEC * 2,&err);就没收到消息

使用特权

评论回复
板凳
ayb_ice| | 2011-4-14 13:24 | 只看该作者
这就是变量作用域的问题
发消息一般通过动态内存分配来做好些,
要发送时分配内存,接收方处理后释放内存
你的局部变量发送方函数结束时,变量也被释放了,其实能收到,只不过此时可能已经是其它变量了

使用特权

评论回复
地板
sytu_chyq|  楼主 | 2011-4-14 13:48 | 只看该作者
那情况2两种函数结构一摸一样的
为啥一个可以一个不可以呢

使用特权

评论回复
5
johnwjl| | 2011-4-14 14:03 | 只看该作者
两个不同的消息,通过同一个邮箱InMsg来传输,LZ是怎样识别处理的?
把整个程序代码贴出来才可以进一步看看。

使用特权

评论回复
6
sytu_chyq|  楼主 | 2011-4-14 14:17 | 只看该作者
识别肯定是有办法的啦,程序就是上面的情况了
其中每个函数都在不同的文件中
pMsg = OSMboxPend(InMsg,OS_TICKS_PER_SEC * 2,&err);又在另一个文件中
5# johnwjl

使用特权

评论回复
7
johnwjl| | 2011-4-14 14:30 | 只看该作者
可以用不同邮箱来传输试试,可能会解决情况2的问题。

使用特权

评论回复
8
sytu_chyq|  楼主 | 2011-4-14 15:21 | 只看该作者
两个消息用同一个变量后就可以了。。
为啥。。
一个用uint16 input;
另一个extern uint16 input;

使用特权

评论回复
9
johnwjl| | 2011-4-14 15:32 | 只看该作者
你要注意到: 你的key类型为uint8,input类型为uint16。
pMsg = OSMboxPend(InMsg,OS_TICKS_PER_SEC * 2,&err);

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

所以,按我5楼所说,如果LZ想让大家帮你解决问题,请把整个程序代码贴出来,应该不会涉及到国家机密吧?

使用特权

评论回复
10
sytu_chyq|  楼主 | 2011-4-14 15:40 | 只看该作者
说笑了
俺的程序乱七八糟
又有点长
上面的过程应该很清楚了吧

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

用同一变量后就没问题了
其实之前就有发现这个问题 9# johnwjl

使用特权

评论回复
11
johnwjl| | 2011-4-14 15:47 | 只看该作者
就好像你拿一根羽毛,问别人:这是什么鸟?
没几个人能猜出。

使用特权

评论回复
12
hgjinwei| | 2011-4-14 18:47 | 只看该作者
胡说的,仅供参考:

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

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

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

void Task1(void *arg)
{
        uint8  err;
        uint8  mail = 0;

        while(1){
                  OSMboxPost(InMsg1,&mail);
                  OSMboxPend(InMsg2,0,&err);
        }
}
void Task2(void *arg)
{
        uint8  err;
        uint8  mail = 0;

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

void PostMail1(void)
{
         uint8  mail = 0;

         OSMboxPost(InMsg1,&mail);
}

void Task1(void *arg)
{
        uint8  err;

        while(1){
                  PostMail1();
                  OSMboxPend(InMsg2,0,&err);
        }
}
void PostMail2(void)
{
         uint8  mail = 0;

         OSMboxPost(InMsg2,&mail);
}
void Task2(void *arg)
{
        uint8  err;

        while(1){
                  PostMail2();
                  OSMboxPend(InMsg1,0,&err);
        }
}

使用特权

评论回复
13
dong_abc| | 2011-4-14 23:28 | 只看该作者
本帖最后由 dong_abc 于 2011-4-14 23:29 编辑

我也有个问题,一直不知道为什么?
https://bbs.21ic.com/viewthread.php?tid=228971&highlight=

使用特权

评论回复
14
a305566| | 2011-4-15 08:05 | 只看该作者
关注

使用特权

评论回复
15
sytu_chyq|  楼主 | 2011-4-15 12:38 | 只看该作者
很有道理
谢谢 有点明白了
但偶的程序没有两个同时发邮件的情况啊
情况2和局部变量时确实没响应
12# hgjinwei

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

223

帖子

0

粉丝