как задача vxworks может позволить всем другим задачам с меньшим приоритетом выполняться в течение одного цикла многозадачности?

как задача vxworks может дать ЦП задачи с более низким приоритетом за минимальное время?

Есть ли метод, который позволяет задаче отказаться от процессора менее чем за 1 мс?

Единственный известный мне метод запуска других задач с более низким приоритетом — это taskDelay(n), где n>=1.

Я всегда предполагал, что taskDelay(0) позволяет запускать все другие задачи с равным или большим приоритетом.

taskDelay(1) позволяет всем ожидающим задачам с более низким приоритетом выполняться до 1 мс.


person Doug Null    schedule 12.06.2012    source источник


Ответы (2)


Задача с более высоким приоритетом всегда будет выполняться, если она готова и если вы не вызвали taskLock() или intLock() и т. д., поэтому вам не нужно taskDelay() разрешать выполнение задач с более высоким приоритетом. бегать.

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

taskDelay(n>0) поместит текущую задачу в конец очереди готовности для этого приоритета, и она не будет перенесена на n тиков. Это позволит запускать любые готовые задачи с более низким приоритетом.

Параметр taskDelay() - это тики, а не мс. Длина этого может быть определена на основе частоты синхронизации системы (которую вы устанавливаете sysClkRateSet() и читаете sysClkRateGet() ). 1 тик может равняться 1 мс, но только, если частота тактов системы равна 1000. Вероятно, этого не будет.

ПРИМЕЧАНИЕ. Эти системные часы не совпадают с частотой процессора.

person mjs    schedule 25.10.2013

В VxWorks есть определенные события, которые заставляют планировщик запускаться, например, каждый semGive(), каждый такт системных часов и taskDelay(). Аргумент для taskDelay() — тики системных часов. sysClkRateGet() вернет скорость ваших системных часов.

Например, если sysClkRateGet() возвращает 10, то каждый такт часов составляет 100 мс. Итак, если вы вызовете taskDelay(1), это сообщит вашей задаче, что она будет спать до следующего системного тика. Однако это не гарантирует 100-мс сон, а вместо этого сон до 100 мс или всего 0 мс, если следующий такт часов неизбежен. Если вы вызываете taskDelay(2), то ваша задача будет спать до следующего такта (промежуток времени между 0 и 100 мс) плюс следующий такт (гарантировано 100 мс), в результате чего общая задержка составит от 100 мс до 200 мс.

Время в VxWorks имеет большое значение, и я надеюсь, что это поможет объяснить некоторые детали.

person gjcamann    schedule 20.06.2012