suzhenyu2002 发表于 2011-9-19 22:35:23

程序中邮箱接收有些问题,在线请教!!!

各位老大,这两天我在调试程序的时候使用邮箱出现了一个问题,我用的是0.3.1版本。我的程序里开了两个任务:任务A和任务B。在任务A中把有些参数通过一个邮箱发送给任务B,启动任务B运行一次,任务B也会发送一个邮箱把任务B中的有些值反馈给任务A。大部分时间运行正常。可是有时会出现任务A发送邮箱后并不会切换到任务B(任务B的优先级比任务A的优先级要高);通过MDK的View窗口看到,任务A发送的邮箱的entry值为1,但是就是不切换到任务B去运行。各位老大,不知道在什么情况下要出现这样的现象啊?有没有什么好的查错方法呢?多谢啦!!!

ffxz 发表于 2011-9-21 16:40:59

这个需要看任务状态。

如果任务B并不是挂起在邮箱上接收邮件,A往邮箱发送再多邮件也没用。另外就是,要避免多个任务去一个邮箱上收取邮件,这会造成任务的行为无法预知。

suzhenyu2002 发表于 2011-9-23 08:19:46

回复【1楼】ffxz
-----------------------------------------------------------------------
    谢谢ffxz的回复!我在任务B的末尾加有rt_thread_delay()函数,让任务B休眠20个Tick,以让出CPU控制权。我在view窗口中看到,任务B的remaining_tick的值始终和init_tick的值保持一致,是不是任务B就挂起在这?那么remaining_tick为什么会一直不变呢?
    要避免多个任务去一个邮箱上收取邮件?那我要是有两三个任务等待一个邮箱,这样的话就不合适了吗?(因为我要传递的参数量不大,就直接用邮箱中的4个字节的邮件进行参数传递。然后其他的任务则根据邮件的内容来决定是否是自己想要的邮件,如果不是则传发)

ffxz 发表于 2011-9-23 09:26:15

B进行delay,这个时候B的状态是suspend状态,得等它被唤醒后才可能去收邮箱。

关于remaining_tick的问题,这个数值只会在它一直运行时才起作用。并且,如果它一次运行的时间不超过1 tick,这个值也基本上不会被修改。

如果是多个任务去接收邮箱,那么你一定能够保证任务能够处理每一个邮件。如果一个邮件不能够被处理,这个时候就两难了,丢弃吗?

suzhenyu2002 发表于 2011-9-23 17:30:02

那这么说来,多个任务等待一个邮箱是不太合适。可是有一点我又不太明白了。就是我看每个邮箱好像它都会有个挂起任务的链表(rt_list_t suspend_thread),如果避免多个任务等待一个邮箱的话,那这个链表又起到什么作用呢?这个链表不是多个因等待邮箱而挂起的任务的等待链表吗?
    还有,rt_list_nod结构体中*next和*prev分别指向下一个节点,和前一个节点,那这个节点是否就是表示各个任务?next,prev所指向的是否是各个任务的地址呢?
页: [1]
查看完整版本: 程序中邮箱接收有些问题,在线请教!!!