Examples of Generated Code with Memory Sections

Sample ERT-Based Model with Subsystem

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 AssignmentSection NameField NameField Value
Input/OutputMemSect1Pre-pragma#pragma IO_begin
Post-pragma#pragma IO-end
Internal dataMemSect2Pre-pragma#pragma InData-begin(%<identifier>)
Post-pragma#pragma InData-end
ParametersMemSect3Pre-pragma#pragma Parameters-begin
Post-pragma#pragma Parameters-end
Initialize/
Terminate
MemSect4Pre-pragma#pragma InitTerminate-begin
Post-pragma#pragma InitTerminate-end
Execution functionsMemSect5Pre-pragma#pragma ExecFunc-begin(%<identifier>)
Post-pragma#pragma ExecFunc-begin(%<identifier>)

Subsystem-Level Memory Section Assignments and Definitions

Section AssignmentSection NameField NameField Value
Execution functionsMemSect6Pre-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.

Model-Level Data Structures

#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

Model-Level Functions

#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-end

Subsystem Function

Because 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)
  


 © 1984-2008- The MathWorks, Inc.    -   Site Help   -   Patents   -   Trademarks   -   Privacy Policy   -   Preventing Piracy   -   RSS