Embedded MATLAB User's Guide

advertisement
Embedded MATLAB™
User’s Guide
How to Contact The MathWorks
Web
Newsgroup
www.mathworks.com/contact_TS.html Technical Support
www.mathworks.com
comp.soft-sys.matlab
suggest@mathworks.com
bugs@mathworks.com
doc@mathworks.com
service@mathworks.com
info@mathworks.com
Product enhancement suggestions
Bug reports
Documentation error reports
Order status, license renewals, passcodes
Sales, pricing, and general information
508-647-7000 (Phone)
508-647-7001 (Fax)
The MathWorks, Inc.
3 Apple Hill Drive
Natick, MA 01760-2098
For contact information about worldwide offices, see the MathWorks Web site.
Embedded MATLAB™ User’s Guide
© COPYRIGHT 2007 by The MathWorks, Inc.
The software described in this document is furnished under a license agreement. The software may be used
or copied only under the terms of the license agreement. No part of this manual may be photocopied or
reproduced in any form without prior written consent from The MathWorks, Inc.
FEDERAL ACQUISITION: This provision applies to all acquisitions of the Program and Documentation
by, for, or through the federal government of the United States. By accepting delivery of the Program or
Documentation, the government hereby agrees that this software or documentation qualifies as commercial
computer software or commercial computer software documentation as such terms are used or defined
in FAR 12.212, DFARS Part 227.72, and DFARS 252.227-7014. Accordingly, the terms and conditions of
this Agreement and only those rights specified in this Agreement, shall pertain to and govern the use,
modification, reproduction, release, performance, display, and disclosure of the Program and Documentation
by the federal government (or other entity acquiring for or through the federal government) and shall
supersede any conflicting contractual terms or conditions. If this License fails to meet the government’s
needs or is inconsistent in any respect with federal procurement law, the government agrees to return the
Program and Documentation, unused, to The MathWorks, Inc.
Trademarks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology,
SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The
MathWorks, the L-shaped membrane logo, Embedded MATLAB, and PolySpace are
trademarks of The MathWorks, Inc.
Other product or brand names are trademarks or registered trademarks of their respective
holders.
Patents
The MathWorks products are protected by one or more U.S. patents. Please see
www.mathworks.com/patents for more information.
Revision History
March 2007
Online only
September 2007 Online only
New for Release 2007a
Updated for Release 2007b
Contents
Working with Embedded MATLAB
1
What Is Embedded MATLAB? . . . . . . . . . . . . . . . . . . . . . . .
A Subset of MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Embedded MATLAB Inference Engine . . . . . . . . . . . . . . . .
Supported MATLAB Features . . . . . . . . . . . . . . . . . . . . . . .
Unsupported MATLAB Features . . . . . . . . . . . . . . . . . . . . .
1-2
1-2
1-2
1-2
1-3
Using Embedded MATLAB with MathWorks
Products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1-5
Embedded MATLAB Coding Style . . . . . . . . . . . . . . . . . . .
Writing Reusable Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Working with Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Matrix Indexing Operations . . . . . . . . . . . . . . . . . . .
Working with Complex Numbers . . . . . . . . . . . . . . . . . . . . .
Working with Characters . . . . . . . . . . . . . . . . . . . . . . . . . . .
1-7
1-7
1-7
1-11
1-12
1-15
Supported Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Control Flow Statements . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arithmetic Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Relational Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Logical Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1-16
1-16
1-17
1-17
1-18
Embedded MATLAB Function Library Reference . . . . .
About Embedded MATLAB Library Functions . . . . . . . . . .
Embedded MATLAB Function Library — Alphabetical
List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Embedded MATLAB Function Library — Categorical
List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1-20
1-20
Calling Functions in Embedded MATLAB . . . . . . . . . . . .
How Embedded MATLAB Resolves Function Calls . . . . . .
How Embedded MATLAB Resolves File Types on the
Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1-62
1-62
1-20
1-42
1-65
v
Adding the Compilation Directive %#eml . . . . . . . . . . . . . .
Calling Subfunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Calling Embedded MATLAB Library Functions . . . . . . . . .
Calling MATLAB Functions . . . . . . . . . . . . . . . . . . . . . . . . .
Limit on Function Arguments . . . . . . . . . . . . . . . . . . . . . . .
1-67
1-69
1-70
1-71
1-78
Using Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Embedded MATLAB Structures . . . . . . . . . . . . . . . .
Elements of Embedded MATLAB Structures . . . . . . . . . . .
Types of Embedded MATLAB Structures . . . . . . . . . . . . . .
Defining Local Structure Variables . . . . . . . . . . . . . . . . . . .
Defining Outputs as Structures . . . . . . . . . . . . . . . . . . . . . .
Making Structures Persistent . . . . . . . . . . . . . . . . . . . . . . .
Indexing SubStructures and Fields . . . . . . . . . . . . . . . . . . .
Assigning Values to Structures and Fields . . . . . . . . . . . . .
Limitations with Structures . . . . . . . . . . . . . . . . . . . . . . . . .
1-79
1-79
1-79
1-80
1-81
1-84
1-85
1-85
1-86
1-86
Using Function Handles . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Function Handles . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Example: Defining and Passing Function Handles in an
Embedded MATLAB Function . . . . . . . . . . . . . . . . . . . . .
Limitations with Function Handles . . . . . . . . . . . . . . . . . . .
1-91
1-91
Using M-Lint with Embedded MATLAB . . . . . . . . . . . . . .
1-96
1-92
1-94
Working with Embedded MATLAB MEX
2
vi
Contents
About Embedded MATLAB MEX . . . . . . . . . . . . . . . . . . . .
Optimizes M-Code for Run-Time Efficiency . . . . . . . . . . . .
Running a Demo for Embedded MATLAB MEX . . . . . . . . .
How Embedded MATLAB MEX Resolves Function Calls . .
2-2
2-2
2-3
2-3
Workflow for Converting M-Code to a C-MEX
Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2-4
Installing Embedded MATLAB MEX . . . . . . . . . . . . . . . . .
2-5
Setting Up the C Compiler . . . . . . . . . . . . . . . . . . . . . . . . . .
2-6
Setting Up File Infrastructure and Paths . . . . . . . . . . . .
Compile Path Search Order . . . . . . . . . . . . . . . . . . . . . . . . .
Can I Add Files to the Embedded MATLAB Path? . . . . . . .
When to Use the Embedded MATLAB Path . . . . . . . . . . . .
Adding Directories to Search Paths . . . . . . . . . . . . . . . . . . .
Naming Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2-7
2-7
2-7
2-7
2-8
2-8
Making M-Code Compliant with Embedded MATLAB
................................................
Debugging Strategies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Detecting Embedded MATLAB Syntax Violations at
Compile Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2-10
2-10
2-12
Specifying Properties of Primary Function Inputs . . . .
Why You Must Specify Input Properties . . . . . . . . . . . . . . .
Properties to Specify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rules for Specifying Properties of Primary Inputs . . . . . . .
Methods for Defining Properties of Primary Inputs . . . . . .
Defining Input Properties by Example at the Command
Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Defining Input Properties Programmatically in the
M-File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2-13
2-13
2-13
2-15
2-16
Compiling Your M-File . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Embedded MATLAB MEX . . . . . . . . . . . . . . . . . .
Generated Files and Locations . . . . . . . . . . . . . . . . . . . . . . .
2-29
2-29
2-29
Working with Compilation Reports . . . . . . . . . . . . . . . . . .
About Compilation Reports . . . . . . . . . . . . . . . . . . . . . . . . .
Location of Compilation Reports . . . . . . . . . . . . . . . . . . . . .
Description of Compilation Reports . . . . . . . . . . . . . . . . . . .
2-31
2-31
2-31
2-31
2-17
2-19
Calling C Functions from Embedded MATLAB
3
The eml C Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3-2
vii
What Is the eml C Interface? . . . . . . . . . . . . . . . . . . . . . . . .
Calling External C Functions . . . . . . . . . . . . . . . . . . . . . . . .
Passing Arguments by Reference to External C
Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Declaring Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3-2
3-2
Calling External C Functions . . . . . . . . . . . . . . . . . . . . . . .
Workflow for Calling External C Functions . . . . . . . . . . . .
eml Custom C Interface Best Practices . . . . . . . . . . . . . . . .
3-5
3-5
3-6
Including Custom C Functions in Generated Code . . . .
Including C Functions in Simulation Targets . . . . . . . . . . .
Including C Functions in Real-Time Workshop Targets . . .
3-7
3-7
3-10
Code Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Returning Multiple Values from C Functions . . . . . . . . . . .
Calling an External C Sort Function . . . . . . . . . . . . . . . . . .
3-11
3-11
3-12
How Embedded MATLAB Infers C Data Types . . . . . . . .
Mapping MATLAB Types to C . . . . . . . . . . . . . . . . . . . . . . .
Mapping embedded.numerictypes to C . . . . . . . . . . . . . . . .
Mapping Arrays to C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mapping Complex Values to C . . . . . . . . . . . . . . . . . . . . . . .
Mapping Structures to C Structures . . . . . . . . . . . . . . . . . .
Mapping Strings to C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3-15
3-15
3-16
3-17
3-17
3-18
3-18
3-3
3-4
Functions — Alphabetical List
4
Index
viii
Contents
1
Working with Embedded
MATLAB
What Is Embedded MATLAB?
(p. 1-2)
Describes the Embedded MATLAB™
subset of the MATLAB® language
Using Embedded MATLAB with
MathWorks Products (p. 1-5)
Describes how to use Embedded
MATLAB with Simulink®,
Stateflow®, and Fixed-Point
Toolbox
Embedded MATLAB Coding Style
(p. 1-7)
Describes best practices for writing
Embedded MATLAB code
Supported Operators (p. 1-16)
Lists operators supported by
Embedded MATLAB functions
Embedded MATLAB Function
Library Reference (p. 1-20)
Lists library functions that you
can call in an Embedded MATLAB
function
Calling Functions in Embedded
MATLAB (p. 1-62)
Presents rules for calling functions
in Embedded MATLAB and using
their return values
Using Structures (p. 1-79)
Explains how to define and use
structures in Embedded MATLAB
Using Function Handles (p. 1-91)
Describes how to use function
handles in Embedded MATLAB
Using M-Lint with Embedded
MATLAB (p. 1-96)
Explains how Embedded MATLAB
automatically checks code with
M-Lint
1
Working with Embedded MATLAB
What Is Embedded MATLAB?
In this section...
“A Subset of MATLAB” on page 1-2
“Embedded MATLAB Inference Engine” on page 1-2
“Supported MATLAB Features” on page 1-2
“Unsupported MATLAB Features” on page 1-3
A Subset of MATLAB
Embedded MATLAB is a subset of the MATLAB language that supports
efficient code generation for deployment in embedded systems and
acceleration of fixed-point algorithms.
Embedded MATLAB Inference Engine
Embedded MATLAB uses an inference engine to enforce language constraints
for simulation and code generation. Embedded MATLAB works with
Real-Time Workshop to convert code from a dynamically typed language
(MATLAB) to a statically typed language (C), without using dynamic memory
allocation. To convert data types accurately, the Embedded MATLAB
inference engine requires that you define the class, size, and complexity of
data in the source code so it can assign data types correctly at compile time.
Supported MATLAB Features
Embedded MATLAB supports the following MATLAB features:
• N-dimensional arrays
• Matrix operations
• Subscripting (see “Using Matrix Indexing Operations” on page 1-11)
• Complex numbers (see “Working with Complex Numbers” on page 1-12)
• Numeric classes (see “Supported Variable Types” on page 1-8)
• Double-precision, single-precision, and integer math
1-2
What Is Embedded MATLAB?
• Fixed-point arithmetic (see “Working with the Fixed-Point Embedded
MATLAB™ Subset” in the Fixed-Point Toolbox documentation)
• if, switch, while, and for statements
• Subfunctions (see “Calling Functions in Embedded MATLAB” on page 1-62)
• Persistent variables (see “Declaring Persistent Variables” on page 1-10)
• Structures (see “Using Structures” on page 1-79)
• Characters (see “Working with Characters” on page 1-15)
• Function handles (see “Using Function Handles” on page 1-91)
• Frames (see “Working with Frame-Based Signals” in the Simulink
documentation.
• Subset of MATLAB functions (see “Embedded MATLAB Function Library
Reference” on page 1-20)
• Ability to call MATLAB functions (see “How Embedded MATLAB Resolves
Function Calls” on page 1-62)
Unsupported MATLAB Features
Embedded MATLAB does not support the following MATLAB features:
• Cell arrays
• Command/function duality
Note Embedded MATLAB supports function-style syntax — but not
command-style syntax — for function calls. MATLAB supports both
styles (see “MATLAB Calling Syntax” in the MATLAB Programming
documentation).
• Dynamic variables
Note You cannot use variables that change size.
1-3
1
Working with Embedded MATLAB
• Global variables
• Java
• Matrix deletion
• Nested functions
• Objects
• Sparse matrices
• Try/catch statements
1-4
Using Embedded MATLAB with MathWorks Products
Using Embedded MATLAB with MathWorks Products
Embedded MATLAB works with the following products:
Product
Interface with
Embedded MATLAB
Details
Simulink
Provides
See:
• The front-end
for writing
and simulating
Embedded MATLAB
Function blocks and
Truth Table blocks in
Simulink models
• “Using the
Embedded MATLAB
Function Block”
in the Simulink
documentation
• Embedded MATLAB
MEX as the back
end for generating
C-MEX functions
from M-code that
complies with
Embedded MATLAB
• “Building a
Simulink Model
with a Stateflow
Truth Table” in
the Stateflow
documentation
• Chapter 2, “Working
with Embedded
MATLAB MEX”
Stateflow
Provides the front-end
for writing and
simulating Embedded
MATLAB functions in
Stateflow charts.
See “Using Embedded
MATLAB Functions”
and “Truth Table
Functions” in
the Stateflow
documentation.
Real-Time Workshop
Provides the back
end for generating
embeddable C code from
Embedded MATLAB
functions in Simulink
and Stateflow.
See Embedded
MATLAB Function in
the Simulink Reference.
1-5
1
1-6
Working with Embedded MATLAB
Product
Interface with
Embedded MATLAB
Details
Fixed-Point Toolbox
Allows you to use
Embedded MATLAB
MEX to accelerate
fixed-point algorithms
in M-code.
See “Working with the
Fixed-Point Embedded
MATLAB™ Subset” in
the Fixed-Point Toolbox
documentation.
SimEvents®
Provides the front-end
for writing and
simulating Embedded
MATLAB functions
that manipulate data
associated with entities.
See “Writing Functions
to Manipulate
Attributes”
Embedded MATLAB Coding Style
Embedded MATLAB Coding Style
In this section...
“Writing Reusable Code” on page 1-7
“Working with Variables” on page 1-7
“Using Matrix Indexing Operations” on page 1-11
“Working with Complex Numbers” on page 1-12
“Working with Characters” on page 1-15
Writing Reusable Code
With Embedded MATLAB, you can write reusable functions using standard
MATLAB function file names which you can call from different locations, for
example, in a Simulink model or M-function library. Embedded MATLAB can
compile external functions on the MATLAB path and integrate them into
generated C code for embedded targets. Embedded MATLAB can generate
code for external M-functions that are compliant with Embedded MATLAB
syntax and semantics. See “How Embedded MATLAB Resolves Function
Calls” on page 1-62.
Common applications include:
• Overriding an Embedded MATLAB library function with a custom
implementation
• Implementing a reusable library on top of standard library functions that
can be used with Simulink
• Swapping between different implementations of the same function
Working with Variables
• “Rules for Defining Variables” on page 1-8
• “Supported Variable Types” on page 1-8
• “Local Variables” on page 1-8
• “Declaring Persistent Variables” on page 1-10
1-7
1
Working with Embedded MATLAB
• “Initializing Persistent Variables” on page 1-10
Rules for Defining Variables
In Embedded MATLAB, you must explicitly and unambiguously define
variables before using them in operations or returning them as outputs. You
define variables using assignment statements. You can assign values to
variables that are scalars, matrices, or structures.
Supported Variable Types
Embedded MATLAB functions support a subset of MATLAB data types
represented by the following functions:
Type/Function
Description
char
Character array (string)
complex
Complex data. Cast function takes real and imaginary
components
double
Double-precision floating point
int8, int16, int32
Signed integer
logical
Boolean true or false
single
Single-precision floating point
struct
Structure (see “Using Structures” on page 1-79)
uint8, uint16,
uint32
Unsigned integer
Embedded MATLAB also supports fixed-point data, as described in “Working
with the Fixed-Point Embedded MATLAB™ Subset” in the Fixed-Point
Toolbox User’s Guide documentation.
Local Variables
In Embedded MATLAB, you define local variables implicitly in the function
code, but you declare function arguments in the Model Explorer. This topic
describes how to work with local variables in Embedded MATLAB and
explains any exceptions or deviations from MATLAB behavior:
1-8
Embedded MATLAB Coding Style
Creating Local Variables By Assignment. As in MATLAB, you create
variables in Embedded MATLAB by assignment. Unlike MATLAB, you
cannot change the size, type, or complexity of the variable after the
initial assignment. Therefore, you must set these properties as part of the
assignment.
For example, the following initial assignments create variables in an
Embedded MATLAB function:
...
% a is a scalar of type double.
a = 14.7;
% b has properties of a, scalar of type double.
b = a;
% c is a 5-by-2 double array of zeros.
c = zeros(5,2);
% d has properties of c (5-by-2 double array of zeros).
d = c;
% e is 5-by-2 array of type double.
e = [1 2 3 4 5; 6 7 8 9 0];
...
The following rules apply when you create variables implicitly in the body
of an Embedded MATLAB function:
• By default, variables are local; they do not persist between function calls.
To make variables persistent, see “Declaring Persistent Variables” on page
1-10.
• Unlike in MATLAB, you cannot set the size of a variable with indexing in
an assignment statement.
For example, the following initial assignment is not allowed in Embedded
MATLAB functions:
g(3,2) = 14.6; % Not allowed for creating g
% OK for assigning value once created
1-9
1
Working with Embedded MATLAB
• You can use typecast functions in assignment statements.
In the following example code, you declare y and z to be integers with these
initial assignments:
x = 15; % Because constants are of type double, so is x.
y = int16(3); % y is a constant of type int16.
z = uint8(x); % z has the value of x, but cast to uint8.
• Unlike in MATLAB, you cannot change the size, type, or complexity of
variables after the initial assignment.
In the following example, the last two statements each flag an error:
x
y
x
y
=
=
=
=
2.75 % OK
[1 2; 3 4] % OK
int16(x); % ERROR: cannot recast x
[1 2 3; 4 5 6] %ERROR: cannot resize y
Declaring Persistent Variables
Persistent variables are local to the function in which they are declared,
but they retain their values in memory between calls to the function. To
declare persistent variables in your Embedded MATLAB function, use the
persistent statement, as in this example:
persistent PROD_X;
The declaration should appear at the top of the function body, after the header
and comments, but before the first use of the variable.
Initializing Persistent Variables
You initialize persistent variables in Embedded MATLAB functions the same
way as in MATLAB (see Persistent Variables in the MATLAB Programming
documentation). When you declare a persistent variable, Embedded MATLAB
initializes its value to an empty matrix. After the declaration statement,
you can assign your own value to it using the isempty statement, as in this
example:
function findProduct(inputvalue)
1-10
Embedded MATLAB Coding Style
persistent PROD_X
if isempty(PROD_X)
PROD_X = 1;
end
PROD_X = PROD_X * inputvalue;
Using Matrix Indexing Operations
Embedded MATLAB supports matrix indexing operations for a matrix M with
limitations for the following types of expressions:
• M(i:j) where i and j change in a loop
Embedded MATLAB never dynamically allocates memory for the size of
the expressions that change as the program executes. To implement this
behavior, use for loops as shown in the following example:
M = ones(10,10);
for i=1:10
for j = i:10
M(i,j) = 2 * M(i,j);
end
end
Note The matrix M must be defined for entering the loop, as shown in
the highlighted code.
• M(i:i+k) where i is unknown but k is known
In this case, since i — and therefore i+k — are not known, memory cannot
be allocated for the numerical result. However, memory can be allocated for
the following workaround:
M(i + (0:k))
In this case, an unknown scalar value i is added to each element of the
known index vector 0...k. This means that memory for k+1 elements
of M is allocated.
1-11
1
Working with Embedded MATLAB
• Initialization of the following style:
for i = 1:10
M(i) = 5;
end
In this case, the size of M changes as the loop is executed.
Working with Complex Numbers
Embedded MATLAB supports complex numbers and operations
• “Creating Local Complex Variables By Assignment” on page 1-12
• “Semantic Rules for Complex Numbers” on page 1-14
Creating Local Complex Variables By Assignment
As in MATLAB, you create complex variables in Embedded MATLAB by
assignment. Unlike MATLAB, you must set complexity at the time of
assignment, either by assigning a complex constant to the variable or using
the complex function, as in these examples:
x = 5 + 6i; % x is a complex number by assignment.
y = 7 + 8j; % y is a complex number by assignment.
x = complex(5,6); % x is the complex number 5 + 6i.
Use the following rules to specify and use complex variables in Embedded
MATLAB functions:
• Complex numbers obey the Embedded MATLAB rule that once you set the
type and size of a variable, you cannot cast it to another type or size.
In the following example, the variable x is declared complex and stays
complex:
x = 1 + 2i; % x is declared a complex variable.
y = int16(x); % Real and imaginary parts of y are int16.
x = 3; % x now has the value 3 + 0i.
Conflicts can occur from operations with real operands that can have
complex results. For example, the following code generates an error:
1-12
Embedded MATLAB Coding Style
z = 3; % Sets type of z to double (real)
z = 3 + 2i; % ERROR: cannot recast z to complex
The following is a possible workaround that you can use if you know that a
variable can be assigned a complex number:
m = complex(3); % Sets m to complex variable of value 3 + 0i
m = 5 + 6.7i; % Assigns a complex result to a complex number
• Cases in which a function can return a complex number for a real argument
are handled individually for each function.
Generally, this can result in a complex result or a warning that the function
takes only arguments producing real results. For example, for negative
arguments, the function sqrt warns that only real positive or complex
arguments are allowed.
• In general, if an expression has a complex number or variable in it, its
result is a complex number, even if the result is 0.
For example, the following code produces the complex result z:
x = 2 + 3i;
y = 2 - 3i;
z = x + y; % z is 4 + 0i.
In MATLAB, this code generates the real result z = 0. However, in
Embedded MATLAB, when code for z = x + y is generated, the types for x
and y are known, but their values are not. Because either or both operands
in this expression are complex, z is declared a complex variable requiring
storage for both a real and an imaginary part. This means that z has the
complex result 4 + 0i in Embedded MATLAB, not 4 as in MATLAB.
An exception to the preceding rule is a function call that takes complex
arguments but produces real results, as shown in the following examples:
y = real(x); % y is the real part of the complex number x.
y = imag(x); % y is the real-valued imaginary part of x.
y = isreal(x); % y is false (0) for a complex number x.
1-13
1
Working with Embedded MATLAB
Another exception is a function call that takes real arguments but produces
complex results, as shown in the following example:
z = complex(x,y); % z is a complex number for a real x and y.
Semantic Rules for Complex Numbers
with the following exceptions:
• The first use of a variable that is later assigned a complex result must also
be complex. For example,
X = 3;
.
.
.
X = 4 + 5i;
fails because X is not defined as a complex variable by its first assignment.
However,
X = 3 + 0i;
.
.
.
X = 4 + 5i;
succeeds because X is defined as a complex variable in its first assignment.
• Even if the imaginary part is zero, if the result might be complex,
Embedded MATLAB will treat it as complex. For example, although
X = ifft(fft(Y));
yields a real answer, Embedded MATLAB assumes that the function ifft
might return a complex result. The workaround is to use the real function:
X = real(ifft(fft(Y)));
1-14
Embedded MATLAB Coding Style
Working with Characters
Embedded MATLAB represents characters in 8 bits and, therefore, does not
support the complete set of Unicode characters. Because many mathematical
operations require more than 8 bits of precision, it is recommended that you
do not perform arithmetic with Embedded MATLAB characters.
1-15
1
Working with Embedded MATLAB
Supported Operators
In this section...
“Control Flow Statements” on page 1-16
“Arithmetic Operators” on page 1-17
“Relational Operators” on page 1-17
“Logical Operators” on page 1-18
Control Flow Statements
Embedded MATLAB functions support the following MATLAB program
statements:
Statement
Description
break
break statement
continue
continue statement
for
for statement
if
if statement
The conditions of an if statement cannot use & and |
operators. In their place, use the && and || operators,
respectively. To logically collapse vectors into scalars, use
the function all.
return
return statement
switch
switch statement
The behavior matches the MATLAB switch statement,
which executes only the first matching case.
while
while statement
The conditions of while statements cannot use & and |
operators. In their place, use the && and || operators,
respectively. To logically collapse vectors into scalars, use
the function all.
1-16
Supported Operators
Arithmetic Operators
Embedded MATLAB functions support the following MATLAB arithmetic
operations:
Operator
Description
+
Addition
-
Subtraction
*
Multiplication
.*
Array multiplication
/
Slash or matrix right division
./
Array right division
\
Backslash or matrix left division
.\
Array left division
^
Matrix power
.^
Array power
[]
Concatenation of matrices
'
Complex conjugate transpose
.'
Transpose
(r, c)
Matrix indexing, where r and c are vectors of row and
column indices, respectively
See Arithmetic Operators + - * / \ ^ ’ in the MATLAB Function Reference
documentation for detailed descriptions of each operator.
Relational Operators
Embedded MATLAB functions support the following element-wise relational
operators:
1-17
1
Working with Embedded MATLAB
Operation
Description
<
Less than
<=
Less than or equal to
>=
Greater than or equal to
>
Greater than
==
Equal
~=
Not equal
See Relational Operators < > <= >= == ~= in the MATLAB Function Reference
documentation for detailed descriptions of each operator.
Logical Operators
Embedded MATLAB functions support the following element-wise logical
operators:
Operation Description
&
Logical AND
This & operator is limited to use outside if and while
statement conditions. In its place, use the && operator. To
logically collapse vectors into scalars, use the function all.
|
Logical OR
This | operator is limited to use outside if and while
statements. In its place, use the || operator. To logically
collapse vectors into scalars, use the function all.
1-18
-
Element complement
xor
Logical exclusive-OR
&&
Logical AND (short-circuiting)
||
Logical OR (short-circuiting)
Supported Operators
See Logical Operators: Element-wise & | ~ and Logical Operators:
Short-circuit && || in the MATLAB Function Reference documentation for
detailed descriptions of each operator.
1-19
1
Working with Embedded MATLAB
Embedded MATLAB Function Library Reference
In this section...
“About Embedded MATLAB Library Functions” on page 1-20
“Embedded MATLAB Function Library — Alphabetical List” on page 1-20
“Embedded MATLAB Function Library — Categorical List” on page 1-42
About Embedded MATLAB Library Functions
Each Embedded MATLAB library function has the same name, arguments,
and functionality as its MATLAB, Fixed-Point Toolbox, or Signal Processing
Toolbox counterpart. However, Embedded MATLAB library functions
come with limitations that allow Embedded MATLAB to generate efficient
embeddable code. By using this set of functions when programming
in Embedded MATLAB, you can generate code for building a portable,
standalone, executable target.
Note For more information on fixed-point support in Embedded MATLAB,
refer to “Working with the Fixed-Point Embedded MATLAB™ Subset” in the
Fixed-Point Toolbox documentation.
Embedded MATLAB Function Library — Alphabetical
List
This topic lists the MATLAB functions supported by Embedded MATLAB
in alphabetical order. See also “Embedded MATLAB Function Library —
Categorical List” on page 1-42.
1-20
Function
Product
Remarks/Limitations
abs
MATLAB
—
abs
Fixed-Point
Toolbox
—
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
acos
MATLAB
• Generates an error during simulation and
returns NaN for Real-Time Workshop targets
when the input value x is real, but the output
should be complex. To get the complex result,
make the input value complex by passing in
complex(x).
acosd
MATLAB
—
acosh
MATLAB
• Generates an error during simulation and
returns NaN for Real-Time Workshop targets
when the input value x is real, but the output
should be complex. To get the complex result,
make the input value complex by passing in
complex(x).
acot
MATLAB
—
acotd
MATLAB
—
acoth
MATLAB
—
acsc
MATLAB
—
acscd
MATLAB
—
acsch
MATLAB
—
all
MATLAB
—
all
Fixed-Point
Toolbox
—
and
MATLAB
—
angle
MATLAB
—
any
MATLAB
—
any
Fixed-Point
Toolbox
—
asec
MATLAB
—
asecd
MATLAB
—
asech
MATLAB
—
1-21
1
1-22
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
asin
MATLAB
• Generates an error during simulation and
returns NaN for Real-Time Workshop targets
when the input value x is real, but the output
should be complex. To get the complex result,
make the input value complex by passing in
complex(x).
asind
MATLAB
—
asinh
MATLAB
—
atan
MATLAB
—
atan2
MATLAB
—
atand
MATLAB
—
atanh
MATLAB
• Generates an error during simulation and
returns NaN for Real-Time Workshop targets
when the input value x is real, but the output
should be complex. To get the complex result,
make the input value complex by passing in
complex(x).
beta
MATLAB
—
betainc
MATLAB
—
betaln
MATLAB
—
bitand
MATLAB
• Does not support floating-point inputs. The
arguments must belong to an integer class.
bitand
Fixed-Point
Toolbox
—
bitandreduce
Fixed-Point
Toolbox
—
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
bitcmp
MATLAB
• Does not support floating-point input for the
first argument. The first argument must belong
to an integer class.
bitcmp
Fixed-Point
Toolbox
—
bitconcat
Fixed-Point
Toolbox
—
bitget
MATLAB
—
bitget
Fixed-Point
Toolbox
—
bitor
MATLAB
• Does not support floating-point inputs. The
arguments must belong to an integer class.
bitor
Fixed-Point
Toolbox
—
bitorreduce
Fixed-Point
Toolbox
—
bitrevorder
Signal Processing
Toolbox
• Requires Signal Processing Blockset license.
bitrol
Fixed-Point
Toolbox
—
bitror
Fixed-Point
Toolbox
—
bitset
MATLAB
• Does not support floating-point input for the
first argument. The first argument must belong
to an integer class.
bitset
Fixed-Point
Toolbox
—
bitshift
MATLAB
• Does not support floating-point input for the
first argument. The first argument must belong
to an integer class.
1-23
1
1-24
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
bitshift
Fixed-Point
Toolbox
—
bitsliceget
Fixed-Point
Toolbox
—
bitsll
Fixed-Point
Toolbox
bitsra
Fixed-Point
Toolbox
—
bitsrl
Fixed-Point
Toolbox
—
bitxor
MATLAB
• Does not support floating-point inputs. The
arguments must belong to an integer class.
bitxor
Fixed-Point
Toolbox
—
bitxorreduce
Fixed-Point
Toolbox
—
bsxfun
MATLAB
—
cart2pol
MATLAB
—
cart2sph
MATLAB
—
cast
MATLAB
—
cat
MATLAB
• Accepts up to three input arguments.
ceil
MATLAB
—
char
MATLAB
—
chol
MATLAB
• Does not allow two output arguments.
class
MATLAB
—
compan
MATLAB
—
complex
MATLAB
—
complex
Fixed-Point
Toolbox
—
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
cond
MATLAB
—
conj
MATLAB
—
conj
Fixed-Point
Toolbox
—
conv
MATLAB
—
conv2
MATLAB
—
cos
MATLAB
—
cosd
MATLAB
—
cosh
MATLAB
—
cot
MATLAB
—
cotd
MATLAB
—
coth
MATLAB
—
cov
MATLAB
—
cross
MATLAB
• If supplied, dim must be a constant.
csc
MATLAB
—
cscd
MATLAB
—
csch
MATLAB
—
ctranspose
MATLAB
—
ctranspose
Fixed-Point
Toolbox
—
cumprod
MATLAB
—
cumsum
MATLAB
—
cumtrapz
MATLAB
—
deconv
MATLAB
—
det
MATLAB
—
1-25
1
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
detrend
MATLAB
• If supplied and not empty, the input argument
bp must satisfy the following requirements:
-
-
Be real
Be sorted in ascending order
Restrict elements to integers in the interval
[1, n-2], where n is the number of elements
in a column of input argument X , or the
number of elements in X when X is a row
vector
Contain all unique values
diag
MATLAB
• If supplied, the argument representing the
order of the diagonal matrix must be a real and
scalar integer value.
diag
Fixed-Point
Toolbox
—
diff
MATLAB
• If supplied, the arguments representing
the number of times to apply diff and
the dimension along which to calculate the
difference must be constants.
disp
Fixed-Point
Toolbox
—
divide
Fixed-Point
Toolbox
• Any non-fi input must be constant; that is, its
value must be known at compile time so that it
can be cast to a fi object.
• Complex and imaginary divisors are not
supported.
1-26
dot
MATLAB
—
double
MATLAB
—
double
Fixed-Point
Toolbox
—
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
eig
MATLAB
• QZ algorithm used in all cases. Consequently, for
the standard eigenvalue problem (B identity),
results will be similar to those obtained using
the following in MATLAB:
[V,D] = eig(A,eye(size(A)),'qz')
However, V may represent a different basis of
eigenvectors, and the eigenvalues in D may not
be in the same order.
• Options 'balance', 'nobalance', and 'chol'
are not supported.
• Outputs are always of complex type.
ellipke
MATLAB
—
end
Fixed-Point
Toolbox
—
eps
MATLAB
—
eps
Fixed-Point
Toolbox
• Supported for scalar fixed-point signals only.
eq
MATLAB
—
eq
Fixed-Point
Toolbox
• Not supported for fixed-point signals with
different biases.
erf
MATLAB
—
erfc
MATLAB
—
erfcinv
MATLAB
—
erfcx
MATLAB
—
erfinv
MATLAB
—
exp
MATLAB
—
expint
MATLAB
—
• Supported for scalar, vector, and matrix single
and double signals.
1-27
1
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
expm
MATLAB
—
expm1
MATLAB
—
eye
MATLAB
• Dimensions must be real, nonnegative, integer
constants.
factorial
MATLAB
—
false
MATLAB
• Dimensions must be real, nonnegative, integer
constants.
fft
MATLAB
• Length of input vector must be a power of 2.
fftshift
MATLAB
—
fi
Fixed-Point
Toolbox
• Use to create a fixed-point constant or variable
in Embedded MATLAB.
• The default constructor syntax without any
input arguments is not supported.
• The syntax
fi('PropertyName',PropertyValue...)
is not supported. To use property
name/property value pairs, you must first
specify the value v of the fi object as in
fi(v,'PropertyName',PropertyValue...).
• Works for constant input values only; that is,
the value of the input must be known at compile
time.
• numerictype object information must be
available for non-fixed-point Simulink inputs.
1-28
filter
MATLAB
—
filter2
MATLAB
—
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
fimath
Fixed-Point
Toolbox
• Fixed-point signals coming in to an Embedded
MATLAB Function block from Simulink are
assigned the fimath object defined in the
Embedded MATLAB Function dialog in the
Model Explorer.
• Use to create fimath objects in Embedded
MATLAB code.
fix
MATLAB
—
flipdim
MATLAB
—
fliplr
MATLAB
—
flipud
MATLAB
—
floor
MATLAB
—
freqspace
MATLAB
—
gamma
MATLAB
—
gammainc
MATLAB
—
gammaln
MATLAB
—
gcd
MATLAB
—
ge
MATLAB
—
ge
Fixed-Point
Toolbox
• Not supported for fixed-point signals with
different biases.
get
Fixed-Point
Toolbox
• The syntax structure = get(o) is not
supported.
getlsb
Fixed-Point
Toolbox
—
getmsb
Fixed-Point
Toolbox
—
gt
MATLAB
—
gt
Fixed-Point
Toolbox
• Not supported for fixed-point signals with
different biases.
1-29
1
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
hilb
MATLAB
—
histc
MATLAB
—
horzcat
Fixed-Point
Toolbox
—
hypot
MATLAB
—
idivide
MATLAB
• opt string must be in lowercase.
• For efficient generated code, MATLAB
divide-by-zero rules are supported only for the
'round' option.
ifft
MATLAB
• Length of input vector must be a power of 2.
• Output of ifft block is always complex.
ifftshift
MATLAB
—
imag
MATLAB
—
imag
Fixed-Point
Toolbox
—
ind2sub
MATLAB
• No support for N-dimensional matrices. Size
vector must have exactly two elements.
inf
MATLAB
• Dimensions must be real, nonnegative, integer
constants.
int8, int16, int32
MATLAB
—
int8, int16, int32
Fixed-Point
Toolbox
—
interp1
MATLAB
• Supports only linear and nearest interpolation
methods.
• Does not handle evenly spaced X indices
separately.
• X must be strictly monotonically increasing
or strictly monotonically decreasing; does not
reorder indices.
1-30
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
interp1q, see
interp1
MATLAB
• X must be strictly monotonically increasing
or strictly monotonically decreasing; does not
reorder indices.
intmax
MATLAB
—
intmin
MATLAB
—
inv
MATLAB
Singular matrix inputs can produce nonfinite
values that differ from MATLAB.
invhilb
MATLAB
—
ipermute
MATLAB
—
isa
MATLAB
—
ischar
MATLAB
—
iscolumn
Fixed-Point
Toolbox
—
isempty
MATLAB
—
isempty
Fixed-Point
Toolbox
—
isequal
MATLAB
• Supports only two arguments.
isfi
Fixed-Point
Toolbox
—
isfimath
Fixed-Point
Toolbox
—
isfinite
MATLAB
—
isfinite
Fixed-Point
Toolbox
—
isfloat
MATLAB
—
isinf
MATLAB
—
isinf
Fixed-Point
Toolbox
—
isinteger
MATLAB
—
1-31
1
1-32
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
islogical
MATLAB
—
isnan
MATLAB
—
isnan
Fixed-Point
Toolbox
—
isnumeric
MATLAB
—
isnumeric
Fixed-Point
Toolbox
—
isnumerictype
Fixed-Point
Toolbox
—
isreal
MATLAB
—
isreal
Fixed-Point
Toolbox
—
isrow
Fixed-Point
Toolbox
—
isscalar
MATLAB
—
isscalar
Fixed-Point
Toolbox
—
issigned
Fixed-Point
Toolbox
—
issorted
MATLAB
—
isstruct
MATLAB
—
isvector
MATLAB
—
isvector
Fixed-Point
Toolbox
—
kron
MATLAB
lcm
MATLAB
—
ldivide
MATLAB
—
le
MATLAB
—
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
le
Fixed-Point
Toolbox
• Not supported for fixed-point signals with
different biases.
length
MATLAB
—
length
Fixed-Point
Toolbox
—
linspace
MATLAB
• Number of points N must be a constant that is
positive, real, and integer valued
log
MATLAB
• Generates an error during simulation and
returns NaN for Real-Time Workshop targets
when the input value x is real, but the output
should be complex. To get the complex result,
make the input value complex by passing in
complex(x).
log2
MATLAB
—
log10
MATLAB
—
log1p
MATLAB
—
logical
MATLAB
—
logical
Fixed-Point
Toolbox
—
logspace
MATLAB
—
lowerbound
Fixed-Point
Toolbox
—
lsb
Fixed-Point
Toolbox
• Supported for scalar fixed-point signals only.
lt
MATLAB
—
lt
Fixed-Point
Toolbox
• Not supported for fixed-point signals with
different biases.
lu
MATLAB
—
magic
MATLAB
—
• Supported for scalar, vector, and matrix single
and double signals.
1-33
1
1-34
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
max
MATLAB
—
max
Fixed-Point
Toolbox
—
mean
MATLAB
—
median
MATLAB
—
meshgrid
MATLAB
—
min
MATLAB
—
min
Fixed-Point
Toolbox
—
minus
MATLAB
—
minus
Fixed-Point
Toolbox
• Any non-fi input must be constant; that is, its
value must be known at compile time so that it
can be cast to a fi object.
mldivide
MATLAB
—
mod
MATLAB
—
mode
MATLAB
• Does not support third output argument C (cell
array)
mpower
MATLAB
—
mrdivide
MATLAB
—
mtimes
MATLAB
—
mtimes
Fixed-Point
Toolbox
• Any non-fi input must be constant; that is, its
value must be known at compile time so that it
can be cast to a fi object.
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
NaN or nan
MATLAB
• Dimensions must be real, nonnegative, integer
constants
• Supports only one or two dimension arguments
nargin
MATLAB
—
nargout
MATLAB
—
nchoosek
MATLAB
—
ndims
MATLAB
—
ndims
Fixed-Point
Toolbox
—
ne
MATLAB
—
ne
Fixed-Point
Toolbox
• Not supported for fixed-point signals with
different biases.
nextpow2
MATLAB
—
norm
MATLAB
—
normest
MATLAB
—
not
MATLAB
—
nthroot
MATLAB
—
numberofelements
Fixed-Point
Toolbox
• numberofelements and numel both work the
same as MATLAB numel for fi objects in
Embedded MATLAB.
numerictype
Fixed-Point
Toolbox
• Fixed-point signals coming in to an Embedded
MATLAB Function block from Simulink
are assigned a numerictype object that is
populated with the signal’s data type and
scaling information.
• Returns the data type when the input is a
nonfixed-point signal.
• Use to create numerictype objects in Embedded
MATLAB code.
1-35
1
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
ones
MATLAB
• Dimensions must be real, non-negative, integer
constants
or
MATLAB
—
pascal
MATLAB
—
permute
MATLAB
—
permute
Fixed-Point
Toolbox
—
pi
MATLAB
—
pinv
MATLAB
—
planerot
MATLAB
—
plus
MATLAB
—
plus
Fixed-Point
Toolbox
• Any non-fi input must be constant; that is, its
value must be known at compile time so that it
can be cast to a fi object.
pol2cart
MATLAB
—
poly
MATLAB
• Does not discard non-finite input values
• Complex input always produces complex output
1-36
polyfit
MATLAB
—
polyval
MATLAB
—
pow2
Fixed-Point
Toolbox
• For the syntax pow2(a, K), K must be a
constant; that is, its value must be known at
compile time so that it can be cast to a fi object.
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
power
MATLAB
• Generates an error during simulation and
returns NaN for Real-Time Workshop targets
when both X and Y are real, but power(X,Y) is
complex. To get the complex result, make the
input value X complex by passing in complex(X).
For example, power(complex(X),Y).
• Generates an error during simulation and
returns NaN for Real-Time Workshop targets
when both X and Y are real, but X .^ Y is
complex. To get the complex result, make the
input value X complex by using complex(X). For
example, complex(X).^Y.
prod
MATLAB
—
qr
MATLAB
—
rand
MATLAB
• Does not support the V5 generator.
• May not match MATLAB if seeded with
negative values.
randn
MATLAB
• May not match MATLAB if seeded with
negative values
range
Fixed-Point
Toolbox
—
rank
MATLAB
—
rcond
MATLAB
—
rdivide
MATLAB
—
real
MATLAB
—
real
Fixed-Point
Toolbox
—
reallog
MATLAB
—
realmax
MATLAB
—
realmax
Fixed-Point
Toolbox
—
1-37
1
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
realmin
MATLAB
—
realmin
Fixed-Point
Toolbox
—
realpow
MATLAB
—
realsqrt
MATLAB
—
rem
MATLAB
—
repmat
MATLAB
—
repmat
Fixed-Point
Toolbox
—
rescale
Fixed-Point
Toolbox
—
reshape
MATLAB
• Accepts a maximum of three arguments
reshape
Fixed-Point
Toolbox
—
rot90
MATLAB
—
round
MATLAB
—
sec
MATLAB
—
secd
MATLAB
—
sech
MATLAB
—
shiftdim
MATLAB
• Second argument must be a constant
• Class of second argument must be single or
double
1-38
sign
MATLAB
—
sign
Fixed-Point
Toolbox
—
sin
MATLAB
—
sind
MATLAB
—
single
MATLAB
—
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
single
Fixed-Point
Toolbox
—
sinh
MATLAB
—
size
MATLAB
—
size
Fixed-Point
Toolbox
—
sort
MATLAB
—
sortrows
MATLAB
—
sosfilt
Signal Processing
Toolbox
• Requires Signal Processing Blockset license
sph2cart
MATLAB
—
squeeze
MATLAB
—
sqrt
MATLAB
• Generates an error during simulation and
returns NaN for Real-Time Workshop targets
when the input value x is real, but the output
should be complex. To get the complex result,
make the input value complex by passing in
complex(x).
sqrt
Fixed-Point
Toolbox
• Complex and [Slope Bias] inputs error out.
std
MATLAB
—
strcmp
MATLAB
• Arguments must be computable at compile time.
struct
MATLAB
—
sub2ind
MATLAB
• Does not support N-dimensional matrices. Size
vector must have exactly two elements.
• Negative inputs yield a 0 result.
• Maximum number of input arguments is three.
subsasgn
Fixed-Point
Toolbox
—
subspace
MATLAB
—
1-39
1
1-40
Working with Embedded MATLAB
Function
Product
Remarks/Limitations
subsref
Fixed-Point
Toolbox
—
sum
MATLAB
—
sum
Fixed-Point
Toolbox
—
svd
MATLAB
—
tan
MATLAB
—
tand
MATLAB
—
tanh
MATLAB
—
times
MATLAB
—
times
Fixed-Point
Toolbox
• Any non-fi input must be constant; that is, its
value must be known at compile time so that it
can be cast to a fi object.
toeplitz
MATLAB
—
trace
MATLAB
—
trapz
MATLAB
—
transpose
MATLAB
—
transpose
Fixed-Point
Toolbox
—
tril
MATLAB
—
tril
Fixed-Point
Toolbox
—
triu
MATLAB
—
triu
Fixed-Point
Toolbox
—
true
MATLAB
• Dimensions must be real, non-negative, integer
constants
Embedded MATLAB Function Library Reference
Function
Product
Remarks/Limitations
typecast
MATLAB
• Value of string input argument type must be
lower case
• Data type of input argument X can be inherited
in Embedded MATLAB Function blocks only
if class(X) is 'double'; otherwise, you must
specify input port data types explicitly
uint8, uint16, uint32
MATLAB
—
uint8, uint16,
uint32
Fixed-Point
Toolbox
—
uminus
MATLAB
—
uminus
Fixed-Point
Toolbox
—
uplus
MATLAB
—
uplus
Fixed-Point
Toolbox
—
upperbound
Fixed-Point
Toolbox
—
vander
MATLAB
—
var
MATLAB
—
vertcat
Fixed-Point
Toolbox
—
wilkinson
MATLAB
—
xcorr
Signal Processing
Toolbox
• Does not support the case where A is a matrix
• Does not support partial (abbreviated) strings
of biased, unbiased, coeff, or none
• Requires Signal Processing Blockset license
xor
MATLAB
—
zeros
MATLAB
• Dimensions must be real, non-negative, integer
constants
1-41
1
Working with Embedded MATLAB
Embedded MATLAB Function Library — Categorical
List
The following topics list functions in the Embedded MATLAB library by
different function types. Each entry includes a function name link to online
help for the equivalent MATLAB or Fixed-Point Toolbox function along with a
one-line description.
• “Arithmetic Operator Functions” on page 1-43
• “Casting Functions” on page 1-44
• “Complex Number Functions” on page 1-44
• “Derivative and Integral Functions” on page 1-45
• “Discrete Math Functions” on page 1-45
• “Exponential Functions” on page 1-45
• “Filtering and Convolution Functions” on page 1-46
• “Fixed-Point Toolbox Functions” on page 1-46
• “Histogram Functions” on page 1-50
• “Input and Output Functions” on page 1-50
• “Interpolation and Computational Geometry” on page 1-51
• “Logical Operator Functions” on page 1-51
• “Matrix and Array Functions” on page 1-52
• “Polynomial Functions” on page 1-55
• “Relational Operator Functions” on page 1-55
• “Rounding and Remainder Functions” on page 1-56
• “Set Functions” on page 1-56
• “Signal Processing Functions” on page 1-56
• “Special Values” on page 1-57
• “Specialized Math” on page 1-58
• “Statistical Functions” on page 1-58
• “String Functions” on page 1-59
1-42
Embedded MATLAB Function Library Reference
• “Structure Functions” on page 1-59
• “Trigonometric Functions” on page 1-59
For an alphabetical list of these functions, and remarks and limitations for
them, see “Embedded MATLAB Function Library — Alphabetical List” on
page 1-20.
Arithmetic Operator Functions
See Arithmetic Operators + - * / \ ^ ’ in the MATLAB Function Reference
documentation for detailed descriptions of the following operator equivalent
functions.
Function
Description
ctranspose
Complex conjugate transpose (')
idivide
Integer division with rounding option
isa
Determine if input is object of given class
ldivide
Left array divide
minus
Minus (-)
mldivide
Left matrix divide (\)
mpower
Equivalent of array power operator (.^)
mrdivide
Right matrix divide
mtimes
Matrix multiply (*)
plus
Plus (+)
power
Array power
rdivide
Right array divide
times
Array multiply
transpose
Matrix transpose (')
uminus
Unary minus (-)
uplus
Unary plus (+)
1-43
1
Working with Embedded MATLAB
Casting Functions
Embedded MATLAB functions support the following functions for converting
one type of data to another:
Data Type
Description
cast
Cast variable to different data type
char
Create character array (string)
class
Query class of object argument
double
Convert to double-precision floating point
int8, int16, int32
Convert to signed integer data type
logical
Convert to Boolean true or false data type
single
Convert to single-precision floating point
typecast
Convert data types without changing underlying data
uint8, uint16,
uint32
Convert to unsigned integer data type
Complex Number Functions
Embedded MATLAB functions support the following functions for complex
numbers:
1-44
Function
Description
complex
Construct complex data from real and imaginary components
conj
Return the conjugate of a complex number
imag
Return the imaginary part of a complex number
isnumeric
True for numeric arrays
isreal
Return false (0) for a complex number
isscalar
True if array is a scalar
real
Return the real part of a complex number
Embedded MATLAB Function Library Reference
Derivative and Integral Functions
Embedded MATLAB functions support the following functions for derivatives
and integrals:
Function
Description
cumtrapz
Cumulative trapezoidal numerical integration
diff
Differences and approximate derivatives
trapz
Trapezoidal numerical integration
Discrete Math Functions
Embedded MATLAB functions support the following discrete math functions:
Function
Description
lcm
Least common multiple of corresponding elements in arrays
gcd
Return an array containing the greatest common divisors of the
corresponding elements of integer arrays
nchoosek
Binomial coefficient or all combinations
Exponential Functions
Embedded MATLAB functions support the following exponential functions:
Function
Description
exp
Exponential
expm
Matrix exponential
expm1
Compute exp(x)-1 accurately for small values of x
factorial
Factorial function
log
Natural logarithm
log2
Base 2 logarithm and dissect floating-point numbers into exponent and
mantissa
log10
Common (base 10) logarithm
1-45
1
Working with Embedded MATLAB
Function
Description
log1p
Compute log(1+x) accurately for small values of x
nextpow2
Next higher power of 2
nthroot
Real nth root of real numbers
reallog
Natural logarithm for nonnegative real arrays
realpow
Array power for real-only output
realsqrt
Square root for nonnegative real arrays
sqrt
Square root
Filtering and Convolution Functions
Embedded MATLAB functions support the following filtering and convolution
functions:
Function
Description
conv
Convolution and polynomial multiplication
conv2
2-D convolution
deconv
Deconvolution and polynomial division
detrend
Remove linear trends
filter
1-D digital filter
filter2
2-D digital filter
Fixed-Point Toolbox Functions
For more information on fixed-point support in Embedded MATLAB, see
“Working with the Fixed-Point Embedded MATLAB™ Subset” in the
Fixed-Point Toolbox documentation. Embedded MATLAB supports the
following functions from Fixed-Point Toolbox:
1-46
Function
Description
abs
Absolute value of fi object
all
Determine whether all array elements are nonzero
Embedded MATLAB Function Library Reference
Function
Description
any
Determine whether any array elements are nonzero
bitand
Bitwise AND of two fi objects
bitandreduce
Bitwise AND of consecutive range of bits
bitcmp
Bitwise complement of fi object
bitconcat
Concatenate bits of two fi objects
bitget
Bit at certain position
bitor
Bitwise OR of two fi objects
bitorreduce
Bitwise OR of consecutive range of bits
bitrol
Bitwise rotate left
bitror
Bitwise rotate right
bitset
Set bit at certain position
bitshift
Shift bits specified number of places
bitsliceget
Consecutive slice of bits
bitsll
Bit shift left logical
bitsra
Bit shift right arithmetic
bitsrl
Bit shift right logical
bitxor
Bitwise exclusive OR of two fi objects
bitxorreduce
Bitwise exclusive OR of consecutive range of bits
complex
Construct complex fi object from real and imaginary parts
conj
Complex conjugate of fi object
ctranspose
Complex conjugate transpose of fi object
diag
Diagonal matrices or diagonals of matrix
disp
Display object
divide
Divide two objects
double
Double-precision floating-point real-world value of fi object
end
Last index of array
1-47
1
1-48
Working with Embedded MATLAB
Function
Description
eps
Quantized relative accuracy for fi or quantizer objects
eq
Determine whether real-world values of two fi objects are equal
fi
Construct fi object
fimath
Construct fimath object
ge
Determine whether real-world value of one fi object is greater than or
equal to another
get
Property values of object
getlsb
Least significant bit
getmsb
Most significant bit
gt
Determine whether real-world value of one fi object is greater than
another
horzcat
Horizontally concatenate multiple fi objects
imag
Imaginary part of complex number
int8, int16, or
int32
Stored integer value of fi object as built-in int8, int16, or int32
iscolumn
Determine whether fi object is column vector
isempty
Determine whether array is empty
isfi
Determine whether variable is fi object
isfimath
Determine whether variable is fimath object
isfinite
Determine whether array elements are finite
isinf
Determine whether array elements are infinite
isnan
Determine whether array elements are NaN
isnumeric
Determine whether input is numeric array
isnumerictype
Determine whether variable is numerictype object
isreal
Determine whether array elements are real
isrow
Determine whether fi object is row vector
isscalar
Determine whether input is scalar
Embedded MATLAB Function Library Reference
Function
Description
issigned
Determine whether fi object is signed
isvector
Determine whether input is vector
le
Determine whether real-world value of fi object is less than or equal to
another
length
Vector length
logical
Convert numeric values to logical
lowerbound
Lower bound of range of fi object
lsb
Scaling of least significant bit of fi object
lt
Determine whether real-world value of one fi object is less than another
max
Largest element in array of fi objects
min
Smallest element in array of fi objects
minus
Matrix difference between fi objects
mtimes
Matrix product of fi objects
ndims
Number of array dimensions
ne
Determine whether real-world values of two fi objects are not equal
numberofelements
Number of data elements in fi array
numerictype
Construct numerictype object
permute
Rearrange dimensions of multidimensional array
plus
Matrix sum of fi objects
pow2
Multiply by 2K
range
Numerical range of fi or quantizer object
real
Real part of complex number
realmax
Largest positive fixed-point value or quantized number
realmin
Smallest positive normalized fixed-point value or quantized number
repmat
Replicate and tile array
rescale
Change scaling of fi object
1-49
1
Working with Embedded MATLAB
Function
Description
reshape
Reshape array
sign
Perform signum function on array
single
Single-precision floating-point real-world value of fi object
size
Array dimensions
sqrt
Square root of fi object
subsasgn
Subscripted assignment
subsref
Subscripted reference
sum
Sum of array elements
times
Element-by-element multiplication of fi objects
transpose
Transpose operation
tril
Lower triangular part of matrix
triu
Upper triangular part of matrix
uint8, uint16, or
uint32
Stored integer value of fi object as built-in uint8, uint16, or uint32
uminus
Negate elements of fi object array
uplus
Unary plus
upperbound
Upper bound of range of fi object
vertcat
Vertically concatenate multiple fi objects
Histogram Functions
Embedded MATLAB functions support the following histogram functions:
Function
Description
histc
Histogram count
Input and Output Functions
Embedded MATLAB functions support the following functions for accessing
argument and return values:
1-50
Embedded MATLAB Function Library Reference
Function
Description
nargin
Return the number of input arguments a user has supplied
nargout
Return the number of output return values a user has requested
Interpolation and Computational Geometry
Embedded MATLAB functions support the following functions for
interpolation and computational geometry:
Function
Description
cart2pol
Transform Cartesian coordinates to polar or cylindrical
cart2sph
Transform Cartesian coordinates to spherical
interp1
One-dimensional interpolation (table lookup)
interp1q
Quick one-dimensional linear interpolation (table lookup)
meshgrid
Generate X and Y arrays for 3-D plots
pol2cart
Transform polar or cylindrical coordinates to Cartesian
sph2cart
Transform spherical coordinates to Cartesian
Logical Operator Functions
Embedded MATLAB functions support the following functions for performing
logical operations:
Function
Description
and
Logical AND (&)
bitand
Bitwise AND
bitcmp
Bitwise complement
bitget
Bit at specified position
bitor
Bitwise OR
bitset
Set bit at specified position
bitshift
Shift bits specified number of places
1-51
1
Working with Embedded MATLAB
Function
Description
bitxor
Bitwise XOR
not
Logical NOT (~)
or
Logical OR (|)
xor
Logical exclusive-OR
Matrix and Array Functions
Embedded MATLAB functions support the following functions for matrices
and arrays:
1-52
Function
Description
abs
Return absolute value and complex magnitude of an array
all
Test if all elements are nonzero
angle
Phase angle
any
Test for any nonzero elements
bsxfun
Applies element-by-element binary operation to two arrays with singleton
expansion enabled
cat
Concatenate arrays along specified dimension
compan
Companion matrix
cond
Condition number of a matrix with respect to inversion
cov
Covariance matrix
cross
Vector cross product
cumprod
Cumulative product of array elements
cumsum
Cumulative sum of array elements
det
Matrix determinant
diag
Return a matrix formed around the specified diagonal vector and the
specified diagonal (0, 1, 2,...) it occupies
diff
Differences and approximate derivatives
dot
Vector dot product
Embedded MATLAB Function Library Reference
Function
Description
eig
Eigenvalues and eigenvectors
eye
Identity matrix
false
Return an array of 0s for the specified dimensions
flipdim
Flip array along specified dimension
fliplr
Flip matrix left to right
flipud
Flip matrix up to down
hilb
Hilbert matrix
ind2sub
Subscripts from linear index
isequal
Test arrays for equality
isvector
Determine whether input is vector
inv
Inverse of a square matrix
invhilb
Inverse of Hilbert matrix
ipermute
Inverse permute dimensions of array
isempty
Determine whether array is empty
isfinite
Detect finite elements of an array
isfloat
Determine if input is floating-point array
isinf
Detect infinite elements of an array
isinteger
Determine if input is integer array
islogical
Determine if input is logical array
isnan
Detect NaN elements of an array
kron
Kronecker tensor product
length
Return the length of a matrix
linspace
Generate linearly spaced vectors
logspace
Generate logarithmically spaced vectors
lu
Matrix factorization
magic
Magic square
1-53
1
1-54
Working with Embedded MATLAB
Function
Description
max
Maximum elements of a matrix
min
Minimum elements of a matrix
ndims
Number of dimensions
norm
Vector and matrix norms
normest
2-norm estimate
ones
Create a matrix of all 1s
pascal
Pascal matrix
permute
Rearrange dimensions of array
pinv
Pseudoinverse of a matrix
planerot
Givens plane rotation
prod
Product of array element
qr
Orthogonal-triangular decomposition
rank
Rank of matrix
rcond
Matrix reciprocal condition number estimate
repmat
Replicate and tile an array
reshape
Reshape one array into the dimensions of another
rot90
Rotate matrix 90 degrees
shiftdim
Shift dimensions
sign
Signum function
size
Return the size of a matrix
sort
Sort elements in ascending or descending order
sortrows
Sort rows in ascending order
squeeze
Remove singleton dimensions
sub2ind
Single index from subscripts
subspace
Angle between two subspaces
sum
Sum of matrix elements
Embedded MATLAB Function Library Reference
Function
Description
toeplitz
Toeplitz matrix
trace
Sum of diagonal elements
tril
Extract lower triangular part
triu
Extract upper triangular part
true
Return an array of logical (Boolean) 1s for the specified dimensions
vander
Vandermonde matrix
wilkinson
Wilkinson’s eigenvalue test matrix
zeros
Create a matrix of all zeros
Polynomial Functions
Embedded MATLAB functions support the following functions for
polynomials:
Function
Description
poly
Polynomial with specified roots
polyfit
Polynomial curve fitting
polyval
Polynomial evaluation
Relational Operator Functions
Embedded MATLAB functions support the following functions for performing
relational operations:
1-55
1
Working with Embedded MATLAB
Function
Description
eq
Equal (==)
ge
Greater than or equal to (>=)
gt
Greater than (>)
le
Less than or equal to (<=)
lt
Less than (<)
ne
Not equal (~=)
Rounding and Remainder Functions
Embedded MATLAB functions support the following rounding and remainder
functions:
Function
Description
ceil
Round toward plus infinity
fix
Round toward zero
floor
Round toward minus infinity
mod
Modulus (signed remainder after division)
rem
Remainder after division
round
Round toward nearest integer
Set Functions
Embedded MATLAB functions support the following set functions:
Function
Description
issorted
Determine whether set elements are in sorted order
Signal Processing Functions
Embedded MATLAB supports the following signal processing functions:
1-56
Embedded MATLAB Function Library Reference
Function
Description
bitrevorder
Permute data into bit-reversed order (requires Signal Processing Blockset
license)
chol
Cholesky factorization
conv
Convolution and polynomial multiplication
fft
Discrete Fourier transform
fftshift
Shift zero-frequency component to center of spectrum
filter
Filter a data sequence using a digital filter that works for both real and
complex inputs
freqspace
Frequency spacing for frequency response
ifft
Inverse discrete Fourier transform
ifftshift
Inverse discrete Fourier transform shift
sosfilt
Second-order (biquadratic) IIR filtering (requires Signal Processing
Blockset license)
svd
Singular value decomposition
xcorr
Cross-correlation function estimates (requires Signal Processing Blockset
license)
Special Values
Embedded MATLAB functions support the following special data values:
Symbol
Description
eps
Floating-point relative accuracy
inf
IEEE arithmetic representation for positive infinity
intmax
Largest possible value of specified integer type
intmin
Smallest possible value of specified integer type
NaN or nan
Not a number
pi
Ratio of the circumference to the diameter for a circle
rand
Uniformly distributed pseudorandom numbers
1-57
1
Working with Embedded MATLAB
Symbol
Description
randn
Normally distributed random numbers
realmax
Largest positive floating-point number
realmin
Smallest positive floating-point number
Specialized Math
Embedded MATLAB functions support the following specialized math
functions:
Symbol
Description
beta
Beta function
betainc
Incomplete beta function
betaln
Logarithm of beta function
ellipke
Complete elliptic integrals of first and second kind
erf
Error function
erfc
Complementary error function
erfcinv
Inverse of complementary error function
erfcx
Scaled complementary error function
erfinv
Inverse error function
expint
Exponential integral
gamma
Gamma function
gammainc
Incomplete gamma function
gammaln
Logarithm of the gamma function
Statistical Functions
Embedded MATLAB functions support the following statistical functions:
1-58
Embedded MATLAB Function Library Reference
Function
Description
mean
Average or mean value of array
median
Median value of array
mode
Most frequent values in array
std
Standard deviation
var
Variance
String Functions
Embedded MATLAB functions support the following functions for handling
strings:
Function
Description
char
Create character array (string)
ischar
True for character array (string)
strcmp
Return a logical result for the comparison of two strings; limited to
strings known at compile time
Structure Functions
Embedded MATLAB functions support the following functions for handling
structures:
Function
Description
struct
Create structure
isstruct
Determine whether input is a structure
Trigonometric Functions
Embedded MATLAB functions support the following trigonometric functions:
1-59
1
1-60
Working with Embedded MATLAB
Function
Description
acos
Inverse cosine
acosd
Inverse cosine; result in degrees
acosh
Inverse hyperbolic cosine
acot
Inverse cotangent; result in radians
acotd
Inverse cotangent; result in degrees
acoth
Inverse hyperbolic cotangent
acsc
Inverse cosecant; result in radians
acscd
Inverse cosecant; result in degrees
acsch
Inverse cosecant and inverse hyperbolic cosecant
asec
Inverse secant; result in radians
asecd
Inverse secant; result in degrees
asech
Inverse hyperbolic secant
asin
Inverse sine
asinh
Inverse hyperbolic sine
atan
Inverse tangent
atan2
Four quadrant inverse tangent
atand
Inverse tangent; result in degrees
atanh
Inverse hyperbolic tangent
cos
Cosine
cosd
Cosine; result in degrees
cosh
Hyperbolic cosine
cot
Cotangent; result in radians
cotd
Cotangent; result in degrees
coth
Hyperbolic cotangent
csc
Cosecant; result in radians
cscd
Cosecant; result in degrees
Embedded MATLAB Function Library Reference
Function
Description
csch
Hyperbolic cosecant
hypot
Square root of sum of squares
sec
Secant; result in radians
secd
Secant; result in degrees
sech
Hyperbolic secant
sin
Sine
sind
Sine; result in degrees
sinh
Hyperbolic sine
tan
Tangent
tand
Tangent; result in degrees
tanh
Hyperbolic tangent
1-61
1
Working with Embedded MATLAB
Calling Functions in Embedded MATLAB
In this section...
“How Embedded MATLAB Resolves Function Calls” on page 1-62
“How Embedded MATLAB Resolves File Types on the Path” on page 1-65
“Adding the Compilation Directive %#eml” on page 1-67
“Calling Subfunctions” on page 1-69
“Calling Embedded MATLAB Library Functions” on page 1-70
“Calling MATLAB Functions” on page 1-71
“Limit on Function Arguments” on page 1-78
How Embedded MATLAB Resolves Function Calls
From an Embedded MATLAB function, you can call subfunctions, Embedded
MATLAB library functions, and external MATLAB functions. Embedded
MATLAB resolves function names as follows:
1-62
Calling Functions in Embedded MATLAB
Start
Dispatch to
MATLAB
for execution
at runtime
Yes
Function
on
MATLAB
path?
No
Yes
Extrinsic
function?
No
Subfunction?
Yes
No
Function
on Embedded
MATLAB
path?
Yes
No
Function
on
MATLAB
path?
Compliant
with Embedded
MATLAB
semantics
and syntax?
Yes
Generate
C code
No
Yes
No
Generate error
1-63
1
Working with Embedded MATLAB
Key Points About Resolving Function Calls
The diagram illustrates key points about how Embedded MATLAB resolves
function calls:
• Embedded MATLAB searches two paths, the Embedded MATLAB path and
the MATLAB path.
See “Compile Path Search Order” on page 1-64.
• Embedded MATLAB attempts to compile all functions unless you explicitly
declare them to be extrinsic.
An extrinsic function is an M-function on the MATLAB path that Embedded
MATLAB dispatches to MATLAB for execution. Embedded MATLAB
does not generate code for extrinsic functions. You declare functions to
be extrinsic by using the Embedded MATLAB function eml.extrinsic,
as described in “Declaring MATLAB Functions as Extrinsic Functions”
on page 1-71.
After Embedded MATLAB resolves a function name, it then resolves the
file type based on precedence rules described in “How Embedded MATLAB
Resolves File Types on the Path” on page 1-65.
Compile Path Search Order
Embedded MATLAB searches two paths to resolve function calls:
1 Embedded MATLAB path
Embedded MATLAB searches this path first. The Embedded MATLAB
path contains the Embedded MATLAB library functions.
2 MATLAB path
If Embedded MATLAB does not find the function on the Embedded
MATLAB path, it searches the MATLAB path.
Embedded MATLAB applies MATLAB dispatcher rules when searching each
path. For more information, see “How MATLAB Determines Which Method to
Call” in the MATLAB Programming documentation.
1-64
Calling Functions in Embedded MATLAB
When to Use the Embedded MATLAB Path
Use the Embedded MATLAB path to override a MATLAB function with a
customized version. Since Embedded MATLAB searches the Embedded
MATLAB path first, an M-file on the Embedded MATLAB path always
shadows an M-file of the same name on the MATLAB path.
How Embedded MATLAB Resolves File Types on the
Path
After Embedded MATLAB resolves function names on a path, it resolves file
types on the path using precedence rules as follows:
1-65
1
Working with Embedded MATLAB
Start
M-file and
MEX-file in same
directory?
Yes
No
Yes
MEX-file?
No
Generate
error
Yes
MDL-file?
Compile
M-file
No
Yes
P-file?
No
No
1-66
M-file?
Yes
Calling Functions in Embedded MATLAB
Adding the Compilation Directive %#eml
To instruct Embedded MATLAB to compile an external function, add the
%#eml pragma to the function code. Adding this pragma accomplishes two
purposes:
• If compilation succeeds, provides a visual cue that the function complies
with the Embedded MATLAB subset
• If compilation fails, produces detailed diagnostic messages to help you
correct violations of Embedded MATLAB syntax and semantics
If compilation fails and your function code does not contain the %#eml pragma,
Embedded MATLAB prompts you to clarify whether you really want to
compile the external function or whether you want to dispatch it to MATLAB
for execution, as follows:
To:
Do This:
Compile
with detailed
diagnostics
Add %#eml to the function code and recompile.
Dispatch the
function to
MATLAB
Declare the function to be extrinsic and recompile. See
“Declaring MATLAB Functions as Extrinsic Functions”
on page 1-71, and recompile.
A Simple Example
Suppose you have an Embedded MATLAB Function block that contains the
function example which, in turn, calls the function foo on the MATLAB path.
Here is the code for example.m:
function example(u)
foo(u);
Here is the code for foo.m:
function y = foo(u)
y = 0;
for i = 1:u:u
y = y+i;
1-67
1
Working with Embedded MATLAB
end
When you build example.m, Embedded MATLAB tries to compile foo.m based
on the heuristic described in “How Embedded MATLAB Resolves Function
Calls” on page 1-62. During compilation, Embedded MATLAB detects errors
and generates the following messages:
• Warning:
Please add an %#eml pragma to 'D:/Work/foo.m'
to indicate that this file is intended to be
used for Embedded MATLAB.
• Error:
The function failed to compile, if you intended
to compile the file use %#eml directive in
'D:/Work/foo.m', however if you wish to call out
to matlab use eml.extrinsic('foo') before calling
the function.
To continue with compilation, add %#eml to foo.m, shown highlighted below:
%#eml
function y = foo(u)
y = 0;
for i = 1:u:u
y = y+i;
end
When you build example.m again, you get a more detailed message, explaining
the specific syntax violations, as follows:
1-68
Calling Functions in Embedded MATLAB
Calling Subfunctions
Subfunctions are functions defined in the body of an Embedded MATLAB
function. They work the same way in Embedded MATLAB functions as they
do in MATLAB.
1-69
1
Working with Embedded MATLAB
The following example illustrates how to define and call a subfunction in an
Embedded MATLAB function:
You can include subfunctions for Embedded MATLAB functions just as
you would in MATLAB M-file functions. Subfunctions can have multiple
arguments and return values, using any types and sizes supported by
Embedded MATLAB. See “Subfunctions” in the MATLAB Programming
documentation for more information.
Calling Embedded MATLAB Library Functions
You can call Embedded MATLAB library functions directly. The Embedded
MATLAB function library is a subset of MATLAB, Fixed-Point Toolbox, and
Signal Processing Toolbox functions which can be used to generate code. For a
list of supported functions appear in “Embedded MATLAB Function Library
Reference” on page 1-20.
For more information about fixed-point support in Embedded MATLAB,
refer to “Working with the Fixed-Point Embedded MATLAB™ Subset” in the
Fixed-Point Toolbox documentation.
1-70
Calling Functions in Embedded MATLAB
Calling MATLAB Functions
Embedded MATLAB attempts to compile all MATLAB functions unless
you explicitly declare them to be extrinsic (see “How Embedded MATLAB
Resolves Function Calls” on page 1-62). An extrinsic function is a function
that is executed by MATLAB during simulation. Embedded MATLAB does
not compile or generate code for extrinsic functions (see “How Embedded
MATLAB Resolves Extrinsic Functions” on page 1-74).
There are two methods for declaring a function extrinsic in Embedded
MATLAB:
• Declare the function extrinsic in Embedded MATLAB main functions or
subfunctions (see “Declaring MATLAB Functions as Extrinsic Functions”
on page 1-71).
• Call the MATLAB function indirectly using feval (see “Calling MATLAB
Functions Using feval” on page 1-73).
Declaring MATLAB Functions as Extrinsic Functions
To declare a MATLAB function extrinsic, add a declaration at the top of the
main Embedded MATLAB function or a subfunction using this syntax:
eml.extrinsic('function_name_1', ... , 'function_name_n');
For example, the following code declares the MATLAB find function extrinsic
in the main Embedded MATLAB function foo:
function y = foo
eml.extrinsic('find');
x = ones(4);
y = x;
y = find(x);
When to Use the eml.extrinsic Declaration. Use the eml.extrinsic
declaration to:
• Call MATLAB functions that produce no output — such as plot — for
visualizing results during simulation, without generating unnecessary
1-71
1
Working with Embedded MATLAB
code (see “How Embedded MATLAB Resolves Extrinsic Functions” on
page 1-74).
• Make your code self-documenting and easier to debug. You can scan the
source code for eml.extrinsic declarations to isolate calls to MATLAB
functions, which can potentially create and propagate mxArrays (see
“Working with mxArrays” on page 1-75).
• Save typing. With one declaration, you ensure that each subsequent
function call is extrinsic, as long as the call and the declaration are in the
same scope (see “Scope of Extrinsic Function Declarations” on page 1-72).
• Declare the MATLAB function(s) extrinsic throughout the calling function
scope (see “Scope of Extrinsic Function Declarations” on page 1-72). To
narrow the scope, use feval (see “Calling MATLAB Functions Using feval”
on page 1-73).
Rules for Extrinsic Function Declarations. Observe the following rules
when declaring functions extrinsic in Embedded MATLAB:
• You must declare the function extrinsic before you call it.
• You cannot use the extrinsic declaration in conditional statements.
Scope of Extrinsic Function Declarations. The eml.extrinsic declaration
has function scope. For example, consider the following code:
function y = foo
eml.extrinsic('rat','min');
[N D] = rat(pi);
y = 0;
y = min(N, D);
In this example, Embedded MATLAB interprets the functions rat and min as
extrinsic every time they are called in the main function foo.
There are two ways to narrow the scope of an extrinsic declaration inside
the main function:
• Declare the MATLAB function extrinsic in a subfunction, as in this
example:
function y = foo
1-72
Calling Functions in Embedded MATLAB
eml.extrinsic('rat');
[N D] = rat(pi);
y = 0;
y = mymin(N, D);
function y = mymin(a,b)
eml.extrinsic('min');
y = min(a,b);
Here, the function rat is extrinsic every time it is called inside the main
function foo, but the function min is extrinsic only when called inside the
subfunction mymin.
• Call the MATLAB function using feval, as described in “Calling MATLAB
Functions Using feval” on page 1-73.
Calling MATLAB Functions Using feval
Embedded MATLAB automatically interprets the function feval as an
extrinsic function. Therefore, you can use feval to conveniently call MATLAB
functions from Embedded MATLAB.
Consider the following example:
function y = foo
eml.extrinsic('rat');
[N D] = rat(pi);
y = 0;
y = feval('min', N, D);
Because feval is extrinsic, the statement feval('min', N, D) is evaluated
by MATLAB — not Embedded MATLAB — which has the same effect as
declaring the function min extrinsic for just this one call. By contrast, the
function rat is extrinsic throughout the function foo.
1-73
1
Working with Embedded MATLAB
How Embedded MATLAB Resolves Extrinsic Functions
Embedded MATLAB resolves extrinsic functions as follows:
For simulation targets, Embedded MATLAB generates code for the call to
a MATLAB function, but does not generate the function’s internal code.
Embedded MATLAB sends the extrinsic function to MATLAB for execution.
Therefore, you can run the simulation only on platforms where MATLAB
is installed.
For Real-Time Workshop® and custom targets, Embedded MATLAB
attempts to determine whether the extrinsic function affects the output
of the Embedded MATLAB function in which it is called — for example by
returning mxArrays to an output variable (see “Working with mxArrays” on
page 1-75). If Embedded MATLAB can determine that there is no effect on
output, Embedded MATLAB proceeds with code generation, but excludes the
extrinsic function from the generated code. Otherwise, Embedded MATLAB
issues a compiler error.
1-74
Calling Functions in Embedded MATLAB
Working with mxArrays
The output of an extrinsic function is an mxArray — also called MATLAB
array. The only valid operations for mxArrays are:
• Storing mxArrays in variables
• Passing mxArrays to functions and returning them from functions
• Converting mxArrays to known types at run time
To use mxArrays returned by extrinsic functions in other operations, you must
first convert them to known types, as described in “Converting mxArrays to
Known Types” on page 1-75.
Converting mxArrays to Known Types. To convert anmxArray to a
known type, assign the mxArray to a variable whose type is defined. At run
time, Embedded MATLAB converts the mxArray to the type of the variable
assigned to it. However, if the data in the mxArray is not consistent with the
type of the variable, Embedded MATLAB generates an error.
For example, consider this code:
function y = foo
eml.extrinsic('rat','min');
[N D] = rat(pi);
y = min(N, D);
Here, the top-level Embedded MATLAB function foo calls the extrinsic
MATLAB function rat, which returns two mxArrays representing the
numerator N and denominator D of the rational fraction approximation of
pi. Although you can pass these mxArrays to another extrinsic MATLAB
function — in this case, min — you cannot assign the mxArray returned by min
to the output y.
If you run this function foo in an Embedded MATLAB Function block in
Simulink, the code generates the following error during simulation:
1-75
1
Working with Embedded MATLAB
To correct this problem, declare y to be the type and size of the value that you
expect min to return — in this case, a scalar double — as follows:
function y = foo
eml.extrinsic('rat','min');
[N D] = rat(pi);
y = 0; % y is a scalar of type double
y = min(N,D);
In the next example, Embedded MATLAB attempts to use an mxArray in an
arithmetic expression:
function z = foo
eml.extrinsic('find');
x = ones(1); % x is a 1-by-1 array of type double
y = find(x); % y is a 1-by-1 array of type mxArray
z = x + y;
If you run this function foo in an Embedded MATLAB Function block in
Simulink, the code generates a compiler error during simulation because it
attempts to add the mxArray y to a double array x:
1-76
Calling Functions in Embedded MATLAB
The value y is an mxArray because the code assigns it the mxArray value
returned by the extrinsic MATLAB function find. To prevent this error,
you must declare y to be the same type and size as x — a 1-by-1 matrix of
type double — before assigning y to the return value of find(x), as in this
example:
function z = foo
eml.extrinsic('find');
x = ones(1); % x is a 1-by-1 array of type double
y = ones(1); % y is a 1-by-1 array of type double
y = find(x); % y returned from find converted to
% 1-by-1 array of type double
z = x + y;
Here, the Embedded MATLAB function ones(1) returns a 1-by-1 matrix of
type double, thereby converting y to the same type and size as x at run time.
Now that y is defined, Embedded MATLAB can convert the mxArray returned
by find(x) to a known type — an array of type double — at run time for
assignment to y. As a result, the expression z = x + y adds variables of the
same type and does not generate an error.
Restrictions on Extrinsic Functions in Embedded MATLAB
As a subset of MATLAB, Embedded MATLAB does not support the full
MATLAB run-time environment. Therefore, Embedded MATLAB imposes the
following restrictions when calling MATLAB functions extrinsically:
1-77
1
Working with Embedded MATLAB
• MATLAB functions that inspect the caller or write to the caller’s workspace
do not work when the caller is an Embedded MATLAB function, including:
-
dbstack
evalin
assignin
• The MATLAB debugger cannot inspect variables in Embedded MATLAB
functions.
• Embedded MATLAB may produce unpredictable results if your extrinsic
function performs any of the following actions at run time:
-
Change directories
Change the MATLAB path
Delete or add M-files
Change warning states
Change MATLAB preferences
Change Simulink parameters
Limit on Function Arguments
Embedded MATLAB allows you to call functions with up to 64 inputs and
64 outputs.
1-78
Using Structures
Using Structures
In this section...
“About Embedded MATLAB Structures” on page 1-79
“Elements of Embedded MATLAB Structures” on page 1-79
“Types of Embedded MATLAB Structures” on page 1-80
“Defining Local Structure Variables” on page 1-81
“Defining Outputs as Structures” on page 1-84
“Making Structures Persistent” on page 1-85
“Indexing SubStructures and Fields” on page 1-85
“Assigning Values to Structures and Fields” on page 1-86
“Limitations with Structures” on page 1-86
About Embedded MATLAB Structures
The Embedded MATLAB structure is a data type that is based on the
MATLAB structure (see “Structures” in the MATLAB Programming
documentation). By imposing some restrictions, Embedded MATLAB compiles
MATLAB structures to generate efficient C code in Real-Time Workshop®.
Structures in Embedded MATLAB support a subset of the operations
available for MATLAB structures. In Embedded MATLAB, you can:
• Define structures as local or persistent variables inside Embedded
MATLAB functions
• Define primary function inputs as structures
• Pass structures to subfunctions
• Index structure fields using dot notation
Elements of Embedded MATLAB Structures
The elements of Embedded MATLAB structures are called fields. Like
structures in MATLAB, the fields of an Embedded MATLAB structure can
contain data of any type and size, including:
1-79
1
Working with Embedded MATLAB
• Scalars
• Strings
• Composite data, such as other structures
• Arrays of structures
Note Unlike structure arrays in MATLAB, each structure field in an
Embedded MATLAB array must have the same type, size, and complexity
(see “Limitations with Structures” on page 1-86).
Types of Embedded MATLAB Structures
You can define the following types of Embedded MATLAB structures:
Type
How to Define
Details
Input
Depends on how you use Embedded
MATLAB:
See:
• Define structures in Embedded
MATLAB Function blocks based
on Simulink bus objects (requires
Simulink)
• Define primary function inputs
based on structure definitions
in the MATLAB workspace (to
generate C-MEX code using
Embedded MATLAB MEX, as
described in Chapter 2, “Working
with Embedded MATLAB MEX”)
Output
1-80
Define structure variable in
Embedded MATLAB function
• “Using Bus Objects”
in the Simulink User’s
Guide documentation
• “Specifying Properties
of Primary Function
Inputs” on page 2-13
See “Defining Outputs as
Structures” on page 1-84.
Using Structures
Type
How to Define
Details
Local
Define local structure variable in
Embedded MATLAB function
See “Defining Local
Structure Variables” on
page 1-81.
Persistent
Declare structure variable to be
persistent in Embedded MATLAB
function
See “Making Structures
Persistent” on page 1-85.
Defining Local Structure Variables
You can define local structures as variables inside Embedded MATLAB
functions. Local structures are temporary by default, but you can make them
persistent (see “Making Structures Persistent” on page 1-85).
You can define structures explicitly as scalars or arrays, as described in
these topics:
• “Defining Scalar Structures” on page 1-81
• “Defining Arrays of Structures” on page 1-83
Defining Scalar Structures
There are several ways to create scalar structures in Embedded MATLAB:
• “Defining Scalar Structures by Extension” on page 1-81
• “Defining Scalar Structures Using the MATLAB struct Function” on page
1-82
• “Defining Scalar Structures by Assignment” on page 1-82
Defining Scalar Structures by Extension. You can create scalar structures
by extension by adding fields to a variable using dot notation. For example,
the following code creates a structure to represent a point p with coordinates
x, y, and z:
...
p.x = 1;
p.y = 3;
1-81
1
Working with Embedded MATLAB
p.z = 1;
...
You can also nest scalar structures in direct assignment statements by
appending more than one field to a variable using dot notation. For example,
the following code adds a color field to structure p:
...
p.color.red = .2;
p.color.green = .4;
p.color.blue = .7;
...
See “Indexing SubStructures and Fields” on page 1-85.
Defining Scalar Structures Using the MATLAB struct Function. You can
create scalar structures in Embedded MATLAB using the MATLAB struct
function (see “Structures” in the MATLAB Programming documentation).
When using struct in Embedded MATLAB functions, the field arguments
must be scalar values. You cannot create structures of cell arrays in
Embedded MATLAB. However, you can define arrays of structures, as
described in “Defining Arrays of Structures” on page 1-83.
Defining Scalar Structures by Assignment. You can define scalar
structures by assigning them to preexisting structures. In the following
example, p is defined as a structure that has the same properties as the
predefined structure S:
...
S = struct('a',
p = S;
...
0, 'b',
1, 'c',
2);
Note You do not need to predefine the variable to which you assign the
structure — in this case, p. However, if you have already defined the variable,
it must have the same class, size, and complexity as the structure you assign
to it.
1-82
Using Structures
Defining Arrays of Structures
When you create an array of structures in Embedded MATLAB, you must
be sure that each structure field in the array has the same size, type, and
complexity (see “Limitations with Structures” on page 1-86). There are
several ways to create arrays of structures in Embedded MATLAB:
• “Defining an Array of Structures from a Scalar Structure” on page 1-83
• “Defining an Array of Structures Using Concatenation” on page 1-84
Defining an Array of Structures from a Scalar Structure. You can
create an array of structures from a scalar structure by using the MATLAB
repmat function, which replicates and tiles an existing scalar structure.
Follow these steps:
1 Create a scalar structure, as described in “Defining Scalar Structures”
on page 1-81.
2 Call repmat, passing the scalar structure and the dimensions of the array.
3 Assign values to each structure using standard array indexing and
structure dot notation.
For example, the following code from an Embedded MATLAB function creates
X, a 1-by-3 array of scalar structures. Each element of the array is defined
by the structure s, which has two fields, a and b:
...
s.a = 0;
s.b = 0;
X = repmat(s,1,3);
X(1).a = 1;
X(2).a = 2;
X(3).a = 3;
X(1).b = 4;
X(2).b = 5;
X(3).b = 6;
...
1-83
1
Working with Embedded MATLAB
Defining an Array of Structures Using Concatenation. To create a small
array of structures, you can use the concatenation operator, square brackets
( [ ] ), to join one or more structures into an array (see “Concatenating
Matrices” in the MATLAB Programming documentation). In Embedded
MATLAB, all the structures that you concatenate must have the same size,
class, and complexity.
For example, the following code uses concatenation and a subfunction to
create the elements of a 1-by-3 structure array:
...
W = [ sab(1,2) sab(2,3) sab(4,5) ];
function s = sab(a,b)
s.a = a;
s.b = b;
...
Defining Outputs as Structures
You define primary function outputs as structures the same way you define
local structures (see “Defining Local Structure Variables” on page 1-81). For
example, the following code defines output y as a scalar structure by extension:
function y = fcn(u)
y.a = 1;
y.b = 2;
...
The next example defines output y as a structure with the same fields and
values as in the previous example, but this time using the MATLAB struct
function:
function y = fcn(u)
y = struct('a',1,'b',2);
...
You can also define outputs as structures by assigning them to a preexisting
structure, as in this example:
function y = fcn(u)
x = struct('a',1,'b',2);
1-84
Using Structures
y = x;
...
See “Structures” in the MATLAB Programming documentation.
Making Structures Persistent
To make structures persist, you declare them to be persistent variables and
initialize them with the isempty statement, as described in “Declaring
Persistent Variables” on page 1-10.
For example, the following Embedded MATLAB function declares structure X
to be persistent and initializes its fields a and b:
function f(u)
persistent X
if isempty(X)
X.a = 1;
X.b = 2;
end
Indexing SubStructures and Fields
As in MATLAB, you index substructures and fields of Embedded MATLAB
structures by using dot notation. Unlike MATLAB, you must reference field
values individually (see “Reference Field Values Individually from Structure
Arrays” on page 1-89).
For example, the following code excerpt from an Embedded MATLAB function
uses dot notation to index fields and substructures:
...
substruct1.a1 = 15.2;
substruct1.a2 = int8([1 2;3 4]);
mystruct = struct('ele1',20.5,'ele2',single(100),
'ele3',substruct1);
substruct2 = mystruct;
substruct2.ele3.a2 = 2*(substruct1.a2);
1-85
1
Working with Embedded MATLAB
...
The following table shows how Embedded MATLAB resolves symbols in dot
notation for indexing elements of the structures in this example:
Dot Notation
Symbol Resolution
substruct1.a1
Field a1 of local structure substruct1
substruct2.ele3.a1
Value of field a1 of field ele3, a substructure of local structure
substruct2
substruct2.ele3.a2(1,1)
Value in row 1, column 1 of field a2 of field ele3, a substructure
of local structure substruct2
Assigning Values to Structures and Fields
You can assign values to any Embedded MATLAB structure, substructure, or
field. Here are the guidelines:
Operation
Conditions
Assign one structure to another
structure.
You must define each structure with
the same number, type, and size of
fields (see “Using Structures” on
page 1-79).
Assign one structure to a
substructure of a different structure
and vice versa.
You must define the structure with
the same number, type, and size of
fields as the substructure.
Assign an element of one structure
to an element of another structure.
The elements must have the same
type and size.
Limitations with Structures
Embedded MATLAB supports MATLAB structures with the following
limitations to allow efficient code generation in C:
• “Add Fields in Consistent Order” on page 1-87
• “Do Not Assign Empty Matrices” on page 1-88
1-86
Using Structures
• “Do Not Assign mxArrays to Structures” on page 1-88
• “Do Not Add New Fields After First Use of Structures” on page 1-88
• “Make Structures Uniform in Arrays” on page 1-89
• “Do Not Reference Fields Dynamically” on page 1-89
• “Do Not Use Field Values as Constants” on page 1-89
• “Reference Field Values Individually from Structure Arrays” on page 1-89
Add Fields in Consistent Order
When you create a structure, you must add fields in the same order on each
control flow path. For example, the following code generates a compiler
error because it adds the fields of structure x in a different order in each
if statement clause:
function y = fcn(u)
if u > 0
x.a = 10;
x.b = 20;
else
x.b = 30; % Generates an error (on variable x)
x.a = 40;
end
y = x.a + x.b;
In this example, the assignment to x.a comes before x.b in the first if
statement clause, but the assignments appear in reverse order in the else
clause. Here is the corrected code:
function y = fcn(u)
if u > 0
x.a = 10;
x.b = 20;
else
x.a = 40;
x.b = 30;
end
y = x.a + x.b;
1-87
1
Working with Embedded MATLAB
Do Not Assign Empty Matrices
You cannot assign empty matrices to structure fields.
Do Not Assign mxArrays to Structures
You cannot assign mxArrays to structure elements in Embedded MATLAB;
you must first convert them to known types (see “Working with mxArrays”
on page 1-75).
Do Not Add New Fields After First Use of Structures
You cannot add fields to a structure after you perform any of the following
operations on the structure:
• Reading from the structure
• Indexing into the structure array
• Passing the structure to a function
For example, consider this code:
...
x.c = 10; % Declares structure and creates field c
y = x; % Reads from structure
x.d = 20; % Generates an error
...
In this example, the attempt to add a new field d after reading from structure
x generates an error.
This restriction extends across the structure hierarchy. For example, you
cannot add a field to a structure after operating on one of its fields or nested
structures, as in this example:
function y = fcn(u)
x.c = 10;
y = x.c;
x.d = 20; % Generates an error
1-88
Using Structures
In this example, the attempt to add a new field d to structure x after reading
from the structure’s field c generates an error.
Make Structures Uniform in Arrays
Each structure field in an array of structures must have the same size, type,
and complexity.
Do Not Reference Fields Dynamically
You cannot reference fields in a structure by using dynamic names, which
express the field as a variable expression that MATLAB evaluates at run
time (see “Using Dynamic Field Names” in the MATLAB Programming
documentation).
Do Not Use Field Values as Constants
Embedded MATLAB never considers the values stored in the fields of a
structure to be constant values. Therefore, you cannot use field values to set
the size or class of other data. For example, the following code generates
an error:
...
Y.a = 3;
X = zeros(Y.a); % Generates an error
In this example, even though you set field a of structure Y to the value 3,
Embedded MATLAB does not consider Y.a to be a constant and, therefore, it
is not a valid argument to pass to the function zeros.
Reference Field Values Individually from Structure Arrays
To reference the value of a field in a structure array, you must index into the
array to the structure of interest and then reference that structure’s field
individually using dot notation, as in this example:
...
y = X(1).a % Extracts the value of field a
% of the first structure in array X
...
1-89
1
Working with Embedded MATLAB
To reference all the values of a particular field for each structure in an array,
use this notation in a for loop, as in this example:
...
s.a
s.b
X =
for
= 0;
= 0;
repmat(s,1,5);
i = 1:5
X(i).a = i;
X(i).b = i+1;
end
This example uses the repmat function to define an array of structures,
each with two fields a and b as defined by s. See “Defining Local Structure
Variables” on page 1-81 for more information.
1-90
Using Function Handles
Using Function Handles
In this section...
“About Function Handles” on page 1-91
“Example: Defining and Passing Function Handles in an Embedded
MATLAB Function” on page 1-92
“Limitations with Function Handles” on page 1-94
About Function Handles
You can use function handles in Embedded MATLAB to invoke functions
indirectly and parameterize operations that you repeat frequently (see
“Function Handles” in the MATLAB Programming documentation). In
Embedded MATLAB, you can perform the following operations with function
handles:
• Define handles that reference user-defined functions and built-in functions
supported by Embedded MATLAB (see “Embedded MATLAB Function
Library Reference” on page 1-20)
Note You cannot define handles that reference extrinsic MATLAB
functions (see “Calling MATLAB Functions” on page 1-71).
• Define function handles as scalar values
• Pass function handles as arguments to other functions (excluding extrinsic
functions)
Embedded MATLAB does not support the full set the operations you can
perform with function handles in MATLAB, as described in “Limitations with
Function Handles” on page 1-94
1-91
1
Working with Embedded MATLAB
Example: Defining and Passing Function Handles in
an Embedded MATLAB Function
The following code example defines and calls function handles in an
Embedded MATLAB function. You can copy it as is to an Embedded MATLAB
Function block in Simulink or Embedded MATLAB function in Stateflow. To
convert this function to a C-MEX function using emlmex, uncomment the two
calls to the assert function, highlighted below:
function addval(m)
%
%
%
%
Declare class and size of primary input m
Uncomment next two lines to build C-MEX function with emlmex
assert(isa(m,'double'));
assert(all (size(m) == [3 3]));
% Declare MATLAB function disp to be extrinsic
eml.extrinsic('disp');
disp(m);
% Pass function handle to addone
% to add one to each element of m
m = map(@addone, m);
disp(m);
% Pass function handle to addtwo
% to add two to each element of m
m = map(@addtwo, m);
disp(m);
function y = map(f,m)
y = m;
for i = 1:numel(y)
y(i) = f(y(i));
end
function y = addone(u)
y = u + 1;
1-92
Using Function Handles
function y = addtwo(u)
y = u + 2;
This code passes function handles @addone and @addtwo to the function map
which increments each element of the matrix m by the amount prescribed
by the referenced function. Note that map stores the function handle in the
input variable f and then uses f to invoke the function — in this case addone
first and then addtwo.
If you have Simulink or Fixed-Point Toolbox, you can use Embedded MATLAB
MEX to convert this M-function addval to a C-MEX executable that you can
run in MATLAB. Follow these steps:
1 At the MATLAB command prompt, issue this command:
emlmex addval
Embedded MATLAB MEX checks your code for compliance with Embedded
MATLAB.
2 Define and initialize a 3-by-3 matrix by typing a command like this at
the MATLAB prompt:
m = zeros(3)
3 Execute the function by typing this command:
addvals(m)
You should see the following result:
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
3
3
3
3
3
3
3
3
3
1-93
1
Working with Embedded MATLAB
For more information about Embedded MATLAB MEX, see Chapter 2,
“Working with Embedded MATLAB MEX”.
Limitations with Function Handles
Embedded MATLAB supports MATLAB function handles with the following
limitations:
• Function handles must be scalar values. You cannot store function handles
in matrices or structures.
• After you bind a variable to a specific function, you cannot use the same
variable to reference two different function handles, as in this example
%Incorrect code
...
x = @plus;
x = @minus;
...
This code produces a compilation error in Embedded MATLAB.
• You cannot pass function handles to or from feval and other extrinsic
MATLAB functions.
• You cannot pass function handles as input to primary functions in
Embedded MATLAB.
For example, consider this Embedded MATLAB function:
function x = plotFcn(fhandle, data)
assert(isa(fhandle,'function_handle') && isa(data,'double'));
eml.extrinsic('plot');
plot(data, fhandle(data));
x = fhandle(data);
In this example, the function plotFcn receives a function handle and its
data as primary inputs. plotFcn attempts to call the function referenced
by the fhandle with the input data and plot the results. However, you will
not be able to compile plotFcn with Embedded MATLAB MEX. Instead,
1-94
Using Function Handles
you get an error, indicating that the function isa does not recognize
'function_handle' as a class name when called inside an Embedded
MATLAB function to specify properties of primary inputs.
• You cannot display or watch function handles from the Embedded MATLAB
debugger; they appear as empty matrices.
1-95
1
Working with Embedded MATLAB
Using M-Lint with Embedded MATLAB
The Embedded MATLAB Editor uses the MATLAB M-Lint Code Analyzer
to automatically check your Embedded MATLAB function code for errors
and recommend corrections. The editor displays the same type of M-Lint
bar that appears in the MATLAB editor to highlight offending lines of
code. However, in the Embedded MATLAB Editor, the M-Lint bar displays
Embedded MATLAB diagnostics as well as MATLAB messages, as in the
following example:
For information about how to use M-Lint, see “M-Lint Code Analyzer” in the
MATLAB Desktop Tools and Development Environment documentation.
1-96
2
Working with Embedded
MATLAB MEX
About Embedded MATLAB MEX
(p. 2-2)
Describes what you can do with
Embedded MATLAB MEX
Workflow for Converting M-Code to
a C-MEX Function (p. 2-4)
Describes the steps required for
preparing M-code and converting it
to a C-MEX function
Installing Embedded MATLAB MEX
(p. 2-5)
Explains how to install the products
required for using Embedded
MATLAB MEX
Setting Up the C Compiler (p. 2-6)
Explains how to install and set up a
C compiler for use with Embedded
MATLAB MEX
Setting Up File Infrastructure and
Paths (p. 2-7)
Explains how to set up source file
directories and paths
Making M-Code Compliant with
Embedded MATLAB (p. 2-10)
Presents code verification methods
and the trade-offs between two
strategies: bottom-up and top-down
Specifying Properties of Primary
Function Inputs (p. 2-13)
Describes how to specify the types of
primary function inputs
Compiling Your M-File (p. 2-29)
Describes how to run Embedded
MATLAB MEX
Working with Compilation Reports
(p. 2-31)
Explains how to generate and
interpret compilation reports from
Embedded MATLAB MEX
2
Working with Embedded MATLAB MEX
About Embedded MATLAB MEX
In this section...
“Optimizes M-Code for Run-Time Efficiency” on page 2-2
“Running a Demo for Embedded MATLAB MEX” on page 2-3
“How Embedded MATLAB MEX Resolves Function Calls” on page 2-3
Optimizes M-Code for Run-Time Efficiency
Embedded MATLAB MEX is a function that optimizes M-code for run-time
efficiency in the following applications:
Application
What Embedded MATLAB MEX Does
Accelerate fixed-point
calculations
Converts M-code to C-MEX functions that
contain Embedded MATLAB optimizations
for automatically accelerating fixed-point
algorithms to compiled C code speed.
Run M-code in Simulink
Checks M-code for compliance with the
syntax and semantics of Embedded MATLAB,
as described in Chapter 1, “Working with
Embedded MATLAB”. You can add compliant
code to:
• Embedded MATLAB Function blocks and
Truth Table blocks in Simulink
• Embedded MATLAB functions and Truth
Table functions in Stateflow
MEX-files are dynamically linked subroutines that the MATLAB interpreter
can automatically load and execute. C-MEX files are MEX-files that are
written in the C programming language, but can run directly in MATLAB.
For more information, see “Introducing MEX-Files” in the MATLAB External
Interfaces documentation.
2-2
About Embedded MATLAB MEX
Running a Demo for Embedded MATLAB MEX
Fixed-Point Toolbox ships with a demonstration of how to generate a C-MEX
function from M-code. The M-code takes the weighted average of a signal to
create a lowpass filter. If you have a license for Fixed-Point Toolbox, you can
run the demo by following these steps:
1 Install Fixed-Point Toolbox.
Note For instructions on installing MathWorks products, see the
MATLAB installation documentation for your platform. If you have
installed MATLAB and want to check which other MathWorks products are
installed, enter ver in the MATLAB Command Window.
2 At the MATLAB prompt, type this command:
demos
The Help browser appears, listing categories of demos in the left pane.
3 In the left pane, navigate to Toolboxes > Fixed-Point > Fixed-Point
Lowpass Filtering Using Embedded MATLAB MEX.
4 Follow the instructions in the right pane of the Help browser.
How Embedded MATLAB MEX Resolves Function Calls
Embedded MATLAB MEX resolves function calls by first searching the
Embedded MATLAB path and then the MATLAB path. By default, Embedded
MATLAB MEX tries to compile and generate code for functions it finds on the
path unless you explicitly declare the function to be extrinsic. Embedded
MATLAB does not compile extrinsic functions, but rather dispatches them
to MATLAB for execution. For more information, see “How Embedded
MATLAB Resolves Function Calls” on page 1-62 in the Embedded MATLAB
documentation.
2-3
2
Working with Embedded MATLAB MEX
Workflow for Converting M-Code to a C-MEX Function
Follow these steps to convert M-code to a C-MEX function that complies with
Embedded MATLAB, as described in Chapter 1, “Working with Embedded
MATLAB”:
2-4
Step Action
Details
1
Install prerequisite products.
See “Installing Embedded MATLAB MEX”
on page 2-5.
2
Set up your C compiler.
See “Setting Up the C Compiler” on page
2-6.
3
Set up your file infrastructure.
See “Setting Up File Infrastructure and
Paths” on page 2-7.
4
Make your M-code compliant with
Embedded MATLAB.
See “Making M-Code Compliant with
Embedded MATLAB ” on page 2-10.
5
Specify properties of primary function
inputs.
See “Specifying Properties of Primary
Function Inputs” on page 2-13.
6
Run Embedded MATLAB MEX with the
appropriate command-line options.
See “Compiling Your M-File” on page 2-29.
Installing Embedded MATLAB MEX
Installing Embedded MATLAB MEX
Embedded MATLAB MEX ships with Simulink and Fixed-Point Toolbox. To
use Embedded MATLAB MEX, you must install the following products:
• MATLAB
• Simulink and/or Fixed-Point Toolbox
• C compiler
For instructions on installing MathWorks products, see the MATLAB
installation documentation for your platform. If you have installed MATLAB
and want to check which other MathWorks products are installed, enter ver
in the MATLAB Command Window.
For instructions on installing and setting up a C compiler, see “Setting Up
the C Compiler” on page 2-6.
2-5
2
Working with Embedded MATLAB MEX
Setting Up the C Compiler
Before using Embedded MATLAB MEX, you must set up your C compiler
by running mex -setup, as described in the documentation for mex in the
MATLAB Function Reference. You must run this command even if you use
the default C compiler that comes with MATLAB for Windows platforms. You
can also use mex to choose and configure a different C compiler, as described in
“Compiler Requirements” in the MATLAB External Interfaces documentation.
2-6
Setting Up File Infrastructure and Paths
Setting Up File Infrastructure and Paths
In this section...
“Compile Path Search Order” on page 2-7
“Can I Add Files to the Embedded MATLAB Path?” on page 2-7
“When to Use the Embedded MATLAB Path” on page 2-7
“Adding Directories to Search Paths” on page 2-8
“Naming Conventions” on page 2-8
Compile Path Search Order
Embedded MATLAB MEX resolves M-functions by searching first on the
Embedded MATLAB path and then on the MATLAB path. See “How
Embedded MATLAB Resolves Function Calls” on page 1-62 in the Embedded
MATLAB documentation.
Can I Add Files to the Embedded MATLAB Path?
With Embedded MATLAB MEX, you can prepend directories and files to
the Embedded MATLAB path, as described in “Adding Directories to Search
Paths” on page 2-8. By default, the Embedded MATLAB path contains the
current directory and the Embedded MATLAB libraries.
When to Use the Embedded MATLAB Path
Use the Embedded MATLAB path to override a MATLAB function with a
customized version. Since Embedded MATLAB MEX searches the Embedded
MATLAB path first, an M-file on the Embedded MATLAB path always
shadows an M-file of the same name on the MATLAB path. To override
a MATLAB function with a version implemented in Embedded MATLAB
libraries, follow these steps:
1 Create each version of the M-function in identically-named M-files.
2 Add the MATLAB version to the MATLAB path.
3 Add the Embedded MATLAB version to the Embedded MATLAB path.
2-7
2
Working with Embedded MATLAB MEX
See “Adding Directories to Search Paths” on page 2-8.
Adding Directories to Search Paths
The following table explains how to add directories to search paths:
To add directories
to:
Do this:
Embedded MATLAB
path
Prepend directories to the Embedded MATLAB path
using the compiler option -I. See “-I Add Directories
to Embedded MATLAB Path” on page 4-4 using
emlmex.
MATLAB path
Follow the instructions in “Adding a Directory to
the Search Path” in the MATLAB Programming
documentation.
Naming Conventions
Embedded MATLAB MEX enforces naming conventions for M-functions and
generated files.
• “Reserved Prefixes” on page 2-8
• “Conventions for Naming Generated files” on page 2-8
Reserved Prefixes
Embedded MATLAB reserves the prefix eml for global C functions
and variables in generated code. For example, Embedded MATLAB
runtime library function names all begin with the prefix emlrt, such as
emlrtCallMATLAB. To avoid naming conflicts, do not name C functions or
primary M-functions with the prefix eml.
Conventions for Naming Generated files
Embedded MATLAB MEX follows MATLAB conventions by providing
platform-specific extensions for C-MEX files.
2-8
Setting Up File Infrastructure and Paths
Platform
MEX File Extension
Linux (32-bit)
.mexglx
Linux x86-64
.mexa64
Windows (32-bit)
.mexw32
Window x64
.mexw64
2-9
2
Working with Embedded MATLAB MEX
Making M-Code Compliant with Embedded MATLAB
In this section...
“Debugging Strategies” on page 2-10
“Detecting Embedded MATLAB Syntax Violations at Compile Time” on
page 2-12
Debugging Strategies
Before performing code verification, The MathWorks recommends that you
choose a debugging strategy for detecting and correcting noncompliant code
in your MATLAB applications, especially if they consist of a large number of
M-files that call each other’s functions. Here are two best practices:
2-10
Making M-Code Compliant with Embedded MATLAB
Debugging What to Do
Strategy
Pros
Cons
Bottom-up
verification
• Efficient
Requires application tests that
work from the bottom up
1 Verify that your lowest-level
(leaf) functions are
compliant.
2 Work your way up
the function hierarchy
incrementally to compile
and verify each function,
ending with the top-level
function.
Top-down
verification
1 Declare all functions
called by the top-level
function to be extrinsic
so Embedded MATLAB
MEX does not compile them
(see “Declaring MATLAB
Functions as Extrinsic
Functions” on page 1-71).
2 Verify that your top-level
function is compliant.
• Safe
• Easy to
isolate
Embedded
MATLAB
syntax
violations
Lets you retain
your top-level
tests
Introduces extraneous code that
you must remove after code
verification, including:
• Extrinsic declarations
• Additional assignment
statements as necessary
to convert opaque values
returned by extrinsic
functions to nonopaque
values (see “Working with
mxArrays” on page 1-75)
3 Work your way down
the function hierarchy
incrementally by removing
extrinsic declarations one
by one to compile and verify
each function, ending with
the leaf functions.
2-11
2
Working with Embedded MATLAB MEX
Detecting Embedded MATLAB Syntax Violations at
Compile Time
Before you can successfully convert an M-file to a C-MEX function, you must
verify that your M-code complies with Embedded MATLAB syntax and
semantics, as defined in Chapter 1, “Working with Embedded MATLAB”.
Embedded MATLAB MEX checks for all potential Embedded MATLAB syntax
violations at compile time. When Embedded MATLAB MEX detects errors
or warnings, it automatically generates a compilation report that describes
the issues and provides links to the offending M-code. See “Working with
Compilation Reports” on page 2-31.
If your M-code calls functions on the MATLAB path, Embedded MATLAB
MEX attempts to compile these functions unless you declare them to be
extrinsic (see “How Embedded MATLAB Resolves Function Calls” on page
1-62. To get detailed diagnostics, add the %#eml compiler directive to each
external function that you want Embedded MATLAB MEX to compile, as
described in “Adding the Compilation Directive %#eml” on page 1-67.
2-12
Specifying Properties of Primary Function Inputs
Specifying Properties of Primary Function Inputs
In this section...
“Why You Must Specify Input Properties” on page 2-13
“Properties to Specify” on page 2-13
“Rules for Specifying Properties of Primary Inputs” on page 2-15
“Methods for Defining Properties of Primary Inputs” on page 2-16
“Defining Input Properties by Example at the Command Line” on page 2-17
“Defining Input Properties Programmatically in the M-File” on page 2-19
Why You Must Specify Input Properties
Because C is a statically typed language, Embedded MATLAB MEX must
determine the properties of all variables in the M-files at compile time. To
infer variable properties in M-files, Embedded MATLAB MEX must be able
to identify the properties of the inputs to the primary function, also known
as the top-level or entry-point function. Therefore, if your primary function
has inputs, you must specify the properties of these inputs, also called
preconditions, to Embedded MATLAB MEX. If your primary function has no
input parameters, Embedded MATLAB MEX can compile your M-file without
modification. You do not need to specify properties of inputs to subfunctions
or external functions called by the primary function.
Properties to Specify
If your primary function has inputs, you must specify the following properties
for each input:
For:
Specify Properties:
Class
Size
Complexity
numerictype
fimath
Fixed-point
inputs
2-13
2
Working with Embedded MATLAB MEX
For:
Specify Properties:
Class
Structure
inputs
Size
Complexity
numerictype
fimath
Specify properties for each field according to its class
When a primary input is a structure, Embedded MATLAB
MEX treats each field as a separate input. Therefore, you
must specify properties for all fields of a primary structure
input in the order that they appear in the structure definition,
as follows:
• For each field of input structures, specify class, size, and
complexity.
• For each field that is fixed-point class, also specify
numerictype, and fimath.
All other
inputs
Default Property Values
Embedded MATLAB MEX assigns the following default values for properties
of primary function inputs:
2-14
Property
Default
class
double
size
scalar
complexity
real
numerictype
No default
fimath
No default
Specifying Properties of Primary Function Inputs
Note In most cases, Embedded MATLAB MEX uses defaults when you don’t
explicitly specify values for properties — except for structure fields. The only
way to name a field in a structure is to set at least one of its properties.
Therefore, you may need to specify default values for properties of structure
fields. For examples, see “Example: Specifying Class and Size of Scalar
Structure” on page 2-26 and “Example: Specifying Class and Size of Structure
Array” on page 2-27.
Supported Classes
The following table presents the class names supported by Embedded
MATLAB MEX:
Class Name
Description
logical
Logical array of true and false values
char
Character array
int8
8-bit signed integer array
uint8
8-bit unsigned integer array
int16
16-bit signed integer array
uint16
16-bit unsigned integer array
int32
32-bit signed integer array
uint32
32-bit unsigned integer array
single
Single-precision floating-point or
fixed-point number array
double
Double-precision floating-point or
fixed-point number array
struct
Structure array
embedded.fi
Fixed-point number array
Rules for Specifying Properties of Primary Inputs
Follow these rules when specifying the properties of primary inputs:
2-15
2
Working with Embedded MATLAB MEX
• For each primary function input whose class is fixed point (fi), you must
specify the input’s numerictype and fimath properties.
• For each primary function input whose class is struct, you must specify
the properties of each of its fields in the order that they appear in the
structure definition.
Methods for Defining Properties of Primary Inputs
You can use any of the following methods to define the properties of primary
function inputs:
Method
Pros
Cons
“Defining Input Properties
by Example at the Command
Line” on page 2-17
• Easy to use
• Must be specified at the
command line every time
you invoke Embedded
MATLAB MEX (unless you
use a script)
• Does not alter original
M-code
• Designed for prototyping a
function that has a small
number of primary inputs
“Defining Input Properties
Programmatically in the
M-File” on page 2-19
• Integrated with M-code so
you do not need to redefine
properties each time you
invoke Embedded MATLAB
MEX
• Provides documentation of
property specifications in
the M-code
• Efficient for specifying
memory-intensive inputs
such as large structures
2-16
• Not efficient for specifying
memory-intensive inputs
such as large structures
and arrays
• Uses complex syntax
Specifying Properties of Primary Function Inputs
Note To specify the properties of inputs for any given primary function, use
one of these methods or the other, but not both.
Defining Input Properties by Example at the
Command Line
The command that invokes Embedded MATLAB MEX — emlmex — provides
a command-line option -eg for specifying the properties of primary function
inputs as a cell array of example values (see emlmex). The cell array can be a
variable or literal array of constant values. Using this method, you specify
the properties of inputs at the same time that you compile the M-file with
Embedded MATLAB MEX.
• “Command Line Option -eg” on page 2-17
• “Rules for using the -eg option” on page 2-17
• “Examples: Specifying Properties of Primary Inputs by Example” on page
2-18
• “Examples: Specifying Properties of Primary Fixed-Point Inputs by
Example” on page 2-18
Command Line Option -eg
The command that invokes Embedded MATLAB MEX — emlmex — provides
a command-line option -eg for specifying the properties of primary function
inputs as a cell array of example values. The cell array can be a variable or
literal array of constant values. Using this option, you specify the properties
of inputs at the same time as you compile the M-file with Embedded MATLAB
MEX. See “-eg Specify Input Properties by Example” on page 4-3 for emlmex.
Rules for using the -eg option
Follow these rules when using the -eg command-line option to define
properties by example:
• The cell array of sample values must contain the same number of elements
as primary function inputs.
2-17
2
Working with Embedded MATLAB MEX
• The order of elements in the cell array must correspond to the order in
which inputs appear in the primary function signature — for example, the
first element in the cell array defines the properties of the first primary
function input.
Examples: Specifying Properties of Primary Inputs by Example
Consider an M-function that adds its two inputs:
function y = emcf(u,v)
y = u + v;
The following examples show how to specify different properties of the
primary inputs u and v by example at the command line:
• Use a literal cell array of constants to specify that both inputs are real
scalar doubles:
emlmex -o emcfx emcf -eg {0,0}
• Use a literal cell array of constants to specify that input u is an unsigned
16-bit, 1-by-4 vector and input v is a scalar double:
emlc -o emcfx emcf -eg {zeros(1,4,'uint16'),0}
• Assign sample values to a cell array variable to specify that both inputs are
real, unsigned 8-bit integer vectors:
a = uint8([1;2;3;4])
b = uint8([5;6;7;8])
ex = {a,b}
emlmex -o emcfx emcf -eg ex
Examples: Specifying Properties of Primary Fixed-Point Inputs
by Example
Consider an M-function that calculates the square root of a fixed-point
number:
function y = sqrtfi(x)
y = sqrt(x);
2-18
Specifying Properties of Primary Function Inputs
To specify the properties of the primary fixed-point input x by example on the
MATLAB command line, follow these steps:
1 Define the numerictype properties for x, as in this example:
T = numerictype('WordLength',32,'FractionLength',23,'Signed',true);
2 Define the fimath properties for x, as in this example:
F = fimath('SumMode','SpecifyPrecision','SumWordLength',32,
'SumFractionLength',23,'ProductMode','SpecifyPrecision',
'ProductWordLength',32,'ProductFractionLength',23);
3 Create a fixed-point variable with the numerictype and fimath properties
you just defined, as in this example:
myeg = { fi(4.0,T,F) };
4 Compile the function sqrtfi using the emlmex command, passing the
variable myeg as the argument to the-eg option, as in this example:
emlmex sqrtfi -eg myeg;
Defining Input Properties Programmatically in the
M-File
Embedded MATLAB MEX lets you use the MATLAB assert function to
define properties of primary function inputs directly in your M-file.
• “How to Use assert with Embedded MATLAB MEX” on page 2-20
• “Rules for Using assert Function” on page 2-24
• “Example: Specifying General Properties of Primary Inputs” on page 2-25
• “Example: Specifying Properties of Primary Fixed-Point Inputs” on page
2-26
• “Example: Specifying Class and Size of Scalar Structure” on page 2-26
• “Example: Specifying Class and Size of Structure Array” on page 2-27
2-19
2
Working with Embedded MATLAB MEX
How to Use assert with Embedded MATLAB MEX
Use the assert function to invoke standard MATLAB functions for specifying
the class, size, and complexity of primary function inputs.
Specify Any Class (p. 2-20)
assert (isa (param,
'class_name'))
Specify fi Class (p. 2-21)
assert (isfi (param))
Specify Structure Class (p. 2-21)
assert (isstruct (param))
Specify Any Size (p. 2-22)
assert (all (size(param ==
[dims]))
Specify Scalar Size (p. 2-22)
assert (isscalar((param))
Specify Real Input (p. 2-23)
assert (isreal((param))
Specify Complex Input (p. 2-23)
assert (~isreal((param))
Specify numerictype of Fixed-Point
Input (p. 2-23)
assert (isequal
(numerictype(fiparam), T))
Specify fimath of Fixed-Point Input
(p. 2-24)
assert (isequal
(fimath(fiparam),F))
Specify Multiple Properties of Input
(p. 2-24)
assert (function1(params)
&& function2(params) &&
function3(params) && ...)
Specify Any Class.
assert ( isa ( param, 'class_name') )
Sets the input parameter param to the MATLAB class class_name. For
example, to set the class of input U to a 32-bit signed integer, call:
...
assert(isa(U,'int32'));
...
2-20
Specifying Properties of Primary Function Inputs
Note If you set the class of an input parameter to fi, you must also set its
numerictype and fimath properties (see “Specify numerictype of Fixed-Point
Input” on page 2-23 and “Specify fimath of Fixed-Point Input” on page 2-24).
If you set the class of an input parameter to struct, you must specify the
properties of each field in the structure in the order in which you define the
fields in the structure definition.
Specify fi Class.
assert ( isfi ( param ) )
assert ( isa ( param, 'embedded.fi' ) )
Sets the input parameter param to the MATLAB class fi (fixed-point numeric
object). For example, to set the class of input U to fi, call:
...
assert(isfi(U));
...
or
...
assert(isa(U,'embedded.fi'));
...
Note If you set the class of an input parameter to fi, you must also set its
numerictype and fimath properties (see “Specify numerictype of Fixed-Point
Input” on page 2-23 and “Specify fimath of Fixed-Point Input” on page 2-24).
Specify Structure Class.
assert ( isstruct ( param ) )
Sets the input parameter param to the MATLAB class struct (structure). For
example, to set the class of input U to a struct, call:
2-21
2
Working with Embedded MATLAB MEX
...
assert(isstruct(U));
...
or
...
assert(isa(U,'struct'));
...
Note If you set the class of an input parameter to struct, you must specify
the properties of each field in the structure in the order in which you define
the fields in the structure definition.
Specify Any Size.
assert ( all ( size (param == [dims ] ) )
Sets the input parameter param to the size specified by dimensions dims. For
example, to set the size of input U to a 3-by-2 matrix, call:
...
assert(all(size(U)== [3 2]));
...
Specify Scalar Size.
assert ( isscalar (param ) )
assert ( all ( size (param == [ 1 ] ) )
Sets the size of input parameter param to scalar. For example, to set the size
of input U to scalar, call:
...
assert(isscalar(U));
...
or
...
2-22
Specifying Properties of Primary Function Inputs
assert(all(size(U)== [1]));
...
Specify Real Input.
assert ( isreal (param ) )
Specifies that the input parameter param is real. For example, to specify
that input U is real, call:
...
assert(isreal(U));
...
Specify Complex Input.
assert ( ~isreal (param ) )
Specifies that the input parameter param is complex. For example, to specify
that input U is complex, call:
...
assert(~isreal(U));
...
Specify numerictype of Fixed-Point Input.
assert ( isequal ( numerictype ( fiparam ), T ) )
Sets the numerictype properties of fi input parameter fiparam to the
numerictype object T. For example, to specify the numerictype property of
fixed-point input U as a signed numerictype object T with 32-bit word length
and 30-bit fraction length, use the following code:
...
% Define the numerictype object.
T = numerictype(1, 32, 30);
% Set the numerictype property of input U to T.
assert(isequal(numerictype(U),T));
...
2-23
2
Working with Embedded MATLAB MEX
Specify fimath of Fixed-Point Input.
assert ( isequal ( fimath ( fiparam ), F ) )
Sets the fimath properties of fi input parameter fiparam to the fimath
object F. For example, to specify the fimath property of fixed-point input U so
that it saturates on integer overflow, use the following code:
...
% Define the fimath object.
F = fimath('OverflowMode','saturate');
% Set the fimath property of input U to F.
assert(isequal(fimath(U),F));
...
Specify Multiple Properties of Input.
assert ( function1 ( params ) && function2 ( params ) && function3 ( params ) && ... )
Specifies the class, size, and complexity of one or more inputs using a single
assert function call. For example, the following code specifies that input U is
a double, complex, 3-by-3 matrix, and input V is a 16-bit unsigned integer:
...
assert(isa(U,'double') && ~isreal(U) && all(size(U) == [3 3]) && isa(V,'uint16'));
...
Rules for Using assert Function
Follow these rules when using the assert function to specify the properties
of primary function inputs:
• Call assert functions at the beginning of the primary function, before any
flow-control operations such as if statements or subroutine calls.
• Do not call assert functions inside conditional constructs, such as if, for,
while, and switch statements.
• Use the assert function with Embedded MATLAB MEX only for specifying
properties of primary function inputs before converting your M-code to
C-MEX code.
2-24
Specifying Properties of Primary Function Inputs
• If you set the class of an input parameter to fi, you must also set
its numerictype and fimath properties (see “Specify numerictype of
Fixed-Point Input” on page 2-23 and “Specify fimath of Fixed-Point Input”
on page 2-24).
• If you set the class of an input parameter to struct, you must specify the
class, size, and complexity of each field in the structure in the order in
which you define the fields in the structure definition.
Example: Specifying General Properties of Primary Inputs
In the following code excerpt, a primary MATLAB function emcspecgram
takes two inputs: pennywhistle and win. The code specifies the following
properties for these inputs:
Input
Property
Value
pennywhistle
class
int16
size
220500-by-1 vector
complexity
real (by default)
class
double (by default)
size
1024-by-1 vector
complexity
real (by default)
win
function y = emcspecgram(pennywhistle,win)
nx = 220500;
nfft = 1024;
assert(isa(pennywhistle,'int16'));
assert(all(size(pennywhistle) == [nx 1]));
assert(all(size(win) == [nfft 1]));
...
Note If you do not specify the complexity of a primary function input,
Embedded MATLAB MEX assumes it is real by default.
Alternatively, you can combine property specifications for one or more inputs
inside assert commands, as follows:
2-25
2
Working with Embedded MATLAB MEX
function y = emcspecgram(pennywhistle,win)
nx = 220500;
nfft = 1024;
assert(isa(pennywhistle,'int16') && all(size(pennywhistle) == [nx 1]));
assert(isa(win, 'double') && all(size(win) == [nfft 1]));
...
Example: Specifying Properties of Primary Fixed-Point Inputs
In the following example, the primary MATLAB function emcsqrtfi takes one
fixed-point input: x. The code specifies the following properties for this input:
Property
Value
class
fi
numerictype
numerictype object T, as specified in the
primary function
fimath
fimath object F, as specified in the primary
function
size
scalar (by default)
complexity
real (by default)
function y = emcsqrtfi(x)
T = numerictype('WordLength',32,'FractionLength',23,
'Signed',true);
F = fimath('SumMode','SpecifyPrecision',
'SumWordLength',32,'SumFractionLength',23,
'ProductMode','SpecifyPrecision',
'ProductWordLength',32,'ProductFractionLength',23);
assert(isfi(x));
assert(isequal(numerictype(x),T));
assert(isequal(fimath(x),F));
y = sqrt(x);
Example: Specifying Class and Size of Scalar Structure
Assume you have defined S as the following scalar MATLAB structure:
2-26
Specifying Properties of Primary Function Inputs
S = struct('r',double(1),'i',int8(4));
Here is code that specifies the class and size of S and its fields when passed as
an input to your M-function:
function y = fcn(S)
% Specify the class of the input as struct.
assert(isstruct(S));
% Specify the size of the fields r and i
% in the order in which you defined them.
assert(isa(S.r,'double'));
assert(isa(S.i,'int8'));
...
Note In most cases, Embedded MATLAB MEX uses defaults when you don’t
explicitly specify values for properties — except for structure fields. The only
way to name a field in a structure is to set at least one of its properties.
Therefore in the example above, an assert function specifies that field S.r is
of type double, even though double is the default.
Example: Specifying Class and Size of Structure Array
For structure arrays, you must choose a representative element of the array
for specifying the properties of each field. For example, assume you have
defined S as the following 2-by-2 array of MATLAB structures:
S = struct('r',{double(1), double(2)},'i',{int8(4), int8(5)});
The following code specifies the class and size of each field of structure input S
using the first element of the array:
function y = fcn(S)
% Specify the class of the input S as struct.
assert(isstruct(S));
% Specify the size of the fields r and i
2-27
2
Working with Embedded MATLAB MEX
% based on the first element of the array.
assert(all(size(S) == [2 2]));
assert(isa(S(1).r,'double'));
assert(isa(S(1).i,'int8'));
Note In most cases, Embedded MATLAB MEX uses defaults when you don’t
explicitly specify values for properties — except for structure fields. The only
way to name a field in a structure is to set at least one of its properties.
Therefore in the example above, an assert function specifies that field S(1).r
is of type double, even though double is the default.
2-28
Compiling Your M-File
Compiling Your M-File
In this section...
“Running Embedded MATLAB MEX” on page 2-29
“Generated Files and Locations” on page 2-29
Running Embedded MATLAB MEX
You run Embedded MATLAB MEX from the MATLAB command prompt by
using the emlmex function. The basic command is:
emlmex M_fcn
By default, emlmex performs the following actions:
• Searches for the function M_fcn stored in the file M_fcn.m as specified in
“Compile Path Search Order” on page 2-7.
• Compiles M_fcn, checking for compliance with Embedded MATLAB.
• If there are no errors or warnings, generates a platform-specific C-MEX
file in the current directory, using the naming conventions described in
“Naming Conventions” on page 2-8.
• If there are errors, does not generate a C-MEX file, but produces an error
report in a default output directory, as described in “Generated Files and
Locations” on page 2-29. Error reports are described in “Working with
Compilation Reports” on page 2-31.
• If there are warnings, but no errors, generates a platform-specific C-MEX
file in the current directory, but does report the warnings.
You can modify this default behavior by specifying one or more compiler
options with emlmex, separated by spaces on the command line. See “Options”
on page 4-2 for emlmex in Chapter 4, “Functions — Alphabetical List”.
Generated Files and Locations
By default, Embedded MATLAB MEX generates files in the following
locations:
2-29
2
Working with Embedded MATLAB MEX
Generates:
In:
Platform-specific C-MEX files
Current directory
MAT-file
Default output directory:
(contains compilation information
such as the name, size, and class of
the M-code variables)
HTML reports
emcprj/mexfcn/M_fcn_name/M_fcn_name_report.mat
Default output directory:
(if errors or warnings occur during
compilation)
emcprj/mexfcn/M_fcn_name/html
You can change the name and location of generated files by using the options
-o and -d when you run Embedded MATLAB MEX (see emlmex).
2-30
Working with Compilation Reports
Working with Compilation Reports
In this section...
“About Compilation Reports” on page 2-31
“Location of Compilation Reports” on page 2-31
“Description of Compilation Reports” on page 2-31
About Compilation Reports
Embedded MATLAB MEX automatically generates reports in HTML format
when errors or warnings occur at compile time. You can use these reports for
debugging your M-code and verifying compliance with Embedded MATLAB.
Location of Compilation Reports
Embedded MATLAB MEX describes errors and warnings in HTML reports at
the following location:
output_directory/mexfcn/
primary_function_name/html/
primary_function_name_report.html
Note The default output directory is emcprj, but you can specify a different
directory with the -d option (see emlmex).
Description of Compilation Reports
Embedded MATLAB MEX automatically reports errors and warnings. If
errors occur during compilation, Embedded MATLAB MEX does not generate
C-MEX code. If compilation produces warnings, but no errors, Embedded
MATLAB MEX does generate C-MEX code, but displays the warning
messages.
Reports present error and warning messages in two views:
• List view (default)
2-31
2
Working with Embedded MATLAB MEX
For example:
• Tree view
For example:
In either view, the Location link brings you to the offending code in the
source file, while the Message link highlights the location of the offending
code in the source listing, as in this example:
2-32
Working with Compilation Reports
2-33
2
2-34
Working with Embedded MATLAB MEX
3
Calling C Functions from
Embedded MATLAB
The eml C Interface (p. 3-2)
Describes the eml interface and its
functions
Calling External C Functions (p. 3-5)
Describes the workflow and best
practices for using the eml interface
Including Custom C Functions in
Generated Code (p. 3-7)
Explains how to include custom
C functions in code generated
for simulation and real-time
applications
Code Examples (p. 3-11)
Presents code examples that
illustrate how to use the eml
interface
How Embedded MATLAB Infers C
Data Types (p. 3-15)
Explains how Embedded MATLAB
infers data types for C in generated
code
3
Calling C Functions from Embedded MATLAB
The eml C Interface
In this section...
“What Is the eml C Interface?” on page 3-2
“Calling External C Functions” on page 3-2
“Passing Arguments by Reference to External C Functions” on page 3-3
“Declaring Data” on page 3-4
What Is the eml C Interface?
The eml C interface provides a method for calling external C functions from
Embedded MATLAB functions using eml functions. In addition to using the
eml functions, you need to include C libraries, object files, and header files to
configure your environment.
The eml C interface lets you:
• Use legacy C code in Embedded MATLAB.
• Use your own optimized C functions instead of generated code.
• Interface your libraries and hardware with Embedded MATLAB.
The eml interface provides unrestricted access to arbitrary C code. Misuse of
the interface or errors in your C code can crash or destabilize MATLAB.
Calling External C Functions
Use the eml.ceval function to call external C functions from an Embedded
MATLAB function. eml.ceval passes function input and output arguments
to C functions by value or reference. You must define C functions called by
Embedded MATLAB functions in external C source files or in C libraries, not
in the model that contains the Embedded MATLAB function.
3-2
The eml C Interface
Passing Arguments by Reference to External C
Functions
The eml interface provides the following constructs that allow you to pass
Embedded MATLAB variables as arguments by reference to external C
functions:
• eml.ref — pass value by reference
• eml.rref — pass read-only value by reference
• eml.wref — pass write-only value by reference
These constructs offer the following benefits:
• Passing values by reference optimizes memory use.
When you pass arguments by value, Embedded MATLAB passes a copy
of the value of each argument to the C function to preserve the original
values. When you pass arguments by reference, Embedded MATLAB does
not copy values. The memory savings can be significant if you need to
pass large matrices to the C function.
• Passing write-only values by reference returns multiple outputs.
By using eml.wref, you can achieve the effect of returning multiple outputs
from your C function, including arrays and matrices (see “Returning
Multiple Values from C Functions” on page 3-11). Otherwise, the C function
can return only a single scalar value through its return statement.
When you pass arguments by reference using eml.rref, eml.wref, and
eml.ref, the corresponding C function signature must declare these variables
as pointers of the same data type. Otherwise, the C compiler generates a
type mismatch error.
Do not store pointers that you pass to C functions because the results can be
unpredictable. For example, if Embedded MATLAB passes a pointer to an
array using eml.ref, eml.rref, or eml.wref, then the C function can modify
the data in the array—but you should not store the pointer for future use.
For example, suppose your model contains an Embedded MATLAB function
that calls an external C function ctest:
3-3
3
Calling C Functions from Embedded MATLAB
function y = fcn()
u = pi;
y = 0;
y = eml.ceval('ctest',u);
Now suppose the C function signature is:
real32_T ctest(real_T *a)
When you compile the model, you get a type mismatch error because
eml.ceval calls ctest with an argument of type double when ctest expects
a pointer to a double-precision, floating-point value.
Match the types of arguments in eml.ceval with their counterparts in the
C function. For instance, you can fix the error in the previous example by
passing the argument by reference:
y = eml.ceval('ctest', eml.rref(u));
You can pass a reference to an element of a matrix. For example, to pass the
second element of the matrix v, you can use the following code:
y = eml.ceval('ctest', eml.ref(v(1,2));
Declaring Data
The eml interface provides the construct eml.opaque that allows you to
manipulate C data that Embedded MATLAB does not understand. You can
store the opaque data in a variable or structure field and pass it to, or return
it from, a C function using eml.ceval.
3-4
Calling External C Functions
Calling External C Functions
In this section...
“Workflow for Calling External C Functions” on page 3-5
“eml Custom C Interface Best Practices” on page 3-6
Workflow for Calling External C Functions
To call external C functions from Embedded MATLAB using the eml interface:
1 Write your C functions in external source files or libraries.
2 Create header files, if necessary.
The header file defines the data types used by the C functions that
Embedded MATLAB generates in code, as described in “Mapping MATLAB
Types to C” on page 3-15.
Tip One way to add these type definitions is to include the header file
tmwtypes.h, which defines all general data types supported by MATLAB.
This header file is in matlabroot/extern/include. If you plan to
generate Real-Time Workshop code, check the definitions in tmwtypes.h to
determine if they are compatible with your Real-Time Workshop target. If
not, define these types in your own header files.
3 In your Embedded MATLAB script, add calls to eml.ceval to invoke your
external C functions.
You must add one eml.ceval statement for each C function that you wish
to make. In your eml.ceval statements, use eml.ref, eml.rref, and
eml.wref constructs as needed (see “Passing Arguments by Reference to
External C Functions” on page 3-3).
4 Include the custom C functions in generated code (see “Including Custom C
Functions in Generated Code” on page 3-7).
5 Configure your C compiler to treat warnings as errors (optional).
3-5
3
Calling C Functions from Embedded MATLAB
This step ensures that you catch type mismatches between C and
Embedded MATLAB (see “How Embedded MATLAB Infers C Data Types”
on page 3-15).
6 Build your model and fix errors.
7 Run your model.
eml Custom C Interface Best Practices
The following are recommended practices when using the eml interface.
• Start small. — Create a test function and learn how the eml interface
works.
• Use separate files. — Create an M-file for each C function that you call.
Make sure that each call to the C function has the correct type.
3-6
Including Custom C Functions in Generated Code
Including Custom C Functions in Generated Code
In this section...
“Including C Functions in Simulation Targets” on page 3-7
“Including C Functions in Real-Time Workshop Targets” on page 3-10
Including C Functions in Simulation Targets
To include the C functions that you call from Embedded MATLAB functions
in code generated for simulation, follow these steps:
1 Open the Embedded MATLAB editor.
2 Click the Simulation Target icon.
The Simulation Target dialog opens.
3-7
3
Calling C Functions from Embedded MATLAB
3 In the Simulation Target dialog, click the Custom Code tab.
4 In the Simulation Target dialog, enter the following information:
To include:
Enter:
Where?
C header files
associated with your
custom C functions
Names of one or more header
files, one on each line, in this
format:
Include Code
tab
#include "file_name.h"
3-8
Including Custom C Functions in Generated Code
To include:
Enter:
Where?
Paths to the external
C header files and
source code
One or more relative paths,
separated by commas, spaces,
or new lines
Include Paths
tab
Note Paths should be
relative to the directory where
your model resides.
Source files for your
custom C functions
Names of one or more C source
files, separated by commas,
spaces, or new lines
Source Files
tab
Libraries
Names of one or more static
libraries containing your
custom object code, separated
by commas, spaces, or new
lines
Libraries tab
For example, suppose your Embedded MATLAB function calls a C function
with the prototype declared in c_sort.h and defined in c_sort.c. Both
files reside in the same directory as the parent model. To include the C
header file in generated code, enter this information:
To include the source file in generated code, enter this information:
3-9
3
Calling C Functions from Embedded MATLAB
5 Click OK.
Including C Functions in Real-Time Workshop Targets
To generate code for real-time applications, you must have licenses for
Real-Time Workshop and, optionally, for Real-Time Workshop Embedded
Coder for production applications. For information about licensing, contact
MathWorks Technical Support: www.mathworks.com/support.
To include your custom C functions in code generated by Real-Time Workshop:
• For Simulink models, see “Configuring Custom Code” in the Real-Time
Workshop User’s Guide.
• For MATLAB code, see “Working with Embedded MATLAB Coder” in the
Real-Time Workshop User’s Guide.
3-10
Code Examples
Code Examples
In this section...
“Returning Multiple Values from C Functions” on page 3-11
“Calling an External C Sort Function” on page 3-12
Returning Multiple Values from C Functions
The C language restricts functions from returning multiple outputs; instead,
they return only single, scalar values. The constructs eml.ref and eml.wref
allow Embedded MATLAB functions to exchange multiple outputs with the
external C functions that they call.
For example, suppose you write an Embedded MATLAB function foo that
takes two inputs x and y, and returns three outputs a, b, and c. In Embedded
MATLAB, you call this function as follows:
[a, b, c] = foo (x, y)
If you rewrite foo as a C function, you cannot return a, b, and c through the
return statement. You can create C functions with multiple pointer type
input arguments, and pass the output parameters by reference. Then you
can call the C functions with multiple outputs from Embedded MATLAB
functions using eml.wref constructs:
eml.ceval ('foo', eml.rref(x), eml.rref(y), ...
eml.wref(a), eml.wref(b), eml.wref(c));
Similarly, suppose that one of the outputs a is also an input argument. In this
case, you call the Embedded MATLAB function foo as in this example:
[a, b, c] = foo (a)
To call a C version of foo with the same arguments from Embedded MATLAB,
use eml.wref and eml.rref constructs:
eml.ceval ('foo', eml.rref(a), eml.wref(a),
eml.wref(b), eml.wref(c));
3-11
3
Calling C Functions from Embedded MATLAB
Calling an External C Sort Function
This example shows how to call a custom C sort function from an Embedded
MATLAB Function block in a Simulink model.
C Sort Example: The Simulink Model
The Simulink model that calls the C sort function looks like this:
This model contains an Embedded MATLAB Function block with one input
u and one output y. Input u is an unsorted vector constant; output y is the
sorted vector. The Embedded MATLAB function calls a custom C function
to sort the vector:
function y = my_sort(u)
% Constrain y to the same size and class as u
y = u;
% Identify the MATLAB function 'disp' as an extrinsic function
eml.extrinsic('disp');
% Constrain the return type of C function c_sort
% to a logical value
s = false;
3-12
Code Examples
% Call 'c_sort' with arguments:
%
numel(y)
- The number of elements of y
%
eml.rref(y) - A read only reference to input y
%
eml.wref(y) - A write only reference to output y
s = eml.ceval('c_sort', eml.rref(y),
eml.wref(y), int32(numel(y)));
if s % Already sorted
disp('Already sorted.');
end
Note In this Embedded MATLAB code:
• To optimize memory allocation, Embedded MATLAB uses the same
memory location to store the unsorted input vector u and the sorted output
vector y. Passing eml.rref(y) and eml.wref(y) requires the C function to
read from and write to the memory location referenced by y. The memory
can be shared because u is the same type and size as y, and because the C
function uses an algorithm that sorts in place.
• Embedded MATLAB cannot infer the types of the output y or the C function
return value s, so you must set them explicitly before calling eml.ceval.
C Sort Example: The Custom C Code
The Embedded MATLAB function calls a C function that uses a custom C
header file. The header file c_sort.h contains the following code:
#include <tmwtypes.h>
boolean_T c_sort(real_T *U, real_T *Y, int32_T n);
Note In this header file, tmwtypes.h defines all general data types supported
by Embedded MATLAB (see “Calling External C Functions” on page 3-5).
3-13
3
Calling C Functions from Embedded MATLAB
The function c_sort.c contains the following code:
#include <stdio.h>
#include <stdlib.h>
#include "c_sort.h"
static int my_cmp(void *A, void *B)
{
real_T A1 = *((real_T *)A);
real_T B1 = *((real_T *)B);
if (A1 < B1) return -1;
if (A1 > B1) return 1;
return 0;
}
boolean_T c_sort(real_T *U, real_T *Y, int32_T n)
{
boolean_T sorted = 1;
int i;
for (i = 0; i < n-1; i++) {
if (U[i] > U[i+1]) sorted = 0;
}
for (i = 0; i < n; i++) {
Y[i] = U[i];
}
if (~sorted) {
qsort(Y, n, sizeof(real_T), my_cmp);
}
return sorted;
}
Note In this C function, the statement Y[i] = U[i] ensures that the C
function writes to all elements of Y, a requirement when you pass the variable
through eml.wref to the C function (see eml.wref).
3-14
How Embedded MATLAB Infers C Data Types
How Embedded MATLAB Infers C Data Types
In this section...
“Mapping MATLAB Types to C” on page 3-15
“Mapping embedded.numerictypes to C” on page 3-16
“Mapping Arrays to C” on page 3-17
“Mapping Complex Values to C” on page 3-17
“Mapping Structures to C Structures” on page 3-18
“Mapping Strings to C” on page 3-18
Mapping MATLAB Types to C
The C type associated with an Embedded MATLAB variable or expression
is based on the following properties:
• Class
• Size
• Complexity
The following translation table shows the MATLAB types supported by
Embedded MATLAB, and how Embedded MATLAB infers the generated
code types.
MATLAB Type
C Type
C Reference Type
int8
int8_T
int8_T *
int16
int16_T
int16_T *
int32
int32_T
int32_T *
uint8
uint8_T
uint8_T *
uint16
uint16_T
uint16_T *
uint32
uint32_T
uint32_T *
double
real_T
real_T *
single
real32_T
real32_T *
3-15
3
Calling C Functions from Embedded MATLAB
MATLAB Type
C Type
C Reference Type
char
char
char *
logical
boolean_T
boolean_T *
fi
numericaltype also influences the C type. Integer
type varies according to the Embedded MATLAB
fixed-point type, as described in“Mapping
embedded.numerictypes to C” on page 3-16.
struct
Fields also affect the C type. See “Mapping
Structures to C Structures” on page 3-18.
complex
See “Mapping embedded.numerictypes to C” on
page 3-16.
function handles
Not supported.
Mapping embedded.numerictypes to C
The following translation table shows how Embedded MATLAB infers integer
types from fixed-point objects. In the first column, the fixed-point types are
specified by the Fixed-Point Toolbox numerictype function:
numerictype(signedness, word length, fraction length)
The Embedded MATLAB integer type is the next larger target word size that
can store the fixed-point value, based on its word length. The sign of the
integer type matches the sign of the fixed-point type.
3-16
embedded.numerictype
C Type
C Reference Type
numerictype(1, 16, 15)
int16_T
int16_T *
numerictype(1, 13, 10)
int16_T
int16_T *
numerictype(0, 19, 15)
uint32_T
uint32_T *
numerictype(1, 8, 7)
int8_T
int8_T *
How Embedded MATLAB Infers C Data Types
Mapping Arrays to C
The following translation table shows how Embedded MATLAB determines
array types and sizes in generated code. In the first column, the arrays are
specified by the MATLAB zeros function:
zeros(number of rows, number of columns, data type)
Embedded MATLAB array data is laid out in column major order.
Array
C Type
C Reference Type
zeros(10, 5, 'int8')
int8_T *
int8_T *
zeros(5, 10, 'int8')
int8_T *
int8_T *
zeros(3, 7)
real_T *
real_T *
zeros(10, 1, 'single')
real32_T *
real32_T *
Mapping Complex Values to C
The following translation table shows how Embedded MATLAB infers
complex values in generated code.
Complex
C Type
C Reference Type
complex int8
cint8_T
cint8_T *
complex int16
cint16_T
cint16_T *
complex int32
cint32_T
cint32_T *
complex uint8
cuint8_T
cuint8_T *
complex uint16
cuint16_T
cuint16_T *
complex uint32
cuint32_T
cuint32_T *
complex double
creal_T
creal_T *
complex single
creal32_T
creal32_T *
Embedded MATLAB defines each complex value as a structure with a real
component re and an imaginary component im, as in this example from
tmwtypes.h:
3-17
3
Calling C Functions from Embedded MATLAB
typedef struct {
real32_T re;/* Real component*/
real32_T im;/* Imaginary component*/
} creal32_T;
Embedded MATLAB uses the names re and im in generated code to represent
the components of complex numbers. For example, suppose you define
a variable x of type creal32_T. The generated code references the real
component as x.re and the imaginary component as x.im.
If your C library requires a different representation, you can define your
own versions of Embedded MATLAB complex types, but you must use the
names re for the real components and im for the imaginary components in
your definitions.
Embedded MATLAB represents a matrix of complex numbers as an array
of structures.
Mapping Structures to C Structures
Embedded MATLAB translates structures to C types field-by-field. The order
of the field items is preserved as given in MATLAB. To control the name of the
generated C structure type, or provide a definition, use the eml.cstructname
function.
Note Arrays in structures translate into single-dimension arrays, not
pointers.
Mapping Strings to C
Embedded MATLAB translates MATLAB strings to C character matrices.
Character matrices cannot be used as substitutes for C strings because they
are not null terminated. You can terminate a MATLAB string with a null
character by appending a zero to the end of the string: ['sample string'
0]. A single character translates to a C char type, not a C string.
3-18
How Embedded MATLAB Infers C Data Types
Caution Failing to null-terminate your MATLAB strings causes C code to
crash without compiler errors or warnings.
3-19
3
3-20
Calling C Functions from Embedded MATLAB
4
Functions — Alphabetical
List
emlmex
Purpose
Generate C-MEX code from M-code
Syntax
emlmex [-options] fun
Description
emlmex is a MATLAB command that invokes Embedded MATLAB MEX.
You issue the emlmex command from the MATLAB command prompt.
emlmex [-options] fun translates the M-file fun.m to a C-MEX file
and generates all necessary wrapper files.
By default, emlmex:
• Converts the M-function fun.m to a C-MEX function
• Generates a platform-specific MEX-file in the current directory
• Stores generated files in the subdirectory emcprj/ mexfcn/fun/
You can change the default behavior by specifying one or more
compilation options as described in “Options” on page 4-2.
Options
You can specify one or more compilation options with each emlmex
command. Use spaces to separate options and arguments. Embedded
MATLAB MEX resolves options from left to right, so if you use
conflicting options, the rightmost one prevails. Here is the list of emlmex
options:
• “-d Specify Output Directory” on page 4-3
• “-eg Specify Input Properties by Example” on page 4-3
• “-F Specify Default fimath” on page 4-3
• “-g Compile C-MEX Function in Debug Mode” on page 4-4
• “-I Add Directories to Embedded MATLAB Path” on page 4-4
• “-N Specify Default Numeric Type” on page 4-4
• “-o Specify Output File Name” on page 4-5
• “-O Specify Compiler Optimization Option” on page 4-5
4-2
emlmex
• “-? Display Help” on page 4-5
-d Specify Output Directory
-d out_directory
Store generated files in directory path specified by out_directory. If
any directories on the path do not exist, Embedded MATLAB MEX
creates them for you. out_directory can be an absolute path or
relative path. If you do not specify an output directory, Embedded
MATLAB MEX stores generated files in a default subdirectory called
emcprj/mexfcn/fun.
-eg Specify Input Properties by Example
-eg example_inputs
Use the values in cell array example_inputs as sample inputs for
defining the properties of the primary M-function inputs. The cell array
should provide the same number and order of inputs as the primary
function. See “Defining Input Properties by Example at the Command
Line” on page 2-17.
-F Specify Default fimath
-F fimath
Use fimath as the default fimath object for all fixed-point inputs
to the primary function. You can define the default value using the
Fixed-Point Toolbox fimath function, as in this example:
emlmex -F fimath('OverflowMode','saturate','RoundMode','nearest') myFcn
Embedded MATLAB MEX uses the default value if you have not defined
any other fimath property for the primary, fixed-point inputs, either by
example (see “Defining Input Properties by Example at the Command
Line” on page 2-17) or programmatically (see “Defining Input Properties
Programmatically in the M-File” on page 2-19). If you do not define a
default value, then you must use one of the other methods to specify the
fimath property of your primary, fixed-point inputs.
4-3
emlmex
-g Compile C-MEX Function in Debug Mode
Compile the C-MEX function in debug mode, with optimization turned
off. If you do not specify -g, emlmex compiles the C-MEX function
in optimized mode. You specify these modes using the mex -setup
procedure described in “Building MEX-Files” in the MATLAB External
Interfaces documentation.
-I Add Directories to Embedded MATLAB Path
-I include_path
Add include_path to the Embedded MATLAB path. By default, the
Embedded MATLAB path consists of the current directory (pwd) and
the Embedded MATLAB libraries directory. emlmex converts M-code
to C-MEX code only if it finds the M-file on the Embedded MATLAB
path. See .
-N Specify Default Numeric Type
-N numerictype
Use numerictype as the default numerictype object for all fixed-point
inputs to the primary function. You can define the default value using
the Fixed-Point Toolbox numerictype function, as in this example:
emlmex -N numerictype(1,32,23) myFcn
This command specifies that the numeric type of all fixed-point inputs
to the top-level function myFcn be signed (1), have a word length of 32,
and have a fraction length of 23.
Embedded MATLAB MEX uses the default value if you have not
specified any other numeric type for the primary, fixed-point inputs,
either by example (see “Defining Input Properties by Example at the
Command Line” on page 2-17) or programmatically (see “Defining Input
Properties Programmatically in the M-File” on page 2-19). If you do not
define a default value, then you must use one of the other methods to
specify the numeric type of your primary, fixed-point inputs.
4-4
emlmex
-o Specify Output File Name
-o output_file_name
Generate the final output file, the C-MEX function, with the base name
output_file_name. Embedded MATLAB MEX automatically assigns
C-MEX files a platform-specific extension (see ).
You can specify output_file_name as a file name or an existing path,
with the following effects:
If you specify:
emlmex:
A file name
Copies the MEX-file to the
current directory
An existing path
Generates the MEX-file in the
directory specified by the path,
but does not copy the MEX-file to
the current directory
A path that does not exist
Generates an error
-O Specify Compiler Optimization Option
-O optimization_option
Specify compiler optimization_option with one of the following
literals (no quotes):
Compiler Optimization Option
Action
disable:inline
Disable function inlining.
enable:inline
Enable function inlining (default).
-? Display Help
Display emlmex command help.
Examples
This section presents examples based on an M-file emcrand.m, described
in “Sample M-File” on page 4-6.
4-5
emlmex
Sample M-File
function r = emcrand(num)
assert(isa(num,'double'));
persistent seeded;
if isempty(seeded)
seeded = true;
rand('seed', num);
end
r = rand();
Converting M-Function to C-MEX Function
emlmex emcrand
Generates a C-MEX function. Places the C-MEX function and other
supporting files in a subdirectory called emcprj/mexfcn/emcrand, the
default location. emlmex uses the name of the M-function as the root
name for the generated files and creates a platform-specific extension
for the C-MEX file, as described in .
Specifying Custom Name for C-MEX File
emlmex -o emcrandmx emcrand
Uses emcrandmx as the root name of the C-MEX file, but uses emcrand
as the root name for all other generated files. Generates all files to the
default directory emcprj/mexfcn/emcrand, but also makes a copy of the
C-MEX file in the current directory.
Specifying Custom File Name as Path
emlmex -o mydir/emcrandx emcrand
Generates all files in an existing subdirectory called mydir, using
emcrandx as the root name of the C-MEX file. When the argument is a
path, emlmex does not copy the C-MEX file to the current directory.
Specifying Custom Output Directory for C-MEX File
emlmex -d mydir emcrand
4-6
emlmex
Generates all files in the subdirectory mydir with the M-function name
as the root name for all files.
Specifying Primary Function Input Properties by Example
Currently, the M-function emcrand (described in ) uses the assert
function to specify that its input num is a real double scalar, as follows:
assert(isa(num,'double'));
Note For information about using assert to specify input properties
for emlmex, see “Defining Input Properties Programmatically in the
M-File” on page 2-19.
Suppose you instead want to specify the primary function input
properties by example at the command line. Remove the assert call
from the M-code and enter this command:
emlmex -eg {0} emcrand
The value in the cell array {0} is a real double scalar, exemplifying the
properties that you want to specify for input num.
4-7
eml.ceval
Purpose
Evaluate external C function
Syntax
[y =] eml.ceval('function_name', u1 ..., un);
Arguments
function_name
External C function to execute.
u1 ..., un
Expressions or function calls using eml.rref, eml.wref, and
eml.ref.
Description
[y =] eml.ceval('function_name', u1 ..., un); executes the
external C function specified by the quoted string function_name
with optional arguments u1 ..., un. You must define the C
function function_name in an external C source file or library. The
function_name parameter cannot contain path information.
Optionally, eml.ceval can return a single scalar value, corresponding
to the value returned by the C function in the return statement. To be
consistent with C, eml.ceval cannot return a vector or matrix.
Note To allow Embedded MATLAB to infer the data type of return
values and output arguments, you must constrain their values before
calling eml.ceval (see “Example” on page 4-8).
Caution
eml.ceval is an Embedded MATLAB only function. Using it in
MATLAB generates an error.
Example
4-8
Assume that you want to call the C function foo(u), which takes an
input of type real_T and returns a value of type int32. To call this C
function from an Embedded MATLAB function, use the following code:
eml.ceval
y = int32(0); %Constrain the return type to int32_T
y = eml.ceval('foo', 10);
For this function call, Real-Time Workshop generates the following code:
int32_T eml_y;
eml_y = foo(10.0);
In this example, Embedded MATLAB cannot infer the type of the return
value because it is defined in the C function. Therefore, you must
constrain the return type to match the C function. Mismatched types
are detected by the C compiler and generate compiler errors.
The type of the argument—in this case, the constant 10—is not specified.
Therefore, the argument implicitly defaults to double-precision,
floating-point type, because the default data type in MATLAB is double.
To specify a type explicitly, cast the argument, as in this example:
y = eml.ceval('foo', int32(10));
In this case, the generated code for the function call looks like this:
int32_T eml_y;
eml_y = foo(10);
By default, eml.ceval passes arguments by value to the C function
whenever C supports passing arguments by value. To make eml.ceval
pass arguments by reference, use the constructs eml.rref, eml.wref,
and eml.ref (see “Passing Arguments by Reference to External C
Functions” on page 3-3). If C does not support passing arguments by
value, eml.ceval passes arguments by reference. In this case, if the
eml.ref, eml.rref, and eml.wref constructs are not used, a copy of
the argument is introduced.
See Also
eml.ref, eml.rref, eml.wref
4-9
eml.cstructname
Purpose
Specify structure name in generated code
Syntax
eml.cstructname(var, 'name', 'extern')
Arguments
var
Structure variable.
name
Specifies name to use for the structure.
'extern' (optional)
Declares an externally defined structure. Embedded MATLAB
does not generate the definition of the structure type; it must be
provided in a custom include file.
Description
eml.cstructname(var, 'name', 'extern') allows you to specify the
name of a structure in generated code.
Note eml.cstructname has no effect in MATLAB; it applies to
Embedded MATLAB only.
Example
The following code is used by Embedded MATLAB to assign the name
MyPointType to the structure var.
% Declare a MATLAB structure.
var.x = 1;
var.y = 2;
% Instruct Embedded MATLAB to assign the name MyPointType
% to the type of var.
eml.cstructname(var, 'MyPointType', 'extern');
% The type of var matches foo's signature.
eml.ceval('foo', eml.rref(var));
4-10
eml.cstructname
The corresponding C code looks like this:
typedef struct { x, y: double; } MyPointType;
void foo(const MyPointType *ptr);
4-11
eml.extrinsic
Purpose
Declare extrinsic function or functions
Syntax
eml.extrinsic('function_name');
eml.extrinsic('function_name_1', ...
, 'function_name_n');
Arguments
function_name
function_name_1', ... , 'function_name_n
Declares function_name or function_name_1 through
function_name_n as extrinsic functions.
Description
eml.extrinsic declares extrinsic functions. An extrinsic function is a
function executed by MATLAB during simulation. Embedded MATLAB
does not compile or generate code for extrinsic functions, provided
they do not affect execution of the host function; otherwise, Embedded
MATLAB issues compilation errors.
Caution
eml.extrinsic is an Embedded MATLAB only function. Using it in
MATLAB generates an error.
Example
The following code declares the MATLAB find function extrinsic in the
Embedded MATLAB foo function:
function y = foo
eml.extrinsic('find');
x = ones(4);
y = x;
y = find(x);
4-12
eml.opaque
Purpose
Declare variable in generated code
Syntax
y = eml.opaque(type,[value]);
Arguments
y
Specifies the variable declared in the generated code.
type
Specifies the data type. Specify a C type defined in the user
include file to avoid compilation errors. The C type provided must
support assignment in C.
Note Arrays in C cannot be directly assigned, for example, the
type declaration int[50] is not valid.
value (optional)
Specifies the data value declaration. Specify a C expression not
dependent on Embedded MATLAB variables or functions.
If you do not define an initial value, you must initialize the value
before using the data. Using the data without prior assignment
can lead to compilation errors.
Description
y = eml.opaque(type,[value]); declares data of the type type, and
the optional initial value value. eml.opaque allows you to manipulate
C data that Embedded MATLAB does not understand. type and value
are treated as strings by Embedded MATLAB. Data initialized with
eml.opaque can be:
• Assigned to each other as long as their types are identical
• An argument to eml.rref, eml.wref, or eml.ref
• An input or output argument to eml.ceval
4-13
eml.opaque
• An input or output argument to a user-written Embedded MATLAB
function
• An input to a limited subset of Embedded MATLAB library functions
eml.opaque declares the type of a variable; it does not instantiate the
variable. You can instantiate a variable using eml.ceval after declaring
the variable type with eml.opaque. For example:
% Declare fp1 of type FILE *
fp1 = eml.opaque('FILE *');
%Create the variable fp1
fp1 = eml.ceval('fopen', cstring('filetest.m'), cstring('r'));
Example
The following example uses eml.opaque to declare a variable f as a
FILE * type.
% This example returns its own source code by using
% fopen/fread/fclose.
function buffer = filetest
% Declare 'f' as an opaque type 'FILE *'
f = eml.opaque('FILE *', 'NULL');
% Open file in binary mode
f = eml.ceval('fopen', cstring('filetest.m'), cstring('rb'));
% Read from file until end of file is reached and put
% contents into buffer
n = int32(1);
i = int32(1);
buffer = char(zeros(1,8192));
while n > 0
% By default, Embedded MATLAB converts all constant values
% to doubles, so explicit type conversion to in32 is inserted.
n = eml.ceval('fread', eml.ref(buffer(i)), int32(1), ...
int32(numel(buffer)), f);
i = i + n;
4-14
eml.opaque
end
eml.ceval('fclose',f);
buffer = strip_cr(buffer);
% Put a C termination character '\0' at the end of MATLAB string
function y = cstring(x)
y = [x char(0)];
% Remove all character 13 (CR) but keep character 10 (LF)
function buffer = strip_cr(buffer)
j = 1;
for i = 1:numel(buffer)
if buffer(i) ~= char(13)
buffer(j) = buffer(i);
j = j + 1;
end
end
buffer(i) = 0;
See Also
eml.ceval, eml.ref, eml.rref, eml.wref
4-15
eml.ref
Purpose
Pass argument by reference as read input or write output
Syntax
[y =] eml.ceval('function_name', eml.ref(arg), ... un)
Arguments
arg
Variable passed by reference as an input or an output to the
external C function called in eml.ceval.
Description
[y =] eml.ceval('function_name', eml.ref(arg), ... un)
passes the variable arg by reference as an input or an output to the
external C function called in eml.ceval. You add eml.ref inside
eml.ceval as an argument to function_name. The argument list can
contain multiple eml.ref constructs. Add a separate eml.ref construct
for each argument that you want to pass by reference to function_name.
Caution
eml.ref is an Embedded MATLAB only function. Using it in MATLAB
generates an error.
Example
In the following example, an Embedded MATLAB function fcn has a
single input u and a single output y. fcn calls a C function my_fcn,
passing u by reference as an input. The value of output y is passed to
fcn by the C function through its return statement.
Here is the Embedded MATLAB function code:
function y = fcn(u)
y = 0; %Constrain return type to double
y = eml.ceval('my_fcn', eml.ref(u));
The corresponding C function prototype looks like this:
real_T my_fcn(real_T *a)
4-16
eml.ref
In this example, Embedded MATLAB infers the type of the input u from
its definition in the parent model.
The C function prototype defines the input as a pointer because it is
passed by reference.
Embedded MATLAB cannot infer the type of the output y, so you must
set it explicitly—in this case to a constant value 0 whose type defaults
to double, matching the C type real_T. For a list of type mappings, see
“Mapping MATLAB Types to C” on page 3-15.
See Also
eml.ceval, eml.rref, eml.wref
4-17
eml.rref
Purpose
Pass argument by reference as read-only input
Syntax
[y =] eml.ceval('function_name', eml.rref(argI), ... un)
Arguments
argI
Variable passed by reference as a read-only input to the external
C function called in eml.ceval.
Description
[y =] eml.ceval('function_name', eml.rref(argI), ... un)
passes the variable argI by reference as a read-only input to the
external C function called in eml.ceval. You add eml.rref inside
eml.ceval as an argument to function_name. The argument list
can contain multiple eml.rref constructs. Add a separate eml.rref
construct for each read-only argument that you want to pass by
reference to function_name.
Caution
• Embedded MATLAB assumes that a variable passed by eml.rref
is read-only and optimizes the code accordingly. Consequently,
the C function must not write to the variable or results can be
unpredictable.
• eml.ref is an Embedded MATLAB only function. Using it in
MATLAB generates an error.
Example
4-18
In the following example, an Embedded MATLAB function fcn has a
single input u and a single output y. fcn calls a C function foo, passing
u by reference as a read-only input. The value of output y is passed to
fcn by the C function through its return statement.
eml.rref
Here is the Embedded MATLAB function code:
function y = fcn(u)
y = 0; %Constrain return type to double
y = eml.ceval('foo', eml.rref(u));
The corresponding C function prototype looks like this:
real_T foo(real_T *a)
In this example, Embedded MATLAB infers the type of the input u from
its definition in the parent model.
The C function prototype defines the input as a pointer because it is
passed by reference.
Embedded MATLAB cannot infer the type of the output y, so you must
set it explicitly—in this case to a constant value 0 whose type defaults
to double, matching the C type real_T. For a list of type mappings, see
“Mapping MATLAB Types to C” on page 3-15.
See Also
eml.ceval, eml.opaque, eml.ref, eml.wref
4-19
eml.target
Purpose
Determine Embedded MATLAB code generation target
Syntax
[y =] eml.target
Description
[y =] eml.target returns a string representing the Embedded
MATLAB code generation target.
Example
String
Description
''
Function is executing in MATLAB
'rtw'
Real-Time Workshop target
'sfun'
S-function target (Simulation target)
'mex'
MEX-function target
'hdl'
Stateflow HDL Coder target
Use eml.target to parameterize your Embedded MATLAB functions
that use custom C code so that they work in MATLAB or MEX.
if isempty(eml.target)
% running in MATLAB
else
% running in Embedded MATLAB
end
See Also
4-20
eml.ceval
eml.wref
Purpose
Pass argument by reference as write-only output
Syntax
[y =] eml.ceval('function_name', eml.wref(argO), ... un);
Arguments
argO
Variable passed by reference as a write-only output to the external
C function called in eml.ceval.
Description
[y =] eml.ceval('function_name', eml.wref(argO), ... un);
passes the variable argO by reference as a write-only output to the
external C function called in eml.ceval. You add eml.wref inside
eml.ceval as an argument to function_name. The argument list
can contain multiple eml.wref constructs. Add a separate eml.wref
construct for each write-only argument that you want to pass by
reference to function_name.
Caution
• Embedded MATLAB assumes that a variable passed by eml.wref is
write-only and optimizes the code accordingly. Consequently, the C
function must write to the variable. If the variable is a vector or
matrix, the C function must write to every element of the variable.
Otherwise, results are unpredictable.
• eml.wref is an Embedded MATLAB only function. Using it in
MATLAB generates an error.
Example
In the following example, an Embedded MATLAB function fcn has
a single input u and a single output y, a 5-by-10 matrix. fcn calls a
C function init to initialize the matrix, passing y by reference as a
write-only output. Here is the Embedded MATLAB function code:
function y = fcn(u)
4-21
eml.wref
y = zeros(5,10,'int8'); %Constrain output to an int8 matrix
eml.ceval('init', eml.wref(y));
The corresponding C function prototype looks like this:
void init(int8_T *x);
In this example:
• Although the C function is void, eml.wref allows it to access, modify,
and return a matrix to the Embedded MATLAB function.
• The C function prototype defines the output as a pointer because
it is passed by reference.
• Embedded MATLAB cannot infer the type of the output y, so you
must set it explicitly—in this case to an int8 matrix, matching the
C type int8_T. For a list of type mappings, see “Mapping MATLAB
Types to C” on page 3-15.
• Embedded MATLAB collapses matrices to a single dimension in the
generated C code.
See Also
4-22
eml.ceval, eml.ref, eml.rref
Index
A
Index
arguments
limit on number for Embedded MATLAB
functions 1-78
C
complex variables in Embedded MATLAB
functions 1-12
control flow statements in Embedded
MATLAB 1-16
E
Embedded MATLAB
arithmetic operators 1-17
calling MATLAB functions 1-71
calling MATLAB functions as extrinsic
functions 1-71
calling MATLAB functions using feval 1-73
calling other functions 1-62
calling subfunctions 1-69
code generation for MATLAB function
calls 1-74
compilation directive %#eml 1-67
control flow statements 1-16
converting mxArrays to known types 1-75
creating local variables 1-9
declaring persistent variables 1-10
description 1-2
Embedded MATLAB function library
reference 1-20
function handles 1-91
how it resolves function calls 1-62
initializing persistent variables 1-10
limit on number of function arguments 1-78
logical operators 1-18
MATLAB features not supported 1-3
operators 1-16
pragma 1-67
Real-Time Workshop targets, building 1-74
relational operators 1-17
supported MATLAB functions 1-70
using M-Lint 1-96
variable types 1-8
variables 1-8
variables, complex 1-12
working with mxArrays 1-75
Embedded MATLAB function
signal processing functions 1-56
Embedded MATLAB function library
alphabetical list of functions 1-20
casting functions 1-44
categorized list of functions 1-42
complex number functions 1-44
derivative and integral functions 1-45
discrete math functions 1-45
exponential functions 1-45
filtering and convolution functions 1-46
Fixed-Point Toolbox functions 1-46
histogram functions 1-50
input and output functions 1-50 to 1-51
logical operator functions 1-51
matrix/array functions 1-52
polynomial functions 1-55
relational operator functions 1-55
rounding and remainder functions 1-56
set functions 1-56
special value functions 1-57
specialized math functions 1-58
statistical functions 1-58
string functions 1-59
structure functions 1-59
trigonometric functions 1-59
Embedded MATLAB function library
reference 1-20
eml C Interface
description 3-2
eml.extrinsic 1-71
extrinsic functions 1-71
Index-1
Index
F
O
function handles
in Embedded MATLAB 1-91
functions
limit on number of arguments in Embedded
MATLAB 1-78
operators
arithmetic, in Embedded MATLAB 1-17
logical, in Embedded MATLAB 1-18
relational, in Embedded MATLAB 1-17
I
initialization
persistent variables 1-10
M
MATLAB
features not supported in Embedded
MATLAB 1-3
MATLAB functions
and mxArrays in Embedded MATLAB 1-75
in Embedded MATLAB 1-71
mxArrays
converting to known types 1-75
in Embedded MATLAB 1-75
Index-2
P
persistent variables
declaring in Embedded MATLAB
functions 1-10
initializing in Embedded MATLAB
functions 1-10
S
signal processing functions
for Embedded MATLAB function 1-56
subfunctions in Embedded MATLAB 1-69
V
variable types of Embedded MATLAB 1-8
Download