Оптимизируйте многоскоростное многозадачное выполнение для сред выполнения 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

Похожие темы