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