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