Embedded Coder

Creating a Custom Processor-in-the-Loop (PIL) Configuration

This example shows how to create a target connectivity configuration using the target connectivity APIs. With a target connectivity configuration you can run PIL simulations on custom embedded hardware.

You will learn how to:

  • Adapt the build process to support PIL

  • Configure a tool to use for downloading and starting execution of a PIL executable on your target hardware

  • Configure a communication channel between host and target that is used to support PIL simulation on the target

You will start with a model configured for Software-in-the-Loop (SIL) simulation. This example will guide you through the process of creating a target connectivity configuration that allows you to simulate this model in PIL mode. The example runs entirely on your host machine. However, you can follow the same steps to create a connectivity configuration for your own embedded target hardware.

Note that this example requires the Embedded Coder® product.

See also rtwdemo_sil_pil_scriptrtwdemo_sil_pil_script, rtwdemo_rtiostream_scriptrtwdemo_rtiostream_script


% Later in this example you will add a folder to the path
sl_customization_path = fullfile(matlabroot,...
% If this folder is already on the path, remove it
if strfind(path,sl_customization_path)
% Reset customizations

% Create a temporary folder (in your system's temporary folder) for the
% build and inspection process.
currentDir = pwd;

Verify Generated Code Using SIL Simulation

Simulate a model configured for SIL. This uses SIL to verify the generated code compiled for your host platform by comparing the simulation behavior with behavior of the corresponding generated code.

% Make sure the example model is freshly opened

% Note that the Model block CounterA has the text (SIL) displayed on it.  This
% shows that the model referenced by this Model block is configured for SIL
% simulation.

% Run a simulation of this system
### Successfully updated the model reference SIM target for model: rtwdemo_sil_counter
### Starting build procedure for model: rtwdemo_sil_counter
### Successful completion of build procedure for model: rtwdemo_sil_counter
### Preparing to start SIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Updating code generation report with SIL files ...
### Starting SIL simulation for component: rtwdemo_sil_counter
### Stopping SIL simulation for component: rtwdemo_sil_counter

Start Work on a Target Connectivity Configuration

In the previous step you ran a simulation in SIL mode. You are now ready to start work on a target connectivity configuration for PIL.

% Make a local copy of the target connectivity configuration classes
src_dir = ...
if exist(fullfile('.','+mypil'),'dir')
mkdir +mypil
copyfile(fullfile(src_dir,'Launcher.m'), '+mypil');
copyfile(fullfile(src_dir,'TargetApplicationFramework.m'), '+mypil');
copyfile(fullfile(src_dir,'ConnectivityConfig.m'), '+mypil');

% Make the copied files writable
fileattrib(fullfile('+mypil', '*'),'+w');

% Update the package name to reflect the new location of the files

% Check that you now have a folder +mypil in the current folder including
% three files Launcher.m, TargetApplicationFramework.m and ConnectivityConfig.m
dir './+mypil'
.                             Launcher.m                    
..                            TargetApplicationFramework.m  

Review Code to Launch the PIL Executable

The class that configures a tool for launching the PIL executable is mypil.Launcher. Open this class in the editor:


% Review the content of this file. Note the method setArgString that allows
% additional command line parameters to be supplied to the executable. These
% parameters may include a TCP/IP port number. For an embedded processor
% implementation, you may choose to have these settings hard-coded.

Configure the Overall Target Connectivity Configuration

View the class mypil.ConnectivityConfig:


% Review the content of this file. You should be able to identify
% * The creation of an instance of rtw.connectivity.RtIOStreamHostCommunicator
%   that configures the host side of the TCP/IP communications channel
% * A call to the setArgString method of Launcher that configures
%   the target side of the TCP/IP communications channel
% * A call to setTimer that configures a timer for execution time measurement

% Note that to define your own target-specific timer for execution time
% profiling, you must use the Code Replacement Library to specify a replacement
% for the function code_profile_read_timer. You can achieve this using a command
% line API or the crtool graphical user interface.

Review the Target-Side Communications Drivers

View the file rtiostream_tcpip.c


% Scroll down to the end of this file. See that this file contains a TCP/IP
% implementation of the functions rtIOStreamOpen rtIOStreamSend, and
% rtIOStreamRecv. These functions are required for the target platform to
% communicate with the host machine. You must provide an implementation for each
% of these functions that is specific to your target hardware and communication
% channel.

Add Target-Side Communications Drivers to the Connectivity Configuration

The class that configures additional files to include in the build is mypil.TargetApplicationFramework. Open this class in the editor:


Use sl_customization to Register the Target Connectivity Configuration

To use the new target connectivity configuration you must provide an sl_customization file. The sl_customization file registers your new target connectivity configuration and specifies the conditions that must be satisfied in order to use it. The conditions specified in this file may include the name of your System Target File and your Hardware Implementation settings.

% You can view the sl_customization file (for the example, you do not have
% to make changes to this file)

% Add the sl_customization folder to the path and refresh the
% customizations

Verify Generated Code Using PIL Simulation

% Run the PIL simulation
set_param('rtwdemo_sil_modelblock/CounterA','SimulationMode','processor-in-the-loop (pil)');
### Starting build procedure for model: rtwdemo_sil_counter
### Generated code for 'rtwdemo_sil_counter' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for model: rtwdemo_sil_counter
### Connectivity configuration for referenced model "rtwdemo_sil_counter": <a href="matlab: targets_hyperlink_manager('run',12);">My PIL Example</a> ###
SETARGSTRING called from line 71 of ConnectivityConfig.m
### Preparing to start PIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Updating code generation report with PIL files ...
### Starting application: 'rtwdemo_sil_counter_ert_rtw/pil/rtwdemo_sil_counter'
Starting PIL simulation
Started new process, pid = 190700
Stopping PIL simulation
Terminated process, pid = 190700

Review the messages above. Confirm that the simulation ran without errors being reported. You have now implemented a target connectivity configuration for PIL. You can use the same APIs to implement a connectivity configuration for your own combination of embedded processor, download tool and communications channel.

Clean Up

% Remove the path that was added temporarily
% Reset customizations

% Close the models