我将两个不同的事件发布到名为发送的流程中。第一个事件是 PROCESS_EVENT_CONTINUE ,第二个事件是 PROCESS_EVENT_MSG 。我正在从名为 main 的流程中按顺序(即一个接一个)发布这些事件。完整的代码是:
#include "contiki.h"
#include "lib/list.h"
#include "lib/memb.h"
#include "lib/random.h"
#include "net/rime/rime.h"
#include<stdio.h>
PROCESS(master, "master_DGHS");
PROCESS(send, "master_DGHS");
AUTOSTART_PROCESSES( &master, &send);
PROCESS_THREAD(master, ev, data)
{
PROCESS_BEGIN();
process_post(&send, PROCESS_EVENT_CONTINUE, NULL);
process_post(&send, PROCESS_EVENT_MSG, NULL);
PROCESS_END();
}
PROCESS_THREAD(send, ev, data)
{
static struct etimer et;
PROCESS_BEGIN();
while(1)
{
PROCESS_WAIT_EVENT();
if(ev == PROCESS_EVENT_CONTINUE)
{
printf("PROCESS_EVENT_CONTINUE\n");
etimer_set(&et, CLOCK_SECOND );
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
}else
if(ev == PROCESS_EVENT_MSG)
{
printf("PROCESS_EVENT_MSG\n");
etimer_set(&et, CLOCK_SECOND );
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
}
}
PROCESS_END();
}
问题是进程发送会看到第一个事件(即它打印PROCESS_EVENT_CONTINUE),但它永远不会看到第二个事件(即它不会打印PROCESS_EVENT_MSG)。换句话说,第二个事件会丢失。如果我删除该行
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
然后,进程发送会看到两个事件(它打印PROCESS_EVENT_CONTINUE和PROCESS_EVENT_MSG)。因此,添加此行会导致第二个事件(即PROCESS_EVENT_MSG)丢失。为什么添加这一行会导致第二个事件丢失?
提前谢谢。
答案 0 :(得分:1)
问题是PROCESS_WAIT_EVENT_UNTIL
consumes all events直到循环条件变为真。
这是您示例中的一系列操作:
send
进程获得PROCESS_EVENT_CONTINUE
个事件。printf
,设置计时器,然后输入PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
send
进程会立即获得PROCESS_EVENT_MSG
个事件。WAIT_EVENT_UNTIL
循环中并丢弃第二个事件,因为计时器尚未过期。send
进程获得PROCESS_EVENT_TIMER
事件。因此,进程收到第二个事件,但没有采取行动,因为进程正在等待另一个事件。希望现在您了解为什么删除WAIT_EVENT_UNTIL
宏可以解决此问题。