Documentation aboutMATLAB Coder and using converted code in CCS

14
Documentation aboutMATLAB Coder and using converted code in CCS Nabeel.PM Research Scholar-IIT Madras Healthcare Technology Innovation Centre Indian Institute of Technology Madras Research Park [email protected]

Transcript of Documentation aboutMATLAB Coder and using converted code in CCS

Documentation aboutMATLAB Coder and using

converted code in CCS

Nabeel.PM

Research Scholar-IIT Madras

Healthcare Technology Innovation Centre

Indian Institute of Technology Madras Research Park

[email protected]

MATLAB (matrix laboratory) is a numerical computing environment and fourth-generation

programming language from MathWorks. MATLAB allows matrix manipulations, plotting

of functions and data, implementation of algorithms, creation of user interfaces, and

interfacing with programs written in other languages, including C, C++, Java, and Fortran.

Math Works has now released MATLABCoder. MATLAB version 2012a

onwardsMATLAB coder enables design engineers to automatically generate readable,

portable C and C++ code directly from their MATLAB algorithms. This option eliminates the

need to manually translate MATLAB algorithm code into C and C++ code for prototyping,

implementation and integrationinto the final product.Manually converting from MATLAB to

C can take from days to weeks; also it may introduce design errors. Design engineers can use

MATLAB to speed up development tasks, such as fixed-point design and prototyping, and

then automatically generate C code with MATLAB Coder. This automation results in a

faster, more efficient system-development workflow. Also the latest versions of MATLAB

Coder provide additional options such as ‘Code replacement library’, ‘Test Hardware’,

‘Production Hardware’ etc. These types of options will help us convert the MATLAB

algorithms to C and C++ code which is optimised for our hardware.

These configuration options and advanced optimization options for fine-grain control of the

generated code’s functions, files, and data will improve code efficiency and facilitate

integration with legacy code, data types, and calibration parameters used in production. The

‘Project management’ tool of MATLAB Coder will help to specify entry points, input data

properties, and other code-generation configuration options and also static ordynamic

memory allocation for variable-size data.The generated C code can be used forstandalone

execution,integration with other software,accelerating MATLAB algorithms, embedded

implementation etc.

This Documentation is about detailed explanations and step by step procedures that should be

followed to convert an existing MATLAB code to C/C++ code that are optimised

forparticular test hardware. (Devicevendor: Texas Instruments; Device Type: C600; and

Code replacement library:TIC674x)

Using MATLAB coder

Choosing a Compiler:

Once the MATLAB Compiler andsupported C or C++ compilers areproperly installed, the

user can create C/C++/ MEX-files. If there is only one C or C++ compiler available

thenMATLAB Coder automaticallyconfigures itself for the appropriate compiler. The user

can directly proceed to MATLAB Coder if he does not wish to change the compiler or does

not need to modify the compiler option files. In case theMATLAB Coder returns any error

regarding compiler while convertingMATLAB code, changethe default C or C++ compiler.It

can be done any timeby using the ‘mex –setup’ option.

The following example shows the process of changing default compiler to the Lcc-win32 C

2.4.1

>> mex -setup

Welcome to mex -setup. This utility will help you set up a default compiler. For a list of

supported compilers, see http://www.mathworks.com/support/compilers/R2012b/win32.html

Please choose your compiler for building MEX-files:

Would you like mex to locate installed compilers [y]/n? n

Select a compiler:

[1] Intel C++ 12.0 (with Microsoft Software Development Kit (SDK) linker)

[2] Intel C++ 12.0 (with Microsoft Visual C++ 2008 SP1 linker)

[3] Intel C++ 12.0 (with Microsoft Visual C++ 2010 linker)

[4] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)

[5] Lcc-win32 C 2.4.1

[0] None

Compiler: 5

Your machine has an Lcc-win32 C compiler located at

E:\MATLAB\sys\lcc. Do you want to use this compiler [y]/n? y

Please verify your choices:

Compiler: Lcc-win32 C 2.4.1

Location: E:\MATLAB\sys\lcc

Are these correct [y]/n? y

Trying to update options file:

C:\Users\toshiba\AppData\Roaming\MathWorks\MATLAB\R2012b\mexopts.bat

From template: E:\MATLAB\bin\win32\mexopts\lccopts.bat

Done . . .

Now the C/C++ compiler is ready. Keep the MATLAB code (s) which is to be converted in

to C/C++. (In this documentation, the conversion procedure for MATLAB version R2012b

and MATLAB Coder 2.3 is explained)

Open Coder window using the following command

Or select ‘MATLAB Coder’ from APPS MATLAB Coder.

The following ‘MATLAB coder project’ window will open. In ‘New’ tab give suitable Name

for code conversion project and Location where to create the ‘coder’ folder-‘codegen’. If an

already existing coder project is to be used, choose the same from ‘Open’ tab. Then click OK.

Now add the file (.m file) which is to be convertedto C/C++. Browse for the

requiredMATLAB file by clicking ‘Add files’ in ‘Overview’ tab. The added file should be

