Что означает «Доходность» в Contiki rtos

Я работаю с contiki и пытаюсь понять используемую в ней терминологию. Я наблюдаю определенные слова, такие как доходность, бесстековый то здесь, то там в Интернете. Некоторые примеры

PROCESS_EVENT_CONTINUE : This event is sent by the kernel to a process that is waiting in a PROCESS_YIELD() statement.
PROCESS_YIELD(); // Wait for any event, equivalent to PROCESS_WAIT_EVENT().
PROCESS_WAIT_UNTIL(); // Wait for a given condition; may not yield the process.

Означает ли получение процесса выполнение процесса в contiki. Также что означает, что contiki не имеет стека.


person Mlo Bootloader    schedule 05.01.2016    source источник
comment
Кстати: Contiki — это не RTOS   -  person Morty    schedule 05.01.2016
comment
Что сказал @morty; в то время как ОС для встроенных целей с ограниченными ресурсами, с некоторыми впечатляющими функциями, одна из них не работает в реальном времени.   -  person Clifford    schedule 09.01.2016


Ответы (2)


Contiki использует так называемые протопотоки (термин Contiki) для поддержки нескольких процессов уровня приложений в этой ОС. Protothread — это просто причудливое название программной абстракции, известной как сопрограмма в информатике.

«Доходность» в этом контексте является сокращением от «выполнения доходности» (т. Е. Отказ от исполнения). Это означает «разрешить выполнение других протопотоков, пока не появится событие, адресованное текущему протопотоку». Такие события могут генерироваться как другими протопотоками, так и функциями обработчика прерываний. Макросы ожидания аналогичны, но позволяют уступать и ждать конкретных событий или условий.

Протопотоки Contiki не имеют стека в том смысле, что все они совместно используют один и тот же глобальный стек выполнения, в отличие от «настоящих» потоков, которые обычно получают собственное пространство стека. Как следствие, значения локальных переменных не сохраняются в протопотоках Contiki при выходе. Например, это поведение undefined:

 int i = 1;
 PROCESS_YIELD();
 printf("i=%d\n", i); // <- prints garbage

Традиционный способ Contiki справиться с этим ограничением — объявить все локальные переменные protothread как статические:

 static int i = 1;
 PROCESS_YIELD();
 printf("i=%d\n", i);

Другие варианты, конечно, использовать глобальные переменные, но наличие большого количества глобальных переменных является плохим стилем программирования. Преимущество статических переменных, объявленных внутри функций протопотока, заключается в том, что они скрыты от других функций (включая другие протопотоки), хотя на низком уровне они размещены в области глобальной статической памяти.

person kfx    schedule 05.01.2016
comment
очень полезно. таким образом, протопоток может выдать или ожидать события в то время, пока он ожидает, другой протопоток может выполнить и сгенерировать событие. теперь первый процесс проверит событие и запустит процедуру обработки события. затем, после завершения процедуры обработки событий, процесс 1 снова будет ждать или уступит, и управление вернется к процессу 2. - person Mlo Bootloader; 05.01.2016
comment
ждет и дает то же самое? Также, если есть общий стек, все переменные процесса будут видны другим процессам? - person Mlo Bootloader; 05.01.2016

В общем случае "Выход" в любой ОС означает синхронный вызов планировщика (т.е. по запросу, а не через прерывание), чтобы дать возможность управления какая-то другая ветка. В RTOS такая функция влияет только на потоки с одинаковым приоритетом и может использоваться в дополнение или вместо упреждающего циклического планирования. Большинство RTOS не имеют явной функции yield, а в некоторых случаях (например, VxWorks) того же эффекта можно добиться, используя задержку нулевой длины.

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

Кооперативный характер планировщика Contiki означает, что его нельзя классифицировать как RTOS. Можно добиться поведения в реальном времени, подходящего для конкретного приложения, но только за счет тщательного и соответствующего проектирования приложения, а не за счет внутреннего поведения планировщика.

person Clifford    schedule 09.01.2016