DWork vectors are blocks of memory that an S-function asks the Simulink® engine to allocate to each instance of the S-function in a model. If multiple instances of your S-function can occur in a model, your S-function must use DWork vectors instead of global or static memory to store instance-specific values of S-function variables. Otherwise, your S-function runs the risk of one instance overwriting data needed by another instance, causing a simulation to fail or produce incorrect results. The ability to keep track of multiple instances of an S-function is called reentrancy.
You can create an S-function that is reentrant by using DWork vectors that the engine manages for each particular instance of the S-function.
DWork vectors have several advantages:
Provide instance-specific storage for block variables
Support floating-point, integer, pointer, and general data types
Eliminate static and global variables
Interact directly with the Simulink engine to perform memory allocation, initialization, and deallocation
Facilitate inlining the S-function during code generation
Provide more control over how data appears in the generated code
DWork vectors are the most generalized and versatile type of work vector and the following sections focus on their use. The Simulink product provides additional elementary types of work vectors that support floating-point, integer, pointer, and mode data. You can find a discussion of these work vectors in Elementary Work Vectors.
DWork vectors provide the most flexibility for setting data types, names, etc., of the data in the simulation and during code generation. The following list describes all the properties that you can set on a DWork vector:
Numeric type, either real or complex
Usage type (see Types of DWork Vectors)
Simulink Coder™ identifier
Simulink Coder storage class
Simulink Coder C type qualifier
See How to Use DWork Vectors for instructions on how to set these properties. The three Simulink Coder properties pertain only to code generation and have no effect during simulation.
A key advantage of DWork vectors is their connection to the Simulink engine. Over the course of the simulation, the engine relieves the S-function of all memory management tasks related to DWork vectors.
To see how this connection is useful, consider an S-function that uses a global variable to store data. If more than one copy of the S-function exists in a model, each instance of the S-function must carefully allocate, manipulate, and deallocate each piece of memory it uses.
In an S-function that uses DWork vectors, the engine, not the S-function, manages the memory for the DWork vector. At the start of a simulation, the engine allocates the memory required for each instance of the S-function based on the size and the data type of the DWork vector contents. At the end of the simulation, the engine automatically deallocates the memory.
You have no control over how the engine allocates memory for DWork vectors
during simulation. When using the Simulink
Coder software, you can use storage classes to customize the memory
allocation during code generation. See the
reference page for more information on using storage classes.
The engine also performs special tasks based on the type of DWork vector used in the S-function. For example, it includes DWork vectors that store discrete state information in the model-wide state vector and makes them available during state logging.
DWork vectors allow you to customize how data appears in the generated code. When
code is generated, the Simulink
Coder code generator includes the DWork vector in the data structure for the
model. The DWork vector controls the field name used in the structure. DWork vectors
also control the storage class and C type qualifier used in the generated code. See
sfun_rtwdwork.c for an example.