uRTOS в режиме кооперативной ОС

uRTOS

В предыдущей статье была рассмотрена работа ОС uRTOS в вытесняющем режиме. С тех пор кое-что в системе изменилось, исходник был тщательно перелопачен, перекомпонован, дополнен комментариями. Также в ОС была добавлена возможность работы в кооперативном режиме. Остановимся на этом чуток подробнее.

Немного теории

Вспомним, в чём основные отличия вытесняющей и кооперативной операционной системы? Вытесняющая ОС состоит из диспетчера (планировщика) и пользовательских процессов. Каждый процесс, будучи запущенным, выполняется непрерывно (с его точки зрения). Выполнение его кода крутится внутри бесконечного цикла for(;;). Но с точки зрения диспетчера системы, выполнение любого процесса может быть им приостановлено и переключено на выполнение более приоритетного процесса в зависимости от возникающих в системе событий. В связи с чем, каждому процессу необходима дополнительная память для хранения данных, связанных только с этим процессом (стек процесса). Для этих целей используется ОЗУ контроллера. Поэтому все вытесняющие ОС требовательны к наличию и объёму у контроллера внутреннего ОЗУ. Зато такие ОС могут максимально быстро реагировать на возникающие события.

С кооперативными ОС дело обстоит иначе. Такая система состоит из диспетчера и пользовательских подпрограмм или процедур. Их уже нельзя назвать процессами, так как выполнение их кода не носит непрерывного характера. Будучи вызванной, такая процедура выполняется от первой до последней команды, после чего управление снова возвращается диспетчеру. Строятся пользовательские процедуры чаще всего по принципу конечного автомата и используют те же регистры общего назначения (РОН) и тот же стек (для возврата из процедур и прерываний), что и ядро системы. Поэтому, кооперативные ОС потребляют во много раз меньшие объёмы ОЗУ контроллера в сравнении с вытесняющими ОС. Но расплачиваются за это гораздо меньшим быстродействием.

Какую ОС применять в конкретном случае, решать, конечно же, разработчику. Было бы глупо рекомендовать использовать только вытесняющие ОС и забыть про кооперативные, равно как и наоборот. Знать надо и те, и те, а использовать их, исходя из требований конкретного проекта. Поэтому мною было решено слегка расширить возможности своей ОС, добавив в неё упрощённый – кооперативный режим. Возможно, кому-то это пригодится.

Коротко

Итак, в архиве вы найдёте проект для AVR Studio 4.18, а также два файла – uRTOS-PREEMPTIVE.asm и uRTOS-COOPERATIVE.asm. В зависимости от того, какой режим работы системы планируется использовать, переименуйте (а лучше скопируйте) один из этих файлов в основной файл проекта – uRTOS.asm. Файлы старательно прокомментированы, поэтому не буду останавливаться на их описании.

В файле kernel.asm вы сможете найти исчерпывающее описание того, что происходит внутри системы. Также получите полную информацию о используемых макросах.

В качестве примера работы системы в двух режимах реализовано банальное «hello world!», т.е. мигание светодиодом с максимальной частотой для каждого из режимов. Практического смысла никакого, так что, назовём это лучше дрыганьем ногой :) По скорости этого дрыганья можно, разве что, бегло оценить разницу в быстродействии и потребляемых ресурсах для каждого из режимов. Например, в кооперативном режиме смена уровней на подопытной ноге происходит со средней частотой 57,142 кГц (для кварца частотой 8 МГц). В вытесняющем же режиме управление между процессами, дёргающими ногу, передаётся через событие, поэтому средняя частота дрыганья пониже — всего 27,632 кГц (для того же кварца). Ну и по используемой для этого действа памяти МК — 696 байт Flash + 8 байт SRAM для кооперативного режима и 880 байт Flash + 122 байта SRAM для вытесняющего режима.

Если возникнут вопросы, как говорится — вэлкам! :)
  • +12
  • 13 апреля 2013, 01:03
  • uRTOS
  • 1
Файлы в топике: uRTOS-1.2.zip

Комментарии (7)

RSS свернуть / развернуть
опечатка?
В начале написано что вытесняющая быстрей,
а в конце статьи оказалась что она ниже в 2 раза
0
Опечатки нет. В вытесняющем режиме дрыгание ногой медленнее, а реакция системы на внешние события быстрее. Именно засчёт того, что выполнение процессов может быть прервано при возникновении каких-то событий. Но опять же, это чисто теоретически и в большинстве случаев. Если, например, при кооперативном режиме возникает событие, и система не была занята выполнением какой-то процедуры (выполнение кода «крутилось» в диспетчере), то запуск процедуры-обработчика события может произойти быстрее, чем время, необходимое системе в вытесняющем режиме для переключения стеков и запуска процесса-обработчика такого же события. Вот и дрыгание ногой получается медленнее из-за того, что для каждого процесса дополнительно происходит загрузка-выгрузка его стека. То есть, при бОльших загрузках системы вытесняющий режим однозначно выигрывает у кооперативного по времени реакции на внешнее событие.
0
может стоит этот комментарий добавить прям в тело статьи после примера?
0
Да, уважаемый автор, вы чего-то совсем запутали читателей. Теория и эксперимент дают разные результаты?
0
Да, путанно написал, согласен :) Писал статью ночью, голова уже не варила :) И пример противоречивый получился. Единственное, что он, может быть, доказывает, — это что для задачи простого дёрганья ногами контроллера кооперативный режим подходит лучше и памяти ест меньше ))
0
Спасибо за статью, а то все про лобзики пишут.
+1
тсссс!.. не накликайте… а то следующая будет про киянку и стамеску. в трёх частях.
+3
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.