Если это многозадачная система с упреждающим приоритетом, то планировщик RTOS будет запускать готовую к выполнению задачу с наивысшим приоритетом. Когда семафор получает сигнал, планировщик RTOS повторно оценивает готовую к выполнению задачу с наивысшим приоритетом и выполняет переключение контекста на эту задачу, если она отличается от ранее запущенной задачи.
Когда есть несколько задач, ожидающих одного и того же семафора, и этот семафор сигнализируется, тогда:
- Задача с наивысшим приоритетом среди задач, ожидающих семафора, будет готова к выполнению.
- Остальные задачи будут продолжать ждать семафора.
- Если ранее запущенная задача имеет более высокий приоритет, чем задача, которая была подготовлена к выполнению, то предыдущая задача продолжает выполняться. Даже если ожидающая задача была сделана готовой к выполнению, она не будет выполняться до тех пор, пока не станет задачей с наивысшим приоритетом, готовой к выполнению.
Вышеизложенное справедливо для всех ОСРВ с вытесняющей многозадачностью на основе приоритетов, что не обязательно относится ко всем ОСРВ. Если RTOS не поддерживает задачи с приоритетом, то она, скорее всего, назначит семафор задаче, которая дольше всего ждала семафора. Кроме того, он, вероятно, использует планировщик с циклическим перебором, так что каждая задача выполняется в заранее определенном временном интервале, а не позволяет задачам асинхронно вытеснять друг друга.
Последующие действия. Если вы используете семафор в качестве сигнала события и есть несколько задач, использующих это событие, вам придется тщательно продумать дизайн. Я не верю, что это можно сделать с помощью одного двоичного семафора. Потому что, если задача потребителя с наивысшим приоритетом получает семафор, делает свою работу, а затем снова ждет семафора, прежде чем семафор снова будет сигнализирован, то потребитель с наивысшим приоритетом всегда будет получать семафор каждый раз, когда он сигнализируется. Задачи-потребители с более низким приоритетом никогда не будут выполняться, потому что им никогда не будет присвоен семафор.
Одним из возможных решений является использование счетного семафора. При возникновении события счетчик семафоров должен быть установлен равным количеству потребляющих задач. Затем каждая потребляющая задача получает семафор и уменьшает счетчик на единицу. Задачи-потребители не должны снова ждать семафора, пока счетчик семафора не уменьшится до нуля. Это предотвратит многократное получение семафора потребителем с наивысшим приоритетом для каждого события и, следовательно, позволит каждой задаче потребителя выполняться ровно один раз в ответ на событие.
Возможно, вы захотите изучить шаблоны проектирования публикации-подписки, чтобы узнать, есть ли лучшие способы решения этого требования для вашей ситуации.
01.01.2016