Используя макрос rtmStepTask
, среды выполнения, которые используют механизмы управления задачами операционной системы реального времени (RTOS) — например, VxWorks® — могут улучшать производительность сгенерированного кода путем устранения избыточных вызовов планирования во время выполнения задач в многоскоростной, многозадачной модели, следующие разделы описывают детали реализации.
Макрос rtmStepTask
задан в model.h
, и его синтаксис следующие:
boolean task_ready = rtmStepTask(rtm, idx);
Аргументы:
rtm
: указатель на структуру модели реального времени (rtM
)
idx :
идентификатор задачи (tid
) задачи, планирование которой счетчика должно быть протестировано
rtmStepTask
возвращает TRUE
, если счетчик планирования задачи равняется нулю, указывая, что задача должна быть запланирована для выполнения на шаге текущего времени. В противном случае это возвращает FALSE
.
Если ваша цель поддерживает параметр Generate an example main program, можно сгенерировать вызовы rtmStepTask
с помощью функции TLC RTMTaskRunsThisBaseStep
.
Чтобы понять оптимизацию, которая доступна для цели RTOS, рассмотрите, как цель ERT планирует задачи для целей несмонтированной платы (где RTOS не присутствует). Цель ERT поддерживает scheduling counters и event flags для каждой задачи подуровня. Счетчики планирования реализованы в модели реального времени (rtM) структура данных как массивы, индексированные на идентификаторе задачи (tid
).
Счетчики планирования обновляются задачей тарифной ставки. Счетчики являются делителями тактовой частоты, которые подсчитывают демонстрационный период, сопоставленный с каждой задачей подуровня. Когда данный подсчетчик скорости достигает значения, которое указывает, что он имеет хит, демонстрационный период для того уровня протек, и счетчик сбрасывается, чтобы обнулить. Когда это произойдет, задача подуровня должна быть запланирована для выполнения.
Флаги события указывают, планируется ли данная задача для выполнения. Для многоскоростной, многозадачной модели флаги события сохраняются кодом в основной программе для модели. Для каждой задачи код поддерживает счетчик задачи. Когда счетчик достигает 0, указывая, что демонстрационный период задачи протек, флаг события для той задачи установлен.
На каждом временном шаге обновляются счетчики и флаги события, и задача тарифной ставки выполняется. Затем флаги планирования проверяются в порядке tid
, и задачи, флаг события которых установлен, выполняются. Поэтому задачи выполняются в порядке приоритета.
Для целей несмонтированной платы, которые не могут полагаться на внешний RTOS, флаги события обязательны, чтобы позволить перекрывающееся вытеснение задачи. Однако цель RTOS использует саму операционную систему, чтобы справиться с перекрывающимся вытеснением задачи, сокращая обслуживание флагов события.
Следующий код планирования задач, от ertmainlib.tlc
, разработан для многоскоростной многозадачной операции на примере RTOS (VxWorks) цель. Пример использует функцию TLC RTMTaskRunsThisBaseStep
, чтобы сгенерировать вызовы макроса rtmStepTask
. Цикл выполняет итерации по каждой задаче подуровня, и rtmStepTask
называется для каждой задачи. Если rtmStepTask
возвращает TRUE
, функция semGive
RTOS вызвана, и RTOS планирует задачу запуститься.
%assign ifarg = RTMTaskRunsThisBaseStep("i") for (i = 1; i < %<FcnNumST>; i++) { if (%<ifarg>) { semGive(taskSemList[i]); if (semTake(taskSemList[i],NO_WAIT) != ERROR) { logMsg("Rate for SubRate task %d is too fast.\n",i,0,0,0,0,0); semGive(taskSemList[i]); } } }
Избыточные вызовы планирования все еще сгенерированы по умолчанию для обратной совместимости. Чтобы изменить эти настройки и подавить их, добавьте следующее определение переменной TLC в свой системный конечный файл перед оператором %include "codegenentry.tlc"
:
%assign SuppressSetEventsForThisBaseRateFcn = 1