Как vxWorks справляется с двумя задачами с одинаковым приоритетом?

StackOverflow https://stackoverflow.com/questions/79892

  •  09-06-2019
  •  | 
  •  

Вопрос

Во встроенной системе vxWorks есть две задачи (T1 и T2) с одинаковым приоритетом (110).
Как с этим справляется штатный планировщик vxWorks, если обе задачи готовы к запуску?
Какая задача выполняется первой?

Это было полезно?

Решение

Первой запускается задача, которая создается первой, как это реализовано задачей планировщика VxWorks.VxWorks использует планирование на основе приоритетов по умолчанию.Таким образом, в вашем случае, поскольку T1 и T2 имеют одинаковый приоритет, какой бы из них ни получил процессор первым, он будет продолжать работать бесконечно, пока он не будет явно заблокирован (с использованием задачаПриостановить или TaskDelay), в это время другая задача READY будет выполняться до тех пор, пока не будет заблокирована, и так далее.Это должно контролироваться семафорами или мьютексами (мутексами?)

Основная проблема планирования на основе приоритетов объясняется именно этой проблемой.Как определить, как долго можно выполнять эти задачи?Тот факт, что они имеют одинаковый приоритет, усложняет ситуацию.Другая проблема заключается в том, что задачи VxWorks с высоким приоритетом (меньшее число означает более высокий приоритет) могут вытеснить ваше приложение, к чему вы должны быть готовы в своем коде.Эти проблемы можно решить, используя циклическое планирование.Описаны дополнительные проблемы, возникающие при циклическом планировании, и их решения. здесь.

Другие советы

VxWorks имеет 256 уровней приоритета (0 — самый высокий, 255 — самый низкий).В любой момент времени на ЦП выполняется задача с наивысшим приоритетом.Концептуально каждый уровень приоритета имеет очередь, в которой несколько задач стоят в очереди на выполнение.

У нас есть 3 задачи с одинаковым приоритетом A, B, C.Предположим, что A выполняется.
Когда A блокируется (taskDelay, SemTake, msgQReceive), B начнет выполнение.
Когда A разблокируется, он помещается в конец очереди.Теперь у нас есть B, C, A.
Когда B блокирует, C берет верх и т. д.

Если включено циклическое планирование (распределение времени), применяется та же концепция, но задача помещается в конец очереди, когда ее интервал времени истекает.

Обратите внимание, что задача, вытесненная задачей с более высоким приоритетом, НЕ повлияет на порядок очереди.Если A работал и был вытеснен, он продолжит выполнение, когда будет выполнена задача с более высоким приоритетом.Он не помещается в конец очереди.

По умолчанию тот, который создан первым, будет выполняться, и если он не откажется от процессора, другой никогда не запустится.

Вы можете явно включить циклический перебор, тогда они будут распределять время.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top