Миро Самек, Роберт Вард "Построение наипростейшего диспетчера задач" (перевод)
- Miro Samek |
- Robert Ward |
- RTOS |
- SST |
- переводы
Диспетчер SST
Диспетчер SST оформлен в виде простой Си-функции "SST_schedule_()", чья работа заключается в поиске готовых к исполнению задач с наивысшим приоритетом и их запуске, если текущий приоритет ниже найденного. Для выполнения указанной работы диспетчер использует две переменные: уже описанную "SST_readySet_" и хранящую текущий уровень приоритета "SST_currPrio_". Для сохранения целостности данных обращение к обеим переменным происходит только внутри критических секций (см. макросы "SST_ISR_ENTRY" и "SST_ISR_EXIT"). Полный исходный текст диспетчера SST приведён в листинге 4 (да, это весь код). Функция "SST_schedule_()" должна вызываться и возвращать управление при запрещённых прерываниях.
Листинг 4. Диспетчер SST |
|
Работа диспетчера подобна функционированию аппаратного контроллера прерываний при обслуживании очередного события. Процедура начинается с сохранения текущего приоритета в стековой переменной "pin" (1). Далее он сравнивается с наивысшим приоритетом задачи из числа готовых к исполнению (вычисляемому по значению "SST_readySet_"). Самой быстродействующей реализаций такого сравнения является табличный алгоритм бинарного поиска (а если точнее, то log2 (x) + 1), выясняющий номер самого старшего единичного бита в "SST_readySet_" (2). Если приоритет найденной задачи "p" выше текущего приоритета, то диспетчер должен запусить именно её. Для начала из очереди событий изымается очередная запись (3) и, если очередь опустела, в "SST_readySet_" сбрасывается соответствующий бит (4). Затем текущий приоритет "SST_currPrio_" поднимается до нового уровня "p" (5), разблокируются прерывания (6) и вызывается задача с приоритетом "p" (7). По завершении её работы и возврате управления диспетчеру прерывания вновь блокируются (8) и повторяется цекл "while" поиска готовой к запуску задачи (2). Процедура продолжается, пока обнаруживаются готовые к исполнению процессы, чей приоритет выше значения, сохраненного в переменной "pin". Перед завершением работы диспетчер восстанавливает приоритет "SST_currPrio_" из переменной "pin" (9).
Взаимоисключающая блокировка в SST (Mutual exclusion)
SST - ядро вытесняющей операционной системы и, как при работе со всеми ядрами такого типа, следует очень аккуратно проводить распределение общего ресурса среди нескольких задач. В идеале задачи SST не должны разделять общих ресурсов, сократив всё межпроцессное взаимодействие к обмену событиями. Такой идеализированный подход позволил бы вести разработку каждой задачи с использованием простейшей последовательной техники, оставляя все детали потокобезопасного обмена сообщениями и обслуживание очередей на SST. Конечно, возможно использование и разделяемых ресурсов в обмен на увеличение взаимного влияния между задачами. Выбор такого пути вынуждает самостоятельно заниматься синхронизацией доступа к общим ресурсам (разделяемым переменным или устройствам). Одной из возможностей является защита доступа с помощью критических секций, что требует от разработчика постоянно запрещать и разрешать прерывания при каждом обращении к ресурсу. Такой вариант, возможно, будет самым оптимальным методом синхронизации при кратковременных обращениях к резурсам. Но SST предлагает средства более тонкой синхронизации: мьютекс с повышением приоритета. Этот тип мьютекса не подвержен инверсии приоритета [5], но при этом позволяет аппаратным прерываниям и приоритетным процессам работать как обычно. SST-вариант мьютекса с повышением приоритета весьма прост. Следует напомнить, что диспетчер SST может запускать только те процессы, приоритет которых выше приоритета задачи, диспетчер вызвавшей. Это означает, что кратковременное повышение приоритета посредством переменной "SST_currPrio_" блокирует все процессы с приоритетом ниже, чем "поднятый". Это именно то, для чего мьютекс с повышением риоритета и предназначен. Реализация показана в листинге 5.
Листинг 5. Процедуры блокировки и освобождения ресурса для мьютекса с повышением приоритета |
|
В отличие от макроса "INT_LOCK", SST-мьютекс допускает вложенность процедур, запрещающих / разрешающих прерывания, потому что предшествующее состояние системы прерываний сохраняется в стеке. Листинг 6 показывает использование мьютекса внутри обработчиков прерываний "tickTaskA()" и "tickTaskB()" при вызове программного генератора случайных чисел, который не допускает повторной входимости.
Листинг 6. Использование мьютекса с повышением приоритета для защиты не допускающего повторное вхождение кода |
|
- блог пользователя teap0t
- 69714 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Recent comments
9 часов 2 минуты назад
1 неделя 8 часов назад
1 неделя 15 часов назад
1 неделя 15 часов назад
1 неделя 2 дня назад
1 неделя 3 дня назад
1 неделя 3 дня назад
1 неделя 4 дня назад
1 неделя 4 дня назад
1 неделя 5 дней назад