Выполнение передается второму процессу в ожидании события в contiki.

Я создал два процесса в Contiki. В первом процессе я хочу продолжать вызывать функцию через определенное время, для этого я установил таймер событий. Но при ожидании события истечения таймера управление исполнением передается второму процессу.

Код:

PROCESS(hello_world_process, "Hello world process");
PROCESS(hello_world_process2, "Hello world process2");
AUTOSTART_PROCESSES(&hello_world_process,&hello_world_process2);
#define TIMEOUT              (CLOCK_SECOND / 4)
static struct etimer timer;

void setFlag(void)
{
    int i;
    i = random_rand();
    if (i>0 && i<32767)
    {
        printf("Setting flag\n");
        flag =1;
    } 

}
PROCESS_THREAD(hello_world_process, ev, data)
{
    PROCESS_BEGIN();
    printf("1st process started\n");
    do 
    {
        etimer_set(&timer, TIMEOUT);
        PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
        setFlag();
    } while(!flag);
    printf("1st process completed\n");
    PROCESS_END();
}
PROCESS_THREAD(hello_world_process2, ev, data)
{
    printf("2nd process started\n");
    PROCESS_BEGIN();
    printf("2nd process completed\n");
    PROCESS_END();
}

Выход:

Contiki-list-1532-g2ca33d4 started with IPV6, RPL
Rime started with address 1.2.3.4.5.6.7.8
MAC nullmac RDC nullrdc NETWORK sicslowpan
Tentative link-local IPv6 address fe80:0000:0000:0000:0302:0304:0506:0708
1st process started
2nd process started
2nd process completed
Setting flag
1st process completed

Я хочу, чтобы второй процесс выполнялся только после того, как первый процесс будет выполнен полностью, т.е. в ожидании события управление не должно передаваться второму процессу.

1 ответ

Решение

Попробуй это:

AUTOSTART_PROCESSES(&hello_world_process);

// ...

PROCESS_THREAD(hello_world_process, ev, data)
{
    PROCESS_BEGIN();
    printf("1st process started\n");
    do 
    {
        etimer_set(&timer, TIMEOUT);
        PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
        setFlag();
    } while(!flag);
    printf("1st process completed\n");
    process_start(&hello_world_process2, NULL); // start the second process
    PROCESS_END();
} 

См. https://github.com/contiki-os/contiki/wiki/Processes.

Кроме того, не помещайте исполняемый код перед PROCESS_BEGIN()! Вы не получите предупреждения, но результат может быть не таким, как вы ожидаете, так как этот код будет выполняться каждый раз, когда процесс будет возобновлен.

Другие вопросы по тегам