ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1440079 Топик полностью
Cкpипaч, пророк (01.06.2024 18:04, просмотров: 172) ответил vesago на Спасибо, неплохая мысль. В свое время я полюбил конечные автоматы. И преимущественно на них все строю. Задержек не допускаю. Но так хочется жизнь упростить :) Вот помню была ртос оса. Вот такое бы. Мне всего то надо. Шедулер и чтоб когда задержка, другой процесс работал. Надо почитать. У фриртоса вроде есть не вытесняющий режим. Протопотоки знаю ещё по макоси, пардон, по микроайпи. Но каюсь - не въехал как они работают. Мудрено написано.
Ну да, неблокирующие задержки это именно то, что в protothreads делается почти без обвеса. Но требует дисциплины программирования, поскольку не будут работать локальные переменные, их придется заменять статическими. Или взять вариант на С++ и там можно заменять локальные переменные переменными экземпляра объекта. 

Но я обычно не делаю "чистый sleep", а делаю "миницикл ожидания нескольких событий".


char Splash(uint8_t in, char out){
static uint8_t T[8];
static struct pt proc[8];

struct pt *pt = proc+in;
PT_BEGIN(pt);

PT_WAIT_WHILE(cmd_on & _BV(in));
_On(out);
Timer_RST(T+in);
while(1){ PT_YIELD(pt); if(cmd_on & IOPort & _BV(in)){ fault &= ~_BV(in); break; }; if(cmd_off & ~IOPort & _BV(in)){ fault &= ~_BV(in); break; }; if(Timer_SECS(T[in]) > 5){ fault |= _BV(in); break; };
}; _Off(out);

PT_END(pt); };
... но не любой ценой.