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

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

Использовать rtmStepTask

rtmStepTask макрос задан в model.h и его синтаксис следующий:

boolean task_ready = rtmStepTask(rtm, idx);

Аргументы следующие:

  • rtm: указатель на структуру модели реального времени (rtM)

  • idx: идентификатор задачи (tid) задачи, счетчик планирования которой должен быть протестирован

rtmStepTask возвращает TRUE если счетчик планирования задачи равен нулю, что указывает на то, что задача должна быть запланирована к выполнению на текущем временном шаге. В противном случае возвращается FALSE.

Если ваш системный целевой файл поддерживает параметр конфигурации <reservedrangesplaceholder0> модели, можно сгенерировать вызовы rtmStepTask при помощи функции TLC RTMTaskRunsThisBaseStep.

Планируйте код для модели реального времени без RTOS

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

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

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

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

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

Похожие темы