Используя 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
, RTOS semGive
функция вызвана, и 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