Create code definitions, which control code generation for model data and functions
To open an Embedded Coder Dictionary, in a model window, on the C Code tab, select Code Interface > Embedded Coder Dictionary.
The Embedded Coder Dictionary window displays code generation definitions that are stored in the model file. If the model is linked to a data dictionary, the window also displays definitions that are stored in that data dictionary or, if applicable, in a referenced dictionary. The Source column indicates where each definition is stored.
To open the Embedded Coder Dictionary in a Simulink® data dictionary, in the Model Explorer Model Hierarchy pane:
Under the dictionary node, select the Embedded Coder node.
If you do not see the node, right-click the dictionary node and select Show Empty Sections.
In the Dialog pane (the right pane), click Open Embedded Coder Dictionary.
In a model, create a storage class that aggregates internal model data, including block states, into a structure whose characteristics you can control. Then, verify the storage class by generating code from the model.
Open the example model rtwdemo_roll
.
rtwdemo_roll
If the model does not open in the Embedded Coder app, open the app and click the C Code tab.
On the C Code tab, select Code Interface > Embedded Coder Dictionary. The Embedded Coder Dictionary window displays code generation definitions that are stored in the model file.
In the Embedded Coder Dictionary window, click Add.
Select the new storage class that appears at the bottom of the list,
StorageClass1
. In the Property Inspector pane on the
right, set the property values listed in this table.
Property | Value |
---|---|
Name | InternalStruct |
Header File | internalData_$R.h |
Definition File | internalData_$R.c |
Storage Type | Structured |
Structure Properties > Type Name | internalData_T_$M |
Structure Properties > Instance Name | internalData_$M |
After making your changes, in the bottom pane, verify that the pseudocode preview reflects what you expect.
Return to the model editor. To open the Code Mappings editor, below the
canvas, double-click Code Mappings. On the Data
Defaults tab, expand the Signals
section. Select the Signals, states, and internal data
row and set Storage Class to
InternalStruct
.
In the Configuration Parameters dialog box, on the Code
Generation > Code Placement pane, set
File packaging format to
Modular
.
Generate code.
In the Simulink Editor Code view, open and inspect the file
internalData_rtwdemo_roll.h
. The file defines the
structure type internalData_T_
, whose fields represent
block states in the model.
/* Storage class 'InternalStruct', for system '<Root>' */ typedef struct { real32_T FixPtUnitDelay1_DSTATE; /* '<S7>/FixPt Unit Delay1' */ real32_T Integrator_DSTATE; /* '<S1>/Integrator' */ int8_T Integrator_PrevResetState; /* '<S1>/Integrator' */ } internalData_T_;
The file also declares a global structure variable named
internalData_
.
/* Storage class 'InternalStruct' */ extern internalData_T_ internalData_;
Open and inspect the file internalData_rtwdemo_roll.c
.
The file allocates memory for internalData_
.
/* Storage class 'InternalStruct' */ internalData_T_ internalData_;
With a function template, you can specify a rule that governs the names of generated entry-point functions. This technique helps save time and maintenance effort in a model with many entry-point functions, such as an export-function model or a multirate, multitasking model.
This example shows how to create a function template that specifies the naming
rule func_$N_$R
. $N
is the base name of each
generated function and $R
is the name of the Simulink model.
Open the example model rtwdemo_mrmtbb
.
Update the block diagram. This multitasking model has two execution rates, so the generated code includes two corresponding entry-point functions.
In the model, set model configuration parameter System target
file to ert.tlc
. To use a function
customization template, you must use an ERT-based system target file.
In the Simulink Editor, open the Embedded Coder app and open the Embedded Coder Dictionary.
In the Embedded Coder Dictionary, on the Function Customization Templates tab, click Add.
For the new function template, set these properties:
Name to
myFunctions
.
Function Name to
func_$N_$R
.
After making your changes, verify that the pseudocode preview reflects what you expect.
In the model window, open the Code Mappings editor. On the
Function Defaults tab, for the
Initialize/Terminate and
Execution rows, set Function
Customization Template to
myFunctions
.
Generate code.
In the Code view, open and inspect the file
rtwdemo_mrmtbb.c
. The file defines the two execution
functions, func_step0_rtwdemo_mrmtbb
and
func_step1_rtwdemo_mrmtbb
, whose names conform to the
rule that you specified in the function template.
For an example that shows how to create a memory section, see Control Data and Function Placement in Memory by Inserting Pragmas.
This example shows how to create a storage class that places global variable definitions and declarations in files whose names depend on the model name. You create two copies of the storage class so that you can use one copy with parameter data (the data category Model parameters) and one copy with other data.
Typically, the generated code initializes parameter data statically, outside any function, and initializes other data dynamically, in the model initialization function. When you create a storage class by using the Custom Storage Class Designer or an Embedded Coder Dictionary, you set the Data Initialization property to specify the initialization mechanism.
In an Embedded Coder Dictionary, for each storage class, you must select
Static
or Dynamic
initialization. Consider creating one copy of the storage class for parameter data
(Static
) and one copy for other data
(Dynamic
).
Open example model rtwdemo_roll
.
If the C Code tab is not open, open the Embedded Coder app and click the C Code tab.
Select Code Interface > Embedded Coder Dictionary
In the Embedded Coder Dictionary, click Add.
For the new storage class, set these properties:
Name to
SigsStates
Header File to
$R_my_data.h
Definition File to
$R_my_data.c
By default, the Data Initialization property is
set to Dynamic
, which means the storage class
is suitable for use with signals, states, and data stores.
After making your changes, verify that the pseudocode preview reflects what you expect.
Click Duplicate. A new storage class,
SigsStates_copy
, appears.
For the new storage class, set these properties:
Name to
Params
Data Initialization to
Static
After making your changes, verify that the pseudocode preview reflects what you expect.
Return to the model and open the Code Mappings editor. Below the model canvas, double-click Code Mappings - C.
On the Data Defaults tab, for the Parameters > Model Parameters row, in the Storage Class column,
select Params
.
For the Signals > Signals, states, and internal data row, set Storage Class to
SigsStates
.
Configure some parameter data elements in the model so that optimizations do not eliminate those elements from the generated code. On the Modeling tab, click Design > Model Workspace.
In the Model Explorer, on the center pane, select the three rows that
correspond to the variables dispGain
,
intGain
, and rateGain
in the
model workspace.
Right-click one of the rows and click Convert to
parameter object
. The Model Data Editor converts the
workspace variables to Simulink.Parameter
objects.
In the row for the parameter dispGain
, in the
Storage Class column, click
Configure. The model window highlights the row
for the dispGain
parameter in the Code Mappings
editor.
For each variable, in the Storage Class column,
select Model default: Params
, which means
they acquire the default storage class that you specified for
Model parameters.
In the Configuration Parameters dialog box, on the Code
Generation > Code Placement pane,
set File packaging format to
Modular
.
Generate code.
In the Code view, open and inspect the files
rtwdemo_roll_my_data.c
and
rtwdemo_roll_my_data.h
. These files define and
declare global variables that correspond to the parameter objects and
some block states, such as the state of the Integrator
block in the BasicRollMode
subsystem.
/* Storage class 'SigsStates' */ real32_T rtFixPtUnitDelay1_DSTATE; real32_T rtIntegrator_DSTATE; int8_T rtIntegrator_PrevResetState; /* Storage class 'Params' */ real32_T dispGain = 0.75F; real32_T intGain = 0.5F; real32_T rateGain = 2.0F;
You can configure an Embedded Coder Dictionary to refer to code generation
definitions that you store in a package (see Create Code Definitions for External Data Objects). Those
definitions then appear available for selection in the Code Mappings editor. In this
example, you configure the Embedded Coder Dictionary in
rtwdemo_roll
to refer to definitions stored in the built-in
example package ECoderDemos
.
Open the Embedded Coder Dictionary for rtwdemo_roll
.
For instructions, see Create and Verify Storage Class.
In the Embedded Coder Dictionary window, click Manage Packages.
In the Manage Packages dialog box, click Refresh. Wait until more options appear in the Select package drop-down list.
Set Select package to
ECoderDemos
and click
Load.
In the Embedded Coder Dictionary window, on the Storage
Classes tab, the table shows the storage classes defined in
the ECoderDemos
package. Now, in
rtwdemo_roll
, you can select these storage classes in
the Code Mappings editor on the Data Defaults
tab.
To unload the package, in the Manage Packages dialog box, select the package in the Select package drop-down list and click Unload.
For an example that shows how to share code generation definitions between models by using data dictionaries, see Share Embedded Coder Dictionary Definition Between Models.
For an example that shows how to configure default code mappings in a shared Embedded Coder Dictionary, see Configure Default Code Mapping in a Shared Dictionary.
These properties appear in the Property Inspector pane of the Embedded Coder Dictionary window. In the table, some properties appear as columns to facilitate batch editing.
Storage ClassesName
— Name of storage classStorageClass1
(default) | textName of the storage class. The name must be unique among the storage classes in the dictionary.
For lists of built-in and example storage classes that Simulink provides, see Choose Storage Class for Controlling Data Representation in Generated Code.
Description
— Purpose and functionality of storage classCustom text that you can use to describe the purpose and functionality of the storage class.
Source
— Location of storage class definitionThis property is read-only.
The location of the storage class definition.
Built-in
— Provided by Simulink.
Model name — Defined in a Simulink model.
Dictionary name — Defined in a Simulink data dictionary (see What Is a Data Dictionary?).
Package name — Defined in the Simulink package or in a custom package (see Create Storage Classes by Using the Custom Storage Class Designer).
Data Access
— Specification to access the dataDirect
(default) | Function
Specification to access data associated with the model. Access the data
directly (Direct
) or through customizable
get
and set
functions
(Function
). For more information, see Access Data Through Functions by Using Storage Classes in Embedded Coder Dictionary.
Setting this property to
Function
:
Sets Data Scope to
Imported
.
Means that you cannot specify multi-instance properties.
Enables these properties:
Access Mode
Allowed Access
Name of Getter
Name of Setter
Disables the Preserve array
dimensions property. To preserve
dimensions of multidimensional arrays in the
generated code, set Data
Access to
Direct
.
Data Scope
— Specification to generate data definitionExported
(default) | Imported
Specification that the generated code define the data
(Exported
) or import (Imported
)
the data definition from external code. Built-in storage classes and storage
classes in packages such as Simulink can use other scope options, such as
File
.
Setting this property to
Imported
:
Disables Definition File. To include your external source code file in the build process, use model configuration parameters. For an example, see Configure Data Interface.
Means that you cannot set Header
File to $N.h
, though
you can use the $N
token.
To set this property to
Exported
, you must use one of
the tokens $N
or $R
in
the value of Header File.
Header File
— Name of header file that declares data$N.h
(default) | textName of the header file that declares the data, specified as a name or naming rule. A naming rule includes a combination of text and tokens. Valid tokens are listed in this table.
Token | Description |
---|---|
$R | Name of root model |
$N | Name of associated data element |
$G | Name of storage class |
$U | User token text, which you specify for a model as described in Identifier Format Control |
If you set Data Scope to
Exported
, you must use one of
the tokens $R
or $N
in
the value of this property.
If you set Data Scope to
Imported
, you cannot set the
value of this property to $N.h
, but you
can use the $N
token.
Definition File
— Name of source file that defines data$N.c
(default) | textName of the source file that defines the data, specified as a name or naming rule. A naming rule includes a combination of text and tokens. Valid tokens are listed in this table.
Token | Description |
---|---|
$R | Name of root model |
$N | Name of associated data element |
$G | Name of storage class |
$U | User token text, which you specify for a model as described in Identifier Format Control |
Setting Data Scope to
Imported
disables Definition
File. To include your external source code file in the
build process, use model configuration parameters. For an example, see
Configure Data Interface.
Access Mode
— Specification to access data through functionsValue
(default) | Pointer
Specification for the storage class to access data associated with the
model through functions by using Value
or
Pointer
. For more information, see Access Data Through Functions by Using Storage Classes in Embedded Coder Dictionary.
This property is enabled only when you set Data
Access to Function
.
Allowed Access
— Specification to allow access to data through functionsRead/Write
(default) | Read Only
| Write Only
Specification for the storage class to allow read and write
(Read/Write
), read-only (Read
Only
), or write-only (Write Only
) access to the
data.
This property is enabled only when you set Data
Access to Function
.
Name of Getter
— Name of the get
function that fetches the associated dataget_$N$M
(default) | textName of the get
function that fetches the associated
data, specified as a name or naming rule. A naming rule includes a
combination of text and tokens. Valid tokens are listed in this table.
Token | Description |
---|---|
$N | Name of associated data element (required) |
$R | Name of root model |
$M | Mangle text that ensures uniqueness |
$U | User token text. See Identifier Format Control. |
This property is enabled only when you set Data
Access to Function
.
Name of Setter
— Name of the set
function that modifies the associated dataset_$N$M
(default) | textName of the set
function that fetches the modifies
data, specified as a name or naming rule. A naming rule includes a
combination of text and tokens. Valid tokens are listed in this table.
Token | Description |
---|---|
$N | Name of associated data element (required) |
$R | Name of root model |
$M | Mangle text that ensures uniqueness |
$U | User token text. See Identifier Format Control. |
This property is enabled only when you set Data
Access to Function
.
Use different property settings for single-instance and multi-instance data
— Specification to assign separate storage settingsoff
(default) | on
Specification for the storage class to use either the storage settings that you specify in the Single-instance storage section or the storage settings that you specify in the Multi-instance storage section. When you apply the storage class to a data item, the Embedded Coder Dictionary determines if it is a single-instance storage class or a multi-instance storage class by the type of data and by the context of the model within the model reference hierarchy.
Selecting this property enables the sections Single-instance storage and Multi-instance storage. The properties Storage Type, Type Name, and Instance Name appear in both the Single-instance storage and Multi-instance storage sections.
Storage Type
— Specification to aggregate data into a structureUnstructured
(default) | Structured
Specification to aggregate the data that uses the storage class into a
structure in the generated code. Each data element appears in the code as a
field of the structure. To create a structure, use
Structured
.
Setting this property to Structured
enables
Type Name and Instance
Name.
Type Name
— Name of structure type$R$N$G$M
(default) | textName of the structure type in the generated code, specified as a name or a naming rule. A naming rule includes a combination of text and tokens. Valid tokens are listed in this table.
Token | Description |
---|---|
$R | Name of root model |
$N | Base name of associated function, such as
step |
$G | Name of storage class |
$U | User token text, which you specify for a model as described in Identifier Format Control |
$M | Name-mangling text inserted, if necessary, to avoid name collisions |
Setting Storage Type to
Structured
enables this property.
Instance Name
— Name of structure variable$N$G$M
(default) | textName of the structure variable in the generated code, specified as a name or a naming rule. A naming rule includes a combination of text and tokens. Valid tokens are listed in this table.
Token | Description |
---|---|
$R | Name of root model |
$N | Base name of associated function, such as
step |
$G | Name of storage class |
$U | User token text, which you specify for a model as described in Identifier Format Control |
$M | Name-mangling text inserted, if necessary, to avoid name collisions |
Setting Storage Type to
Structured
enables this property.
Data Initialization
— How to initialize dataDynamic
(default) |
Static
|
None
Specification that the generated code initialize the data.
Dynamic
— The generated code initializes
the data as part of the model initialization entry-point
function.
Static
— The generated code initializes the
data in the same statement that defines and allocates memory for
the data. The assignment statement appears at the top of a
.c
or .cpp
source
file, outside of a function.
None
— The generated code does not
initialize the data.
If you select Const, you cannot set this
property to Dynamic
.
Setting this property to Dynamic
disables Const.
Memory Section
— Location in memory to allocate dataNone
(default) | existing memory sectionLocation in memory to allocate data, specified as a memory section that exists in the Embedded Coder Dictionary on the Memory Sections tab. For information about memory sections, see Control Data and Function Placement in Memory by Inserting Pragmas.
Preserve array dimensions
— Specification to preserve dimensions of multidimensional arraysoff
(default) | on
Specification for the storage class to preserve dimensions of multidimensional arrays in the generated code. For more information, see Preserve Dimensions of Multidimensional Arrays in Generated Code.
Const
— Specification to apply const
qualifieroff
(default) | on
Specification to apply the const
qualifier to the
data.
If you select this property, you cannot set Data
Initialization to
Dynamic
.
Setting Data Initialization to
Dynamic
disables this
property.
Volatile
— Specification to apply volatile
qualifieroff
(default) | on
Specification to apply the volatile
qualifier to the
data.
Other Qualifier
— Specification to apply a custom qualifierSpecification to apply a custom qualifier to the data. For example, some
memory architectures support qualifiers far
and
huge
.
Do not use this property to apply the keyword static
.
Instead, use the built-in storage class FileScope
, which
you cannot apply with the Code Mappings editor. See Choose Storage Class for Controlling Data Representation in Generated Code.
Parameters
— Whether to allow usage with model parametersoff
(default) | on
Specification indicating whether to allow usage of the storage class with model parameters.
Setting Data Initialization to
Static
enables this
property.
Setting Data Initialization to
Dynamic
disables this
property.
To set the value of this property, set Data
Initialization to
None
.
Signals
— Whether to allow usage with model signalson
(default) | off
Specification indicating whether to allow usage of the storage class with model signals.
Setting Data Initialization to
Dynamic
enables this
property.
Setting Data Initialization to
Static
disables this
property.
To set the value of this property, set Data
Initialization to
None
.
Name
— Name of function templateFunctionTemplate1
(default) | textName of the template. The name must be unique among the function templates in the dictionary. Embedded Coder provides the built-in templates listed in this table.
Template | Description |
---|---|
ModelFunction | In the Code Mappings editor, use for entry-point functions for initialization, execution, termination, and reset (see Configure Default Code Generation for Functions) |
UtilityFunction | In the Code Mappings editor, use for shared utility functions (see Configure Default Code Generation for Functions) |
Description
— Purpose and functionality of function templateCustom text that you can use to describe the purpose and functionality of the function template.
Source
— Location of function template definitionThis property is read-only.
The location of the function template definition.
Model name — Defined in a Simulink model.
Dictionary name — Defined in a Simulink data dictionary (see What Is a Data Dictionary?).
Function Name
— Names of generated functions$R$N
(default) | textNames of the functions in the generated code, specified as a naming rule. A naming rule includes a combination of text and tokens. Valid tokens are listed in this table.
Token | Description |
---|---|
$R | Name of root model |
$N | Base name of associated function, such as
step |
$U | User token text, which you specify for a model as described in Identifier Format Control |
$C | For shared utility functions, a checksum inserted to avoid name collisions |
$M | Name-mangling text inserted, if necessary, to avoid name collisions |
Memory Section
— Location in memory to allocate functionNone
(default) | existing memory sectionLocation in memory to allocate function, specified as a memory section that exists in the Embedded Coder Dictionary on the Memory Sections tab. For information about memory sections, see Control Data and Function Placement in Memory by Inserting Pragmas.
Name
— Name of memory sectionName of the memory section. The name must be unique among the memory sections in the dictionary. Embedded Coder provides the built-in memory sections listed in this table.
Memory Section | Description |
---|---|
MemConst | Apply the storage type qualifier const
to the data. |
MemVolatile | Apply the storage type qualifier
volatile to the data. |
MemConstVolatile | Apply the storage type qualifiers
const and volatile
to the data. |
Description
— Purpose and functionality of memory sectionCustom text that you can use to describe the purpose and functionality of the memory section.
Source
— Location of memory section definitionThis property is read-only.
The location of the memory section definition.
Model name — Defined in a Simulink model.
Dictionary name — Defined in a Simulink data dictionary (see What Is a Data Dictionary?).
Package name — Defined in the Simulink package or in a custom package (see Create Code Definitions for External Data Objects).
Comment
— Comment to insert in the generated codeCode comment that the code generator includes with the pragmas or other decorations that you specify with Pre Statement and Post Statement.
Pre Statement
— Code to insert before data or function codeCode, such as pragmas, to insert before the definitions and declarations of the data or functions that are in the memory section.
You can use the token $R
to represent the name of the
model that uses the memory section.
When you set Statements Surround to Each
variable
, you can use the token $N
to
represent the name of each variable or function that uses the memory
section.
Post Statement
— Code to insert after data or function codeCode, such as pragmas, to insert after the definitions and declarations of the data or functions that are in the memory section.
You can use the token $R
to represent the name of the
model that uses the memory section.
When you set Statements Surround to Each
variable
, you can use the token $N
to
represent the name of each variable or function that uses the memory
section.
Statements Surround
— Specification to wrap data and functions separately or in a groupEach variable
(default) | Group of variables
Specification to insert code statements (Pre Statement and Post Statement):
Around each variable and function that uses the memory
section. Select Each variable
.
Once, around the entire memory section. The generated code
aggregates the variable and function definitions into a
contiguous code block and surrounds the block with the
statements. Select Group of
variables
.
A storage class or function customization template that you create in an Embedded Coder Dictionary cannot use a memory section that you load from a package (as described in Refer to Code Generation Definitions in a Package). Use a memory section defined in the Embedded Coder Dictionary.
You cannot create code generation definitions in a .mdl
model file.
For additional limitations for code generation definitions in the Embedded
Coder Dictionary of a data dictionary (.sldd
file), see
Deploy Code Generation Definitions.