Optimize Multirate Multitasking Execution for RTOS Target Environments - MATLAB & Simulink (original) (raw)
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 tortmStepTask
by using the TLC functionRTMTaskRunsThisBaseStep
.
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 functionRTMTaskRunsThisBaseStep
to generate calls to thertmStepTask
macro. A loop iterates over each subrate task, andrtmStepTask
is called for each task. IfrtmStepTask
returns TRUE
, the RTOSsemGive
function is called, and the RTOS schedules the task to run.
%assign ifarg = RTMTaskRunsThisBaseStep("i") for (i = 1; i < %; i++) { if (%) { 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