Как запускать параллельные процессы в Contiki

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

PROCESS(hello_world_process, "Hello world process");
PROCESS(hello_world_process2, "Hello world process2");
AUTOSTART_PROCESSES(&hello_world_process,&hello_world_process2);
/*---------------------------------------------------------------------------*/
int i;
void program1(void)
{
    for (i=0;i<10;i++)
    {
        printf("%d from 1st process\n",i);  
    }
}

void program2(void)
{
    for (i=0;i<10;i++)
    {
        printf("%d from IIund process\n",i);    
    }
}


PROCESS_THREAD(hello_world_process, ev, data)
{
    PROCESS_BEGIN();
    program1();
    PROCESS_END();
}
PROCESS_THREAD(hello_world_process2, ev, data)
{
    PROCESS_BEGIN();
    program2();
    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
0 from 1st process
1 from 1st process
2 from 1st process
3 from 1st process
4 from 1st process
5 from 1st process
6 from 1st process
7 from 1st process
8 from 1st process
9 from 1st process
0 from IIund process
1 from IIund process
2 from IIund process
3 from IIund process
4 from IIund process
5 from IIund process
6 from IIund process
7 from IIund process
8 from IIund process
9 from IIund process

Как я могу выполнять оба этих процесса параллельно?

1 ответ

Решение

Процессы Contiki основаны на протопотоках Dunkel: http://dunkels.com/adam/pt/

Таким образом, у них есть некоторые особенности:

  1. Они представляют собой форму совместной многопоточности. Это означает, что исходный код должен явно указывать, в какой момент дать выполнение; это не вытесняющая многопоточность, когда переключение между потоками происходит автоматически.
  2. Они реализованы на C, языке, который не имеет хорошей поддержки для этого из коробки, поэтому все операции с протопотоком ограничены функцией основного процесса. Функции, которые вызываются из функции основного процесса, не могут уступить, только функция main.
  3. У процессов общий стек. Понятия переменной, локальной для потока (локальной для процесса), не существует;static Вместо этого необходимо использовать переменные для сохранения значений при нескольких вызовах одного процесса.

В вашем коде есть все эти проблемы:

  • В коде нет явных выходов
  • Вы ожидаете, что (неявная) доходность будет происходить из подфункции
  • Переменная i на самом деле является глобальным, поэтому он будет использоваться несколькими процессами - возможно, это не то, что вам нужно.

Вместо этого попробуйте этот код:

PROCESS_THREAD(hello_world_process, ev, data)
{
    static int i;
    PROCESS_BEGIN();
    for (i=0;i<10;i++)
    {
        printf("%d from 1st process\n",i);  
        process_poll(&hello_world_process2);
        PROCESS_YIELD();
    }
    PROCESS_END();
}

PROCESS_THREAD(hello_world_process2, ev, data)
{
    static int i;
    PROCESS_BEGIN();
    for (i=0;i<10;i++)
    {
        printf("%d from IIund process\n",i);
        process_poll(&hello_world_process);
        PROCESS_YIELD();
    }
    PROCESS_END();
}
Другие вопросы по тегам