打印

ucos

[复制链接]
1805|6
手机看帖
扫描二维码
随时随地手机跟帖
沙发
踢球老越位|  楼主 | 2009-4-20 09:11 | 只看该作者

ucos遇到的邮箱问题

void task1(void)
{
  INT32U *mbox_contents;
  while (1)
  {
    mbox_contents = (INT32U *)OSMboxPend(mailbox, 100, &return_code);
    OSTimeDly(50);
    LED1=~LED1;
   }
}

void task2(void)
{
  INT32U *mbox_contents;
  while (1)
  {
    OSTimeDly(100);
    LED2=~LED2;
   }
}
如果task1的mbox_contents = (INT32U *)OSMboxPend(mailbox, 100, &return_code)去掉则整个程序运行正常,
LED1,LED2分别以不同的频率闪烁。但是task1加上mbox_contents = (INT32U *)OSMboxPend(mailbox, 100, &return_code)后,整个程序挂掉跑飞了。现在有个疑问:在uCos-II里,OSMboxPend()函数运行时会检测邮箱,一旦发现邮箱无邮件或者超时,任务就会挂起,执行优先级更高的任务。task1挂起后,应该切换到task2.怎么会让程序崩溃呢?初学ucos,不大明白,望大家指点一下,谢谢。

使用特权

评论回复
板凳
Ice_River| | 2009-4-20 10:21 | 只看该作者

UCOS2 的电子书里面有很简单的参考代码!

邮箱 队列 信号量都有!你先看看然后照着做做 就明白了!

使用特权

评论回复
地板
踢球老越位|  楼主 | 2009-4-20 10:49 | 只看该作者

源代码看了

虽然这个例子没什么意义,实际上也很少这么用的。但是,按照OSMboxPend()源代码来理解,task2无论加不加OSMboxPend()这个函数,程序应该正常执行的。OSMboxPend()收不到邮件,顶多就挂起咯。这是我困惑的地方

使用特权

评论回复
5
冷漠| | 2009-4-20 17:54 | 只看该作者

我这个OS邮箱是这样,...

taks1向一个固定number邮箱每发送一封信,大概要释放CPU给其他任务运行。
这个没什么讨论。
关键是如果没人收信,邮箱就会满。它不可能容纳无限封邮件,——我这个OS是:在没有收件人taks2的情况下,允许发送8封message。如果你发送第9封,就会无限循环——等待收件人接收以便空出邮箱容纳第9封信。(循环死机?)。

避免这类情况的出现应该用无等待发送参数。那样第9封信就可能丢掉了。
这和生活中的情景是一样的。

使用特权

评论回复
6
踢球老越位|  楼主 | 2009-4-20 21:46 | 只看该作者

谢谢冷漠

我找到问题所在了,程序在另一个地方出现致命的bug,导致pc值乱飞。

使用特权

评论回复
7
焊锡丝| | 2009-4-21 12:43 | 只看该作者

如果UCOS不是自己移植的,经常出现致命BUG

饿是身有体会啊。

使用特权

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

本版积分规则

40

主题

581

帖子

0

粉丝