如何将两个不同的事件发布到同一个进程?半自助旅游旅行社

时间:2018-03-12 21:37:06

标签: contiki

我将两个不同的事件发布到名为发送的流程中。第一个事件是 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)丢失。为什么添加这一行会导致第二个事件丢失?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

问题是PROCESS_WAIT_EVENT_UNTIL consumes all events直到循环条件变为真。

这是您示例中的一系列操作:

  1. send进程获得PROCESS_EVENT_CONTINUE个事件。
  2. 该流程执行第一个printf,设置计时器,然后输入PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
  3. send进程会立即获得PROCESS_EVENT_MSG个事件。
  4. 进程仍在WAIT_EVENT_UNTIL循环中并丢弃第二个事件,因为计时器尚未过期。
  5. 计时器到期,send进程获得PROCESS_EVENT_TIMER事件。
  6. 进程退出等待循环。
  7. 因此,进程收到第二个事件,但没有采取行动,因为进程正在等待另一个事件。希望现在您了解为什么删除WAIT_EVENT_UNTIL宏可以解决此问题。