fk0, легенда (12.09.2015 13:33, просмотров: 707) ответил Make_Pic на Как без использования RTOS красивее правильнее сделать, чтобы запускалась последовательно очередь из функций поочередно, но во время ожидания TimeDelay события каждой функцией, управление отдавалось main loop?
Подход, если не нужно реальное вытеснение (т.е. критично время реакции), порочный: сложные системы в "больших компьютерах", наоборот, стараются сделать однопоточными и событийно-управляемыми. Иначе сложность синхронизации параллельных пороков http://caxapa.ru/279767.html
превышает разумные величины. Если система с big-loop достаточно простая и быстрая, чтоб обеспечить приемлимое время реакции во всех случаях, то многопоточность не нужна, т.к. сулит только проблемы. См. ссылку. Но если big loop разросся до слишком больших величин, то и оборачиваться (что ограничивает время реакции) он станет слишком медленно, т.к., в этом цикле только и делатся, преимущественно, что проверяются условия (не выполняющиеся раз от разу). Если нужна более высокая реактивность (или низкое энергопотребление), то нужен какой-то планировщик с списками ожидания и связанными с ними условиями. Принципиально не вытеснение, а именно наличие развитой системы взаимодействия параллельных потоков. ОС может быть вовсе кооперативной. А с этим у простых RTOS туго. Часто отсутствуют многие важные функции присутствующие в "больших" ОС. Например, возможность ожидания более чем одного события одновременно (аналог select() или WaitForMultipleEvents, или хотя бы прерывание ожидания сигналом). Сейчас скажут очередь. Но проблема очереди, в том, что поступившие события обрабатываются строго в порядке очереди. Нет приоритетов. Хорошо, если ОС унаследована от ITRON, где есть Event Flags. Или Thread Local Storage отсутствует.
С моей точки зрения, вообще "планировщик" не должен быть частью ОС. По крайней мере сложный планировщик. ОС должна дать базовые сервисы. Достаточно unix-подобной системы на уровне начала 80-х. Гораздо важней управление памятью и загрузкой программ, драйвера ввода-вывода, обработка ошибок. Сложный планировщик скорей должен быть некой библиотекой скорей, наподобии libevent. Когда события попадают на вход планировщика, он выбирает наиболее приоритетное, и вызывает функцию его обработки. Места вытеснению здесь нет, это событийно-управляемая система. Вытеснение есть только на уровне ОС между отдельными процессами, по возможности наиболее изолированными.
[ZX]