Использование rtmStepTask
макрос, окружения во время выполнения, которые используют механизмы управления задачами операционной системы (RTOS) в реальном времени - например, VxWorks®- может улучшить эффективность сгенерированного кода путем устранения избыточных вызовов планирования во время выполнения задач в многозадачной, многозадачной модели. В следующих разделах описываются детали реализации.
rtmStepTask
макрос задан в model.h
и его синтаксис следующий:
boolean task_ready = rtmStepTask(rtm, idx);
Аргументы следующие:
rtm
: указатель на структуру модели реального времени (rtM
)
idx
: идентификатор задачи (tid
) задачи, счетчик планирования которой должен быть протестирован
rtmStepTask
возвращает TRUE
если счетчик планирования задачи равен нулю, что указывает на то, что задача должна быть запланирована к выполнению на текущем временном шаге. В противном случае возвращается FALSE
.
Если ваш системный целевой файл поддерживает параметр конфигурации <reservedrangesplaceholder0> модели, можно сгенерировать вызовы rtmStepTask
при помощи функции TLC RTMTaskRunsThisBaseStep
.
Чтобы понять оптимизацию, доступную для целевого объекта RTOS, рассмотрите, как целевой объект ERT планирует задачи для базовых целей (где RTOS не присутствует). Целевой объект ERT поддерживает scheduling counters и event flags для каждой задачи подрейса. Счетчики планирования реализованы в структуре данных модели реального времени (rtM) как массивы, индексированные на идентификаторе задачи (tid
).
Счетчики планирования обновляются задачей базовой скорости. Счетчики являются делителями тактовой частоты, которые подсчитывают период дискретизации, сопоставленный с каждой задачей подрейса. Когда заданный счетчик подрейса достигает значения, которое указывает, что он имеет удар, период дискретизации для этой скорости прошло, и счетчик сбрасывается на нуль. Когда это происходит, задача подрейса должна быть запланирована к выполнению.
Флаги событий указывают, запланировано ли выполнение данной задачи. Для многомерной модели многозадачности флаги событий поддерживаются кодом в основной программе для модели. Для каждой задачи код поддерживает счетчик задач. Когда счетчик достигает 0, указывая, что период дискретизации задачи истек, устанавливается флаг события для этой задачи.
На каждом временном шаге обновляются счетчики и флаги событий, и выполняется задача базовой скорости. Затем флаги планирования сдаются на хранение tid
порядок, и задачи, чей флаг события установлен, выполняются. Поэтому задачи выполняются в порядке приоритета.
Для конечных объектов bareboard, которые не могут полагаться на внешнюю 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