| Real-Time Workshop® Embedded Coder™ | ![]() |
| On this page… |
|---|
The next figure shows an ERT-based Simulink model that defines one subsystem, and the contents of that subsystem.

Assume that the subsystem is atomic, the Real-Time Workshop system code is Reusable function, memory sections have been created and assigned as shown in the next two tables, and all data memory sections specify Pragma surrounds to be Each variable.
Model-Level Memory Section Assignments and Definitions
| Section Assignment | Section Name | Field Name | Field Value |
|---|---|---|---|
| Input/Output | MemSect1 | Pre-pragma | #pragma IO_begin |
| Post-pragma | #pragma IO-end | ||
| Internal data | MemSect2 | Pre-pragma | #pragma InData-begin(%<identifier>) |
| Post-pragma | #pragma InData-end | ||
| Parameters | MemSect3 | Pre-pragma | #pragma Parameters-begin |
| Post-pragma | #pragma Parameters-end | ||
| Initialize/ Terminate | MemSect4 | Pre-pragma | #pragma InitTerminate-begin |
| Post-pragma | #pragma InitTerminate-end | ||
| Execution functions | MemSect5 | Pre-pragma | #pragma ExecFunc-begin(%<identifier>) |
| Post-pragma | #pragma ExecFunc-begin(%<identifier>) |
Subsystem-Level Memory Section Assignments and Definitions
| Section Assignment | Section Name | Field Name | Field Value |
|---|---|---|---|
| Execution functions | MemSect6 | Pre-pragma | #pragma DATA_SEC(%<identifier>, "FAST_RAM") |
| Post-pragma |
Given the preceding specifications and definitions, the code generator would create the following code, with minor variations depending on the current version of the Target Language Compiler.
#pragma IO-begin
ExternalInputs_mySample mySample_U;
#pragma IO-end
#pragma IO-begin
ExternalOutputs_mySample mySample_Y;
#pragma IO-end
#pragma InData-begin(mySample_B)
BlockIO_mySample mySample_B;
#pragma InData-end
#pragma InData-begin(mySample_DWork)
D_Work_mySample mySample_DWork;
#pragma InData-end
#pragma InData-begin(mySample_M_)
RT_MODEL_mySample mySample_M_;
#pragma InData-end
#pragma InData-begin(mySample_M)
RT_MODEL_mySample *mySample_M = &mySample_M_;
#pragma InData-end
#pragma Parameters-begin
Parameters_mySample mySample_P = {
0.0 , {2.3}
};
#pragma Parameters-end#pragma ExecFunc-begin(mySample_step)
void mySample_step(void)
{
real_T rtb_UnitDelay;
rtb_UnitDelay = mySample_DWork.UnitDelay_DSTATE;
mySubsystem(rtb_UnitDelay, &mySample_B.mySubsystem;,
(rtP_mySubsystem *) &mySample_P.mySubsystem);
mySample_Y.Out1_o = mySample_B.mySubsystem.Gain;
mySample_DWork.UnitDelay_DSTATE = mySample_U.In1;
}
#pragma ExecFunc-end(mySample_step)
#pragma InitTerminate-begin
void mySample_initialize(void)
{
rtmSetErrorStatus(mySample_M, (const char_T *)0);
{
((real_T*)&mySample_B.mySubsystem.Gain)[0] = 0.0;
}
mySample_DWork.UnitDelay_DSTATE = 0.0;
mySample_U.In1 = 0.0;
mySample_Y.Out1_o = 0.0;
mySample_DWork.UnitDelay_DSTATE = mySample_P.UnitDelay_X0;
}
#pragma InitTerminate-endBecause the subsystem specifies a memory section for execution functions that overrides that of the parent model, subsystem code looks like this:
/* File: mySubsystem.c */
#pragma DATA_SEC(mySubsystem, "FAST_RAM")
void mySubsystem(real_T rtu_In1,
rtB_mySubsystem *localB,
rtP_mySubsystem *localP)
{
localB->Gain = rtu_In1 * localP->Gain_Gain;
}If the subsystem had not defined its own memory section for execution functions, but inherited that of the parent model, the subsystem code would have looked like this:
/* File: mySubsystem.c */
#pragma ExecFunc-begin(mySubsystem)
void mySubsystem(real_T rtu_In1,
rtB_mySubsystem *localB,
rtP_mySubsystem *localP)
{
localB->Gain = rtu_In1 * localP->Gain_Gain;
}
#pragma ExecFunc-end(mySubsystem)
![]() | Applying Memory Sections | Memory Section Limitation | ![]() |
| © 1984-2008- The MathWorks, Inc. - Site Help - Patents - Trademarks - Privacy Policy - Preventing Piracy - RSS |