available in ‘MATLAB Work folder’

>>Coder

Once the file(s) are added,define the type of each argument that is going to pass in to the

function(s) used inMATLAB file. Here, the working conversion of a bandpass filter function

named as bandpassfilter.m, which has one argument‘in_Frame’ - a double 2000 x 1 array is

shown. If your array size is variable, then give ‘:Inf’ instead of giving a fixed value (2000

here). So the size definition will be :Inf x 1 array. One can also have :Inf x :Inf as per the

nature of the variables in the individual function. Add global variables in “Add global” menu.

This will be used when more than one function is getting converted in the same project.

In case of more than one file in the conversion project, continue adding the files to the

project. Specify global variables in “Add global” menu if any

NB:By default,MATLAB will consider a variable as ‘double’. So if youwant to specify thetype

of any of the arguments ofthe converting function to other than double, make sure that no

mismatch of the type will occur between different variables inside function. If type mismatch

occurs while converting the code,MATLAB coder will return an error (Ex: single ~= double).

If the coder returns any error regarding type mismatch while building the project, either

declare that particular variable as the required type inside the actual MATLAB function. Or

if the type of the variable is not important declare variables as double itself in your

‘Overview’ tab.

After that, go to ‘Build’ tab and specify the type of output file. In the example shown

below,the MATLAB file is to be converted to C/C++ Static Library. The ‘Generate code

only’ option should be selected if it is not necessary to execute the file after generating the

code. Now click on ‘More settings’ to specify your project settings

Onselecting ‘More settings’ option, the following ‘Project settings’ tab will appear. Here,

specify all the project requirements like Path, Speed, Memory, Code Appearance, Debugging,

Custom Code, Hardware etc.

Paths:This is used to specify the details of working folder and Build folder. By default,

working folder will be the sameas Project folder and Build folder will be a subfolder inside

the project folder with name ‘codegen’

Speed: This is used to specify some important options regarding the nature of the variables

present in the converted code.

Saturate on integer overflow: - This parameter applies only to the built in integer type

variables present in the MATLAB algorithm. Most C compilers wrap on overflow. So when

this option is selected,saturation will happen on overflow to either minimum or maximum

that the data type can represent. It is advisable to select this option

Support only purely-integer numbers: -This option is to make sure that only integer type data

is present in the generated code and that only integer operations will be performed. On

selecting this option floating point numbers and floating point operations will not appear in

the generated code. If the variables have floating point operations in algorithm don’t select

this option

Support non-finite numbers: - With this option, generated code will support non finite

numbers (like inf. NaN. -inf). If algorithm does not support non finite number then keep this

option unchecked, so that the generated code will support only bounded finite numbers

Memory: If there are any specific conditions about the dynamic memory allocation inthe

generated code,such as dynamic memory allocation threshold or the maximum usage of stack

etc.,it can be set here. Else, it is advisable to keep these settings as default

Code Appearance: This is used to give options about appearance of the generated code, such

as the type of H and C file(s), comments in the generated code, code style etc.

Generated file partitioning method: - If theMATLAB code or function to be converted

consists of more than one function (nested functions), there are two options here. Either all

the functions can be built in to a single file or a separate file can be generatedfor each

MATLAB file. If ‘all functions in to a single file’ is chosen, then the final generated code

will have only one “.c” file and one“.h” file with main function name (other files like

‘rtwtypes.h’ and ‘_types.h’ will be there with all conversions). Since all the function will be

there in a main “.c” file, linking between different functions will be very easy. The “.h” file

will also have to be included, corresponding to the generated code in the main() function of C

compiler

If proceeding with ‘one file for each MATLAB file’ option, the final generated code will

have separate “.c” and “.h” files for each nested functions of actual MATLAB file/code.

Now, the user will have to make sure that linking between different functions is done

properly in C compiler before executing the generated code. Also include the “.h” files

corresponding to each function in the generated code in the main() function of C compiler.

NB: - For simplicity better go with ‘Generate all functions in to a single file’. If a step by step

analysis of the generated code is required, then proceed with the other option.

Include comments: - This option helps to include comments in the generated code.

‘MATLAB source code as comments’ will give actual MATLAB source code corresponding

to each operation as comments in generated code. ‘MATLAB function help text’ will give

MATLAB help comments corresponding to basic MATLAB operations, which are being

converted in generated code

Code Style: -

If the if-else statements are to be converted to Switch-case statement, use the option

provided for that

In MATLAB algorithm, if the declarations of generated external functions include the

“extern” keyword, then ‘Preserve extern keyword in function declarations’ option

should be selected

Level of parenthesization in the code can be specified in ‘Parentheses’ drop down

menu. By default “Normal (Optimize for readability)” will be selected. It is advisable

to use this default option

Maximum identifier length for variable, typedef, and function names can be set in

“Maximum identifier length”

It is advisable to keep identifier format as default settings only

Debugging: This helps to give options about the code generation report

Custom Code: Custom Code is about customizing the generated code. If want to include

