ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
472381 Топик полностью
fk0, легенда (10.12.2013 09:56 - 09:58, просмотров: 268) ответил aoreh на не касаемо прототреадс, а ртос вообще... вот сколько раз вижу этот твой конец света без вэйтформногоевентс и просто понять не могу, что мешает использовать очередь (приоритетную, если нужно)? тем более, как ты сам отмечал, пока событие
Если б у бабушки был... А где в protothreads очередь? Нет eё. Такой подход применён в quantim leaps (теперь state-machine.com), когда события записываются в очередь, а после извлекаются и дальше... а дальше имеем ситуацию как в автомате: в конкретном состоянии проверяем переменную события и выполняем переход. За что боролись? Т.е. применительно к protothreads PT_WAIT(event) заменяется на event=PT_WAIT_ANYTHING(void) и дальше if (event) ...; else if (event)... А теперь контрольный выстрел в голову: чем это отличается от switch (state)... case state: if (event)...; if (event)... ? Ничем, кроме очереди. Собственно отсутстие очереди -- это и есть недостаток switch-технологии (про который расписывать можно долго...) Да и при наличии очереди switch не факт, что стоит отменять (см. ниже). И, скорей, очередь не событий (с ней легко нарваться на переполнение), а приоритетная очередь в планировщике куда попадают ожидающие событие автоматы. Событие которое носит бинарный характер: или произошло, или нет -- подразумеваем, что время реакции системы заведомо достаточно для обработки серии событий (а если нет -- вручную заводим fifo под конкретное событие, под байтики UART, например). Почему я пишу switch не исключается: да потому, что вне зависимо от наличия или отсутствия очереди, наличия волшебных макросов PT_WAIT (замаскированный switch на самом деле) switch-технология сохраняет преимущество в случае не линейных переходов (1->2->3->4...) в автомате (иначе код превращается в адское goto-спагетти) и в случае необходимости наблюдения за переменной состояния автомата извне (в варианте с protothreads придётся завести дополнительную переменную, кроме собственно переменной состояния хранящей __LINE__ и не забывать обновлять её, в чём легко облажаться). PS: в статьях Miro Samek (со)автора state-machine.com тоже указывается на недостаток вроде отсутстия WaitForMultipleEvents(), без чего все переходы в автомате, если без дополнительных костылей и подпорок вроде цикла проверки всех условий вручную с таймаутом, превращаются в линейные 1->2->3...
[ZX]