返回该小组首页 回复主题
awei4755

awei4755

小组等级:     E币:79  (E币换礼)

#1楼主:消息邮箱为什么收不到?

文章发表于:2008-08-01 05:26

我是个菜鸟,学习调试消息邮箱的时候有个问题不知道错在哪里了:

int *s;
int *t;
int err;
while(1){
        *s = 1;
        OSMboxPost(press_box,s);
        OSTimeDlyHMSM(0,0,0,1);
        *t = 3;
        t = OSMboxPend(press_box,0,&err);
        if(*t == 1) LED_On(1);
       else LED_On(3);
       OSTimeDlyHMSM(0,0,1,0);
       LED_Off(0);
       OSTimeDlyHMSM(0,0,1,0);
}

我的原意是,如果收到消息邮箱第1个LED闪,收不到则第3个LED闪。现在总是收不到,第3个LED在闪。问题出在哪了?
哪位帮帮看看~~~

huanan_

   小组等级:    E币:1510  (E币换礼)

#2

文章发表于:2008-08-07 10:53

收发消息信箱的函数放在一个任务里,是错误的,

awei4755

   小组等级:    E币:79  (E币换礼)

#3

文章发表于:2008-08-11 10:38

谢谢huanan

如果你的意思是说不能在任务里面调用收或者发消息邮箱,那就奇怪了,该哪里调用?书上的都是在任务里面调用啊

如果你的意思是不能在同一个任务里面同时收和发同一个消息邮箱,那好像也不对,我用下面的代码试过,也还是收不到的。如果收到LED3会闪,但实际上是不闪的。

OS_EVENT *myMbox;

main(){

......

 myMbox = OSMboxCreate((void*)0);

.......

}

static void Task1(void){
    static int j = 0;
    while(1){

         j = 7;
         OSMboxPost(myMbox,(void *)&j);
         OSTimeDlyHMSM(0,0,2,0);
 
    }
}

static void Task2(void){
    static int i = 0;
    while(1){

         OSTimeDlyHMSM(0,0,0,500);
          i = 1;
         i = (int *)OSMboxAccept(myMbox);
         if(i == 7) LED_Toggle(3);

    }
}

 

为什么啊?谁能帮帮我啊

lhj200304

   小组等级:    E币:721  (E币换礼)

#4

文章发表于:2008-08-14 09:27

你把等待时间都延长一下,试试看

awei4755

   小组等级:    E币:79  (E币换礼)

#5

文章发表于:2008-08-18 14:31

2秒发一次,500毫秒收一次,应该很长了吧。再慢的话,我的项目也要求比这个快啊。

lhj200304

   小组等级:    E币:721  (E币换礼)

#6

文章发表于:2008-08-20 09:24

建议你去看一本书吧。周航慈的那本有关ucos的,很实用的

djjyi

   小组等级:    E币:422  (E币换礼)

#7

文章发表于:2008-08-27 14:47

 邮箱收发可以在任务级的函数里使用,但是你在同一个任务里同时使用的话就没意义了,

任务2里为什么程序一开始就延时呢?一延时系统就切换到任务1了

warrenzb

   小组等级:    E币:186  (E币换礼)

#8

文章发表于:2008-08-28 01:23

我也这正被此问题困扰啊,那位高人来帮帮忙吧

warrenzb

   小组等级:    E币:186  (E币换礼)

#9

文章发表于:2008-08-28 20:24

你看一下有没有被其它任务强占邮箱了

wangxing

   小组等级:    E币:4271  (E币换礼)

#10

文章发表于:2008-08-28 20:47

收发消息信箱的函数放在一个任务里,是错误的

gcjlx

   小组等级:    E币:162  (E币换礼)

#11

文章发表于:2008-09-14 09:36

问题出在 t = OSMboxPend(press_box,0,&err),OSMboxPend()函数声明原型为:

void OSMutexPend(OS_WEVENT *pevent,INT16U timeout,INT8U *err)

是不会返回数据的,你只需将程序改为:

        OSMboxPend(press_box,0,&err);
        if(*err == OS_NO_ERR)  LED_On(1);
       else  LED_On(3);

就可以了。 

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章