Не меняйте приоритеты задач прямо из пользовательского кода. Большинство RTOS предоставляют API, которые позволяют нам это делать, но это плохой стиль, поскольку он порождает больше проблем, чем решает. Исключение составляют случаи, когда некоторые RTOS работают с этим внутри (например, мьютексы с приоритетным наследованием, чтобы избежать определенных проблем с многозадачностью).
Я предполагаю, что вы хотите иметь более длинную критическую секцию только на этапе включения вашей системы или на другом особом этапе ее работы. В противном случае вам действительно следует прислушаться к комментарию @Clifford и задать вопросы о ваших приоритетных назначениях и декомпозиции задач.
Если вам нужен этот последовательный период только на этапе инициализации/включения, это типичная ситуация, которая возможна и при хорошем дизайне задачи. В этом случае вам понадобится управление уровнями выполнения.
Управление уровнями выполнения
Самый простой способ реализовать это — написать небольшую библиотеку поверх вашей RTOS, используя два ресурса счетных семафоров: один для текущего уровня выполнения, другой — для следующего. При входе на уровень выполнения семафор заполняется столько токенов, сколько есть задач, которые должны находиться под контролем управления уровнем выполнения. Каждая задача, ожидающая обработки данного уровня выполнения, пытается получить свой маркер с семафора current-runlevel. Когда задача завершает свою часть уровня выполнения, она обращается к семафору следующего уровня, который в это время будет недоступен.
Прежде чем заполнять конфигурацию управления уровнем запуска, вы можете нарисовать себе диаграмму последовательности, чтобы проверить, в каких точках задачи должны ждать других по любой причине. Обычно для каждой задачи релевантны только несколько уровней выполнения, и для каждого уровня выполнения набор соответствующих задач также может быть небольшим. Поэтому вы можете добавить небольшую вспомогательную функцию, такую как WaitForRunlevelNumber(N)
, с циклом, который автоматически работает с теми уровнями выполнения, которые не имеют отношения к делу.
Управление уровнями выполнения должно быть завершено, если завершены все фазы, требующие явной синхронизации. Затем все задачи выпускаются на свободу. Иногда вы хотите выпустить задачи с низким приоритетом раньше, если они уже завершили все критические фазы. Затем количество поддерживаемых задач может уменьшаться от одного уровня выполнения к другому.
person
HelpingHand
schedule
01.05.2020