additional Directories, Source files or Libraries in the generated code, browse for the same

and mention its location so thatthose will also get included in the generated code. “Post-code-

generation command” can also be given here

If any additional code is to be included to appear at the top of the generated C/C++ files

(Source file, Header file, Initialize function, and Terminate function), do the coding in the

provided space. Source file, Header file, Initialize function and Terminate function can be

selected from the drop down menu

Hardware:This is used to select the hardware to which the converted code is to be ported,

and so the converted code will be optimized by MATLABfor the specified hardware. A set

of standard commonly using Code replacement library, Test hardware and Production

hardware are available in this window and these can be set the same as per hardware

specifications.

For example,

Device vendor: Texas Instruments

Device Type: C600

Code replacement library: TIC674x

All Settings:This window will show review the settings and preferences opted for the

particular code conversion project

After confirming the settings, close the ‘Project Settings’ widow and build the project

Once the project is successfully built, it will give a report about the same and the converted

code will be savedin the ‘codegen’ folder of MATLAB work folder or the specified location

Sometimes project building may get failed. In most of the case it happens when the output

argument is not assigned to any initial value. C/C++ compilers strictly require the

declarationof variables that are to be used in the project. If the MATLAB code converter is

not able to identify the type and assign its nature by its own, it will show an error. At that

time, it is essential to initialize the variables with suitable value. Similarly,when two arrays

are equated,MATLAB will auto adjust the size but not C/C++ compiler. Hence error due to

size mismatch between two arrays will occurs. So make sure that size of left side array and

right side are the same

‘View Report’ option is very useful in casethe project building fails. It will show which

function and/or which variable has causedthe error. In that case the error messages can be

read and necessary modifications can be done in the MATLAB code accordingly. In most of

the case the error happens due to size mismatch between two arrays and/or ifthe return value

from a function is not initialised with suitable value.

USING CONVERTED CODE IN CCS

Here are some important points to consider while using the converted code

in a C/C++ compiler. CCS v5 is the considered version for this example. So the syntax and

setting that should follow in CCS to use MATLAB converted code is explained below

Copy all the ‘.c’ and ‘.h’ file in to your CCS work folder.

Rename all the ‘.c’ files in to ‘.cpp’

o If code conversion is done with “All functions in to a single file” option then

there will be only one ‘.c’ file and ‘three ‘.h’ files

Include ‘(function_name).h’ file in to main cpp file. ‘(function_name_types).h’ and

‘rtwtypes.h’ need not be included separately

If MATLAB function is using array of variable size (:Inf X n) or (:Inf X :Inf), then

create an EMXARRAY in CCS. Otherwise, the converted function will not be able to

read or write value in arrays declared in CCS

To link between the MATLAB array format and CCS array format,emx create

wrapper “emxCreateWrapper” will be available in ‘(function_name).h’ file. Create

emx array before calling the function which use any CCS array or output of which is

supposed to store in a CCS array

After the use of emx Array destroy the same (not necessary), so that memory can be

reused. Use “emxDestroyArray” from ‘(function_name).h’ to destroy the array

o Example code:

Usually MATLAB to C/C++ converted code will take more time than the same code written

in C/C+ platform. Especially when using standard MATLAB functions directly. It will cause

time balancing problem in CCS project. To save more time the following tips can be used

while programming and using code conversion in MATLAB itself. So hardware specific

programming should be done in MATLAB if time is a critical factor for the real time project.

Use only necessary MATLAB functions

If sizes of the arrays are known, declare them with zeros initially. Also declare

variables with some suitable initial value

Avoid unnecessary function callings

o For example, while using a filter, get the filter coefficients separately and store

them in to suitable variables in main MATLAB function. Use those variables

while calling filter function. Thus filter coefficient calculation time can

besaved

It is also noted that calling many function in a main MATLAB function, as well as

using the converted main function directly in CCS, will take much more time than

using the sub functions separately

o Therefore, the program could be reworked in such a way that user can use each

sub functions separately and combine them to get required main function in

CCS

//declare input and output functions.

double INPUT[2000];

double OUTPUT[500][2];

//creating emx for them.

emxArray_real_T *input=emxCreateWrapper_real_T(INPUT,2000,1);

emxArray_real_T *output=emxCreateWrapper_real_T(INPUT,500,2);

//call function.

function_name(input,other arguments,output);

//destroy unwanted emx array.

emxDestroyArray_real_T(input);

o After properly splitting the main MATLAB function, convert the MATLAB

code in to C/C++ by adding all sub functions in a single project. Give the

project name as main function name (not necessary).Use “All function in a

single file” option while building, so that we will get ‘.c’ and ‘.h’ files with

main function name. (here Walls_n_Dia.c)

o After converting, use each of the functions and make a single function in CCS

as done in MATLAB. Ex: Walls_n_Dia ( );

If the size of Emx array is already known, then create them as global variable instead

of doing inside the function, so that declaration happens only once and thus saving

both time and memory

Destroy Emx array with dynamic size each time after its use to save memory

***