Optimize Multirate Multitasking Execution for RTOS Target Environments
Using the rtmStepTask
macro, run-time environments that employ task
management mechanisms of an real-time operating system (RTOS)—for example, VxWorks®—can improve performance of generated
code by eliminating redundant scheduling calls during the execution of tasks in a multirate,
multitasking model, The following sections describe implementation details.
Use rtmStepTask
The rtmStepTask
macro is defined in model.h
and
its syntax is as follows:
boolean task_ready = rtmStepTask(rtm, idx);
The arguments are:
rtm
: pointer to the real-time model structure (rtM
)idx
: task identifier (tid
) of the task whose scheduling counter is to be tested
rtmStepTask
returns TRUE
if the task's scheduling
counter equals zero, indicating that the task should be scheduled for execution on the
current time step. Otherwise, it returns FALSE
.
If your system target file supports model configuration parameter Generate an
example main program, you can generate calls to
rtmStepTask
by using the TLC function
RTMTaskRunsThisBaseStep
.
Schedule Code for Real-time Model without an RTOS
To understand the optimization that is available for an RTOS target, consider how the
ERT target schedules tasks for bareboard targets (where RTOS is not present). The ERT target
maintains scheduling counters and event flags
for each subrate task. The scheduling counters are implemented within the real-time model
(rtM) data structure as arrays, indexed on task identifier (tid
).
The scheduling counters are updated by the base-rate task. The counters are clock rate dividers that count up the sample period associated with each subrate task. When a given subrate counter reaches a value that indicates it has a hit, the sample period for that rate has elapsed and the counter is reset to zero. When this occurs, the subrate task must be scheduled for execution.
The event flags indicate whether or not a given task is scheduled for execution. For a multirate, multitasking model, the event flags are maintained by code in the main program for the model. For each task, the code maintains a task counter. When the counter reaches 0, indicating that the task's sample period has elapsed, the event flag for that task is set.
On each time step, the counters and event flags are updated and the base-rate task
executes. Then, the scheduling flags are checked in tid
order, and tasks
whose event flag is set is executed. Therefore, tasks are executed in order of priority.
For bareboard targets that cannot rely on an external RTOS, the event flags are mandatory to allow overlapping task preemption. However, an RTOS target uses the operating system itself to manage overlapping task preemption, making the maintenance of the event flags redundant.
Schedule Code for Multirate Multitasking on an RTOS
The following task scheduling code, from ertmainlib.tlc
, is designed
for multirate multitasking operation on an example RTOS (VxWorks) target. The example uses the TLC function
RTMTaskRunsThisBaseStep
to generate calls to the
rtmStepTask
macro. A loop iterates over each subrate task, and
rtmStepTask
is called for each task. If
rtmStepTask
returns TRUE
, the RTOS
semGive
function is called, and the RTOS schedules the task to
run.
%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]); } } }
Suppress Redundant Scheduling Calls
Redundant scheduling calls are still generated by default for backward compatibility. To
change this setting and suppress them, add the following TLC variable definition to your
system target file before the %include "codegenentry.tlc"
statement:
%assign SuppressSetEventsForThisBaseRateFcn = 1