Оптимизируйте многоскоростное многозадачное выполнение для сред выполнения RTOS

Используя макрос rtmStepTask, среды выполнения, которые используют механизмы управления задачами операционной системы реального времени (RTOS) — например, VxWorks® — могут улучшать производительность сгенерированного кода путем устранения избыточных вызовов планирования во время выполнения задач в многоскоростной, многозадачной модели, следующие разделы описывают детали реализации.

Используйте rtmStepTask

Макрос 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

Чтобы понять оптимизацию, которая доступна для цели RTOS, рассмотрите, как цель ERT планирует задачи для целей несмонтированной платы (где RTOS не присутствует). Цель ERT поддерживает scheduling counters и event flags для каждой задачи подуровня. Счетчики планирования реализованы в модели реального времени (rtM) структура данных как массивы, индексированные на идентификаторе задачи (tid).

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

Флаги события указывают, планируется ли данная задача для выполнения. Для многоскоростной, многозадачной модели флаги события сохраняются кодом в основной программе для модели. Для каждой задачи код поддерживает счетчик задачи. Когда счетчик достигает 0, указывая, что демонстрационный период задачи протек, флаг события для той задачи установлен.

На каждом временном шаге обновляются счетчики и флаги события, и задача тарифной ставки выполняется. Затем флаги планирования проверяются в порядке tid, и задачи, флаг события которых установлен, выполняются. Поэтому задачи выполняются в порядке приоритета.

Для целей несмонтированной платы, которые не могут полагаться на внешний RTOS, флаги события обязательны, чтобы позволить перекрывающееся вытеснение задачи. Однако цель 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

Похожие темы