]> rtime.felk.cvut.cz Git - pes-rpp/rpp-simulink.git/blob - doc/rpp_simulink.tex
doc: Reflect change of FreeRTOS version
[pes-rpp/rpp-simulink.git] / doc / rpp_simulink.tex
1 \documentclass{scrreprt}
2
3 \usepackage{graphicx} % images and graphics
4 \usepackage{paralist} % needed for compact lists
5 \usepackage[normalem]{ulem} % needed by strike
6 \usepackage{listings} % required for code blocks
7 \usepackage[urlcolor=blue,colorlinks=true,hyperfootnotes=false]{hyperref} % links
8 \usepackage[utf8]{inputenc}  % char encoding
9 \usepackage[bottom]{footmisc} % footnotes
10 \usepackage{todonotes}
11 \usepackage[backend=biber,style=alphabetic,sortcites=true]{biblatex}
12 \usepackage{tabularx}
13 \addbibresource{rpp_simulink.bib}
14
15 % header
16 \usepackage[top=2.5cm, bottom=2.5cm, left=2.5cm, right=2.5cm]{geometry}
17 \usepackage{float} % To fix images position
18
19 % Prettify code documentation
20 \usepackage{color}
21 \usepackage{colortbl}
22 % \usepackage[table]{xcolor}
23
24 \definecolor{gray97}{gray}{.97}
25 \definecolor{gray75}{gray}{.75}
26 \definecolor{gray45}{gray}{.45}
27 \lstset{ frame=Ltb,
28      framerule=0pt,
29      aboveskip=0.5cm,
30      framextopmargin=3pt,
31      framexbottommargin=3pt,
32      framexleftmargin=0.4cm,
33      framesep=0pt,
34      rulesep=.4pt,
35      backgroundcolor=\color{gray97},
36      rulesepcolor=\color{black},
37      %
38      stringstyle=\ttfamily,
39      showstringspaces = false,
40      basicstyle=\small\ttfamily,
41      commentstyle=\color{gray45},
42      keywordstyle=\bfseries,
43      %
44      numbers=left,
45      numbersep=15pt,
46      numberstyle=\tiny,
47      numberfirstline = false,
48      breaklines=true,
49      xleftmargin=20px,
50    }
51
52 \usepackage{lastpage}
53 \usepackage{fancyhdr}
54
55 % Spacing
56 \linespread{1.15} % Lines spacing
57 \setlength{\plitemsep}{0.5\baselineskip} % List items spacing
58 \definecolor{deepblue}{RGB}{0,0,61}
59 \definecolor{deepgreen}{RGB}{0,80,0}
60 \hypersetup{linkcolor=deepblue,citecolor=deepgreen,}
61
62 % Table of content depth
63 \setcounter{tocdepth}{2}
64
65 % Landscape pages
66 \usepackage{lscape}
67 \usepackage{pdflscape}
68
69 % Change page
70 \usepackage{changepage}
71
72 % Font options
73 % Sans-serif
74 % \renewcommand{\familydefault}{\sfdefault}
75 % Better PDF font
76 \usepackage{lmodern}
77
78 % Multiple columns
79 \usepackage{multicol}
80 \usepackage{caption}
81
82 \newcommand{\repo}{$\langle$repo$\rangle$}
83 \newcommand{\superscript}[1]{\ensuremath{^{\textrm{\small#1}}}}
84 \newcommand{\subscript}[1]{\ensuremath{_{\textrm{\small#1}}}}
85
86 % Supported targets - to be used with \ifx\tgtId\tgtIdXXX
87 \def\tgtIdTMSHDK{tms570\_hdk}
88 \def\tgtIdRMHDK{rm48\_hdk}
89 \def\tgtIdTMSRPP{tms570\_rpp}
90 \def\tgtIdHydCtr{tms570\_hydctr}
91
92 % Include target specific macros etc.
93 \input{target_def}
94
95 \begin{document}
96
97 % Title
98 \newcommand{\HRule}{\rule{\linewidth}{0.5mm}}
99
100 \begin{titlepage}
101 \begin{center}
102
103 % Upper part of the page
104 \vspace{3cm}
105
106 \includegraphics[width=0.35\textwidth]{images/cvut.pdf}\\[1cm]
107 \textsc{\LARGE Czech Technical University in Prague}\\[1.5cm]
108
109
110 % Document title
111 \HRule
112 \vspace{0.4cm}
113 {\huge \bfseries Simulink code generation target for Texas~Instruments
114   \tgname{} platform\par}
115 \vspace{0.8cm}
116 {\Large Version for \tgtBoardName{} board\par}
117 \vspace{0.4cm}
118 \HRule \\[1.5cm]
119
120
121 % Author
122 \emph{Authors:}\\
123 Carlos \textsc{Jenkins}\\
124 Michal \textsc{Horn}\\
125 Michal \textsc{Sojka}\\[\baselineskip]
126
127 \vfill
128 \emph{Version:}
129 \input{version.tex}
130
131 % Bottom of the page
132 {\large \today}
133
134 \end{center}
135 \end{titlepage}
136 % Title end
137
138 \section*{Revision history}
139
140 \noindent\begin{tabularx}{\linewidth}{|l|l|l|X|}
141   \rowcolor[gray]{0.9}\hline
142   Revision     & Date      & Author(s) & Comments \\ \hline
143
144   0.1 beta & 2014-12-04 & Sojka, Horn & Initial version \\ \hline
145
146   0.2 & 2015-02-16 & Sojka, Horn & Improvements, clarifications,
147   cleanup \\ \hline
148
149   0.3 & 2015-03-31 & Sojka, Horn & Added sections
150                                    \ref{sec-changing-os}, \ref{sec:adding-new-funct} and
151                                    \ref{sec:mult-single-thre}. Minor
152                                    updates. \\ \hline
153
154            0.4 & 2015-04-30 & Sojka, Horn & Added support for TMS570 HDK
155                                             platform. All RPP software
156                                             supports multiple
157                                             platforms by
158                                             recompilation. \\ \hline
159
160            0.5 beta & 2015-07-03 & Sojka & Updated section \ref{sec:adding-new-funct}.
161                                            Added support for Eaton Hydraulics
162                                            Controller board (TMS570LS1227).
163            \\\hline
164 \end{tabularx}
165
166 \tableofcontents
167
168 \newpage
169
170 \listoffigures
171
172 \newpage
173
174 \fancypagestyle{plain}{%
175 \fancyhf{} % clear all header and footer fields
176 \renewcommand{\footrulewidth}{0.4pt} 
177 \renewcommand{\headrulewidth}{0pt}
178         \fancyfoot[L]{Version \input{version.tex}}
179         \fancyfoot[C]{}
180         \fancyfoot[R]{Page {\thepage} of \pageref{LastPage}}
181 }
182 \renewcommand{\headrulewidth}{0.4pt} 
183 \renewcommand{\footrulewidth}{0.4pt} 
184 \pagestyle{fancy} {
185         \fancyhead[R]{\includegraphics[width=1cm]{images/cvut.pdf}}
186         \fancyhead[C]{}
187         \fancyhead[L]{\nouppercase \leftmark}
188         \fancyfoot[L]{Version \input{version.tex}}
189         \fancyfoot[C]{}
190         \fancyfoot[R]{Page {\thepage} of \pageref{LastPage}}
191 }
192 \headheight=26pt
193 %\addtolength{\parskip}{\baselineskip} % Paragraph spacing
194
195 \chapter{Introduction}
196 \label{chap-introduction}
197
198 This text documents software part of Rapid Prototyping Platform (RPP)
199 project for Texas Instruments \tgname{} safety microcontroller
200 developed by Czech Technical University in Prague (CTU). The software
201 consists of code generation target for Simulink Embedded Coder, a
202 low-level run-time C library and a tool for interactive testing of
203 hardware and software functionality.
204
205 Originally, the RPP project was created for a custom TMS570-based board
206 and the port to other platforms such as RM48 HDK and TMS570 HDK
207 development kits. Porting to other platforms was done under a contract
208 from Eaton Corporation.
209
210 The document contains step-by-step instructions for installation of
211 development tools, information about Simulink Coder configuration,
212 describes how to create new models as well as how to download the
213 resulting firmware to the hardware. It can also be used as a reference
214 for the testing tool, Matlab Simulink blocks and RPP Matlab Simulink
215 Code generator. Additionally, an overall description of the used
216 hardware platform and the architecture of included software is
217 provided.
218
219 \section{Background}
220 \label{sec-background}
221
222 In this document, the term \emph{Rapid Prototyping Platform} denotes a
223 hardware board and accompanying software. The hardware board is
224 \tgtBoardName{} based on ARM Cortex R4 safety microcontroller
225 \mcuname{}. This MCU contains several protective mechanisms (two cores
226 in lockstep, error correction mechanisms for SRAM and Flash memory,
227 voltage monitoring, etc.) to fulfill the requirements for safety
228 critical applications. See~\cite{\tgrefman} for details.
229
230 In order to develop non-trivial applications for the RPP, an operating
231 system is necessary. The RPP is based on FreeRTOS -- a simple
232 opensource real-time operating system kernel. The FreeRTOS provides an
233 API for creating and managing and scheduling multiple tasks, memory
234 manager, semaphores, queues, mutexes, timers and a few of other
235 features which can be used in the applications.
236 See~\cite{usingthefreertos2009} for more details.
237
238 Even with the operating system it is quite hard and non-intuitive to
239 manipulate the hardware directly. That is the point when abstraction
240 comes into the play. The RPP software is made of several layers
241 implementing, from the bottom to the top, low-level device drivers,
242 hardware abstraction for common functionality on different hardware
243 and an API which is easy to use in applications. The operating system
244 and the basic software layers, can be compiled as a library and easily
245 used in any project. More details about the library can be found in
246 Chapter~\ref{chap-c-support-library} and in~\cite{michalhorn2013}.
247
248 Because human beings make mistakes and in safety critical applications
249 any mistake can cause damage, loos of money or in the worst case even
250 death of other people, the area for making mistakes has to be as small
251 as possible. An approach called Model-based development
252 \cite{modelbasedwiki2013} has been introduced to reduce the
253 probability of making mistakes. In model-based development, the
254 applications are designed at higher level from models and the
255 functionality of the models can be simulated in a computer before the
256 final application/hardware is finished. This allows to discover
257 potential errors earlier in the development process.
258
259 One commonly used tool-chain for model-based development is
260 Matlab/Simulink. In Simulink the application is developed as a model
261 made of interconnected blocks. Every block implements some
262 functionality. For example one block reads a value from an
263 analog-to-digital converter and provides the value as an input to
264 another block. This block can implement some clever algorithm and its
265 output is passed to another block, which sends the computed value as a
266 message over CAN bus to some other MCU. Such a model can be simulated
267 and tested even before the real hardware is available by replacing the
268 input and output blocks with simulated ones. Once the hardware is
269 ready, C code is automatically generated from the model by a Simulink
270 Coder. The code is then compiled by the MCU compatible compiler and
271 downloaded to the MCU Flash memory on the device. Because every block
272 and code generated from the block has to pass a series of tests during
273 their development, the area for making mistakes during the application
274 development has been significantly reduced and developers can focus on
275 the application instead of the hardware and control software
276 implementation. More information about code generation can be found in
277 Chapter \ref{chap-simulink-coder-target}. For information about Matlab
278 Simulink, Embedded Coder and Simulink Coder, refer to
279 \cite{embeddedcoderreference2013, ebmeddedcoderusersguide2013,
280   simulinkcoderreference2013, targetlanguagecompiler2013,
281   simulinkcoderusersguide2013, simulinkdevelopingsfunctions2013}.
282
283 \section{Hardware description}
284 \label{sec-hardware-description}
285
286 \input{hwdesc}
287
288 \section{Software architecture}
289 \label{sec-software-architecture}
290
291 The core of the RPP software is the so called RPP Library. This
292 library is conceptualy structured into 5 layers, depicted in
293 Figure~\ref{fig-layers}. The architecture design was driven by the
294 following guidelines:
295
296 \begin{compactitem}
297         \item Top-down dependency only. No lower layer depends on anything from
298 upper layers.
299 %       \item 1-1 layer dependency only. The top layer depends
300 % exclusively on the bottom layer, not on any lower level layer (except for a
301 % couple of exceptions).
302 \item Each layer should provide a unified layer interface
303   (\texttt{rpp.h}, \texttt{drv.h}, \texttt {hal.h}, \texttt{sys.h} and
304   \texttt{os.h}), so that higher layers depend on the lower layer's interface
305   and not on individual elements from that layer.
306 \end{compactitem}
307
308 \begin{figure}
309 \begin{center}
310 \noindent
311 \includegraphics[width=250px]{images/layers.pdf}
312 \caption{The RPP library layers.}
313 \label{fig-layers}
314 \end{center}
315 \end{figure}
316
317 As a consequence of this division the source code files and interface files are
318 placed in private directories like \texttt{drv/din.h}. With this organization
319 user applications only needs to include the top layer interface files (for
320 example \texttt{rpp/rpp\_can.h}) to be able to use the selected library API.
321
322 The rest of the section provides basic description of each layer.
323
324 \subsection{Operating System layer}
325 \label{sec-operating-system-layer}
326 This is an interchangeable operating system (OS) layer containing the
327 FreeRTOS source files. The system can be easily replaced by another
328 version. For example it is possible to compile the RPP library for
329 Linux (using POSIX version of the FreeRTOS), which can be desirable
330 for some testing. The source files can be found in the
331 \texttt{$\langle$rpp\_lib$\rangle$/os} folder.
332
333 The following FreeRTOS versions are distributed:
334 \begin{description}
335 \item[6.0.4\_posix] POSIX version, usable for compilation of the
336   library for Linux system.
337 \item[8.2.2] Currently used FreeRTOS version. This is the version
338   downloaded from FreeRTOS.org with changes in directory structure.
339   Namely, include files have added the \emph{os/} prefix and platform
340   dependent code (portable) for \tgname{} is copied to the same
341   directory as platform independent code.
342 \end{description}
343
344 \subsection{System Layer} 
345 \label{sec-system-layer}
346 This layer contains system files with data types definitions, clock definitions,
347 interrupts mapping, MCU start-up sequence, MCU selftests, and other low level
348 code for controlling some of the MCU peripherals. The source files can be found
349 in \texttt{$\langle$rpp\_lib$\rangle$/rpp/src/sys}, the header files can
350 be found in \texttt{$\langle$rpp\_lib$\rangle$/rpp/include/sys}
351 folder.
352
353 Large part of this layer was generated by the HalCoGen tool (see
354 Section~\ref{sec-halcogen}).
355
356 \subsection{Drivers layer} 
357 \label{sec-drivers-layer}
358 The Drivers layer contains code for controlling the RPP peripherals.
359 Typically, it contains code implementing IRQ handling, software
360 queues, management threads, etc. The layer benefits from the lower
361 layers thus it is not too low level, but still there are some
362 peripherals like ADC, which need some special procedure for
363 initialization and running, that would not be very intuitive for the
364 user.
365
366 The source files can be found in
367 \texttt{$\langle$rpp\_lib$\rangle$/rpp/src/drv} and the header files can
368 be found in \texttt{$\langle$rpp\_lib$\rangle$/rpp/include/drv} folder.
369
370 \subsection{RPP Layer}
371 \label{sec-rpp-layer} 
372 The RPP Layer is the highest layer of the library. It provides an easy
373 to use set of functions for every peripheral and requires only basic
374 knowledge about them. For example, to use the ADC, the user can just
375 call \texttt{rpp\_adc\_init()} function and it calls a sequence of
376 Driver layer functions to initialize the hardware and software.
377
378 The source files can be found in
379 \texttt{$\langle$rpp\_lib$\rangle$/rpp/src/rpp} and the header files can
380 be found in \texttt{$\langle$rpp\_lib$\rangle$/rpp/include/rpp}.
381
382 \section{Document structure}
383 \label{sec-document-structure}
384 The structure of this document is as follows:
385 Chapter~\ref{chap-getting-started} gets you started using the RPP
386 software. Chapter~\ref{chap-c-support-library} describes the RPP
387 library. Chapter~\ref{chap-simulink-coder-target} covers the Simulink
388 code generation target and finally
389 Chapter~\ref{chap-rpp-test-software} documents a tool for interactive
390 testing of the RPP functionality.
391
392 \chapter{Getting started}
393 \label{chap-getting-started}
394
395 \section{Software requirements}
396 \label{sec-software-requirements}
397 The RPP software stack can be used on Windows and Linux platforms. The
398 following subsections mention the recommended versions of the required
399 software tools/packages.
400
401 \subsection{Linux environment} 
402 \label{sec-linux-environment}
403 \begin{itemize}
404         \item Debian based 64b Linux distribution (Debian 7.0 or Ubuntu 14.4 for
405 example).
406         \item Kernel version 3.11.0-12.
407         \item GCC version 4.8.1
408         \item GtkTerm 0.99.7-rc1
409         \item TI Code Composer Studio 5.5.0.00077
410         \item Matlab 2013b 64b with Embedded Coder
411         \item HalCoGen 4.00 (optional)
412         \item Uncrustify 0.59 (optional, see Section \ref{sec-compilation})
413         \item Doxygen 1.8.4 (optional, see Section \ref{sec-compiling-api-documentation})
414     \item Git 1.7.10.4 (optional)
415 \end{itemize}
416
417 \subsection{Windows environment}
418 \label{sec-windows-environment}
419 \begin{itemize}
420         \item Windows 7 Enterprise 64b Service Pack 1.
421         \item Microsoft Windows SDK v7.1
422         \item Bray Terminal v1.9b
423         \item TI Code Composer Studio 5.5.0.00077
424         \item Matlab 2013b 64b with Embedded Coder
425         \item HalCoGen 4.00 (optional)
426         \item Doxygen 1.8.4 (optional, see Section \ref{sec-compiling-api-documentation}) 
427         \item Uncrustify 0.59 (optional, see Section \ref{sec-compilation})
428     \item Git 1.9.4.msysgit.2 (optional)
429 \end{itemize}
430
431 \section{Software tools}
432 \label{sec-software-and-tools}
433
434 This section covers tool which are needed or recommended for work with
435 the RPP project.
436
437 \subsection{TI Code Composer Studio}
438 \label{sec-ti-ccs}
439 Code Composer Studio (CCS) is the official Integrated Development Environment
440 (IDE) for developing applications for Texas Instruments embedded processors. CCS
441 is multiplatform software based on
442 Eclipse open source IDE.
443
444 CCS includes Texas Instruments Code Generation Tools (CGT)
445 \cite{armoptimizingccppcompiler2012, armassemblylanguagetools2012}
446 (compiler, linker, etc). Simulink code generation target requires the
447 CGT to be available in the system, and thus, even if no library
448 development will be done or the IDE is not going to be used CCS is
449 still required.
450
451 You can find documentation for CGT compiler in \cite{armoptimizingccppcompiler2012} and
452 for CGT archiver in \cite{armassemblylanguagetools2012}.
453
454 \subsubsection{Installation on Linux} 
455 \label{sec-installation-on-linux}
456 Download CCS for Linux from:\\
457 \url{http://processors.wiki.ti.com/index.php/Category:Code\_Composer\_Studio\_v5}
458
459 Once downloaded, add executable permission to the installation file
460 and launch the installation by executing it. Installation must be done
461 by the root user in order to install a driver set.
462
463 \lstset{language=bash}
464 \begin{lstlisting}
465 chmod +x ccs_setup_5.5.0.00077.bin
466 sudo ./ccs_setup_5.5.0.00077.bin
467 \end{lstlisting}
468
469 After installation the application can be executed with:
470
471 \lstset{language=bash}
472 \begin{lstlisting}
473 cd <ccs>/ccsv5/eclipse/
474 ./ccstudio
475 \end{lstlisting}
476
477 The first launch on 64bits systems might fail. This can happen because CCS5 is
478 a 32 bit application and thus requires 32 bit libraries. They can be
479 installed by:
480
481 \lstset{language=bash}
482 \begin{lstlisting}
483 sudo apt-get install libgtk2.0-0:i386 libxtst6:i386
484 \end{lstlisting}
485
486 If the application crashes with a segmentation fault edit file:
487
488 \lstset{language=bash}
489 \begin{lstlisting}
490 nano <ccs>/ccsv5/eclipse/plugins/com.ti.ccstudio.branding_<version>/plugin_customization.ini
491 \end{lstlisting}
492
493 And change key \texttt{org.eclipse.ui/showIntro} to \texttt{false}.
494
495 \subsubsection{Installation on Windows}
496 \label{sec-installation-on-windows}
497 Installation for Windows is more straightforward than the installation
498 procedure for Linux. Download CCS for Windows from:\\
499 \url{http://processors.wiki.ti.com/index.php/Category:Code\_Composer\_Studio\_v5}
500
501 Once downloaded run the ccs\_setup\_5.5.0.00077.exe and install the CCS.
502
503 \subsubsection{First launch} 
504 \label{sec-first-launch}
505 If no other licence is available, choose ``FREE License -- for use
506 with XDS100 JTAG Emulators'' from the licensing options. Code download
507 for the board uses the XDS100 hardware.
508
509 \subsection{Matlab/Simulink}
510 \label{sec-matlab-simulink}
511 Matlab Simulink is a set of tools, runtime environment and development
512 environment for Model--Based \cite{modelbasedwiki2013} applications development,
513 simulations and code generation for target platforms.  Supported Matlab Simulink
514 version is R2013b for 64 bits Linux and Windows. A licence for an Embedded Coder is
515 necessary to be able to generate code from Simulink models, containing RPP blocks.
516
517 \subsection{HalCoGen}
518 \label{sec-halcogen}
519 HalCoGen (HAL Code Generator) is a tool for graphical configuration of peripherals, clocks, interrupts and other MCU parameters. It generates C code which can be imported to the Code Composer Studio.
520
521 The tool is available for Windows at 
522 \begin{quotation}
523 \url{http://www.ti.com/tool/halcogen}
524 \end{quotation}
525
526 The HalCoGen has been used in early development stage of the RPP
527 project to generate the base code for some of the peripheral. The
528 trend is to not to use the HalCoGen any more, because the generated
529 code is not reliable enough for safety critical applications. Anyway it is
530 sometimes helpful to use it as a reference.
531
532 The HalCoGen is distributed for Windows only, but can be run on Linux
533 under Wine (tested with Wine version 1.6.2).
534
535 \subsection{GtkTerm and Bray Terminal}
536 \label{sec-gtkterm-bray-terminal}
537 Most of the interaction with the board is done through a RS-232 serial
538 connection. The terminal software used for communication is called GtkTerm for
539 Linux and Bray terminal for Windows.
540
541 To install GtkTerm execute:
542
543 \lstset{language=bash}
544 \begin{lstlisting}
545 sudo apt-get install gtkterm
546 \end{lstlisting}
547
548 The Bray Terminal does not require any installation and the executable file is
549 available at\\
550 \url{https://sites.google.com/site/terminalbpp/}
551
552 \subsection{C Compiler}
553 \label{sec-c-compiler}
554 A C language compiler has to be available on the development system to be able to
555 compile Matlab Simulink blocks S-functions.
556
557 For Linux a GCC 4.8.1 compiler is recommended and can be installed with a
558 command
559
560 \lstset{language=bash}
561 \begin{lstlisting}
562 sudo apt-get install gcc
563 \end{lstlisting}
564
565 For Windows, the C/C++ compiler is a part of Windows SDK, which is available from\\
566 \url{http://www.microsoft.com/en-us/download/details.aspx?id=8279}
567
568 \section{Project installation}
569 \label{sec-project-installation}
570 The RPP software is distributed in three packages and a standalone pdf
571 file containing this documentation. Every package is named like
572 \emph{$\langle$package\_name$\rangle$-version.zip}. The three packages
573 are:
574
575 \begin{description}
576 \item[rpp-simulink] Contains the source code of Matlab Simulink
577   blocks, demo models and scripts for downloading the generated
578   firmware to the target board from Matlab/Simulink. Details can be
579   found in Chapter \ref{chap-simulink-coder-target}.
580
581   The package also contains the binary of the RPP Library and all its
582   headers and other files necessary for building and downloading
583   Simulink models.
584 \item[rpp-test-sw] Contains an application for interactive testing and
585   control of the \tgtBoardName{} board over the serial interface. Details can be
586   found in Chapter~\ref{chap-rpp-test-software}.
587
588   The package also contains the binary of the RPP Library and all
589   headers and other files necessary for building and downloading the
590   application.
591 \item[rpp-lib] Contains the source code of the RPP library, described
592   in Chapter \ref{chap-c-support-library}. If you want to make any
593   changes in the drivers or the RPP API, this library has to be
594   compiled and linked with applications in the other two packages.
595   Library compilation is described in Section \ref{sec-compilation}.
596 \end{description}
597
598 The following sections describe how to start working with individual
599 packages.
600
601 \ifx\tgtId\tgtIdTMSRPP
602 \subsection{Getting sources from git repository}
603 \begin{verbatim}
604 git clone --recursive git@rtime.felk.cvut.cz:jenkicar/rpp-simulink
605 \end{verbatim}
606 If you get release packages, follow the instructions in the next sections.
607 \fi 
608
609 \subsection{rpp-simulink}
610 \label{sec-rpp-simulink-installation}
611 This section describes how to install the rpp-simulink project, which
612 is needed to try the demo models or to build your own models that use
613 the RPP blocks.
614
615 \begin{enumerate}
616 \item Unzip the \texttt{rpp-simulink-version.zip} file.
617 \item Follow the procedure  from Section
618   \ref{sec-configuration-simulink-for-rpp} for configuring Matlab
619   Simulink for the RPP project.
620 \item Follow the procedure from Section \ref{sec-crating-new-model}
621   for instructions about creating your own model which will use the
622   RPP Simulink blocks or follow the instructions in
623   Section~\ref{sec-running-model-on-hw} for downloading the firmware to the RPP hardware.
624 \end{enumerate}
625
626 \subsection{rpp-test-sw}
627 \label{sec-test-sw-installation}
628 This section describes how to install and run the application that
629 allows you to interactively control the RPP hardware. This can be
630 useful, for example, to test your modifications of the RPP library.
631
632 \begin{enumerate}
633         \item Unzip the \texttt{rpp-test-sw-version.zip} file.
634         \item Open the Code Composer Studio (see Section \ref{sec-ti-ccs}).
635         \item Import the \texttt{rpp-test-sw} project as described in
636           Section \ref{sec-openning-of-existing-project}.
637         \item Right click on the \texttt{rpp-test-sw} project in the
638       \textsc{Project Explorer} and select \textsc{Build Project}.
639         \item Follow the instructions in
640       Section~\ref{sec-running-software-on-hw} to download, debug and
641       run the software on the target hardware.
642 \end{enumerate}
643
644 \subsection{rpp-lib}
645 \label{sec-rpp-lib-installation}
646
647 This section describes how to open the rpp-lib project in Code
648 Composer Studio and how to use the resulting static library in an
649 application. This is only necessary if you need to modify the library
650 for some reason.
651
652 \begin{enumerate}
653         \item Unzip the \texttt{rpp-lib-version.zip} file.
654         \item Open the Code Composer Studio (see Section \ref{sec-ti-ccs}).
655         \item Import the rpp-lib project from directory
656           \texttt{rpp-lib-XXX/build/\tgtId} as described in
657           Section~\ref{sec-openning-of-existing-project}.
658         \item Compile the static library by selecting \textsc{Project
659             $\rightarrow$ Build Project} (see Section
660           \ref{sec-compilation} for more information). The compiled
661           library \texttt{rpp-lib.lib} and file
662           \texttt{Makefile.config} will appear in the
663           \texttt{rpp-lib-XXX} directory.
664     \item Either copy the compiled library and the content of the
665       \texttt{rpp/include} directory to the application, where you
666       want to use it or use the library in place, as described in
667       Section~\ref{sec:creating-new-project}.
668       \begin{itemize}
669       \item In the rpp-simulink application the library is located in
670         the \texttt{rpp/lib} folder.
671       \item In the rpp-test-sw application the library is located in
672         the \texttt{rpp-lib} folder.
673       \end{itemize}
674 \end{enumerate}
675
676 \section{Code Composer Studio usage}
677 \label{sec-code-composerpstudio-usage}
678
679 \subsection{Opening an existing project}
680 \label{sec-openning-of-existing-project}
681 The procedure for opening a project is similar to opening a project in
682 the standard Eclipse IDE.
683
684 \begin{enumerate}
685         \item Launch Code Composer Studio
686         \item Select \textsc{File$\rightarrow$Import}
687         \item In the dialog window select \textsc{Code Composer
688         Studio$\rightarrow$Existing CCS Eclipse project} as an import
689       source (see Figure \ref{fig-import-project}).
690         \item In the next dialog window click on \textsc{Browse} button
691       and find the root directory of the project.
692     \item Select the requested project in the \textsc{Discovered
693         project} section so that the result looks like in Figure
694       \ref{fig-select-project}.
695     \item Click the \textsc{Finish} button.
696 \end{enumerate}
697
698 \begin{figure}[H]\begin{center}
699         \includegraphics[width=350px]{images/import_project.png}
700         \caption{Import project dialog}
701         \label{fig-import-project}
702 \end{center}\end{figure}
703
704 \begin{figure}[H]\begin{center}
705         \includegraphics[width=350px]{images/select_project.png}
706         \caption{Select project dialog}
707         \label{fig-select-project}
708 \end{center}\end{figure}
709
710 \newpage
711 \subsection{Creating new project}
712 \label{sec:creating-new-project}
713 Follow these steps to create an application for \tgname{} MCU compiled with
714 CGT.
715
716 \begin{compactenum}
717 \item Create a new empty CCS project. Select \mcuname{} device, XDS100v2
718   connection and set Linker command file to
719   \texttt{rpp-lib/build/\tgtId/\ldscriptname}.
720
721   \noindent\includegraphics[scale=0.45]{images/base_1.png}
722
723 \item In \textsc{Project Explorer}, create normal folders
724   named \texttt{include} and \texttt{src}.
725
726 \item If you use Git version control system, add \texttt{.gitignore}
727   file with the following content to the root of that project:
728   \lstset{language=}
729 \begin{lstlisting}
730 Debug
731 Release
732 .settings/*
733 \end{lstlisting}
734
735   \newpage
736 \item In project \textsc{Properties}, add new variable of type
737   \texttt{Directory} named \texttt{RPP\_LIB\_ROOT} and set it to the
738   rpp-lib directory
739   root.
740
741   \noindent\includegraphics[scale=.45]{images/base_2.png}
742
743 \item Configure the compiler \#include search path to contain
744   project's \texttt{include} directory, \penalty-100
745   \texttt{\$\{RPP\_LIB\_ROOT\}/os/8.2.2/include} and
746   \texttt{\$\{RPP\_LIB\_ROOT\}/rpp/include}, in that order.
747
748   \includegraphics[scale=.43]{images/base_5.png}
749
750   \newpage
751 \item Add \texttt{\$\{RPP\_LIB\_ROOT\}/rpp-lib.lib} to the list of
752   linked libraries before the runtime support library
753   (\texttt{\tgtRtlib}).
754
755   \noindent\includegraphics[scale=.45]{images/base_3.png}
756
757 \item Configure the compiler to allow GCC extensions.
758
759   \noindent\includegraphics[scale=.45]{images/base_6.png}
760
761 \newpage
762 \item Create \texttt{main.c} file with the following content:
763 \begin{lstlisting}[language=C]
764 #include <rpp/rpp.h>
765
766 int main(void)
767 {
768         rpp_init();
769         rpp_sci_printf("Hello world\n");
770         vTaskStartScheduler();
771         return 0; /* not reached */
772 }
773
774 void vApplicationMallocFailedHook()
775 {}
776 void vApplicationStackOverflowHook()
777 {}
778 \end{lstlisting}
779
780 \item Compile the application by e.g. \textsc{Project $\rightarrow$
781     Build All}.
782 \item Select \textsc{Run} $\rightarrow$ \textsc{Debug}. The
783   application will be downloaded to the processor and run. A
784   breakpoint is automatically placed at \texttt{main()} entry. To
785   continue executing the application select \textsc{Run} $\rightarrow$
786   \textsc{Resume}.
787 \item If your application fails to run with a \texttt{\_dabort} interrupt, check
788 that the linker script selected in step 1 is not excluded from the build.
789 You can do this by right clicking the \texttt{\ldscriptname}  file
790 in the \textsc{Project Explorer} and unchecking the \textsc{Exclude from build}
791 item. The Code Composer Studio sometimes automaticaly excludes this file from
792 the build process when creating a new project.
793
794 % \item If not already created for another project, create new target
795 %   configuration. Select \textsc{Windows $\rightarrow$ Show View
796 %     $\rightarrow$ Target Configurations}. In the shown window, click
797 %   on \textsc{New Target Configuration} icon and configure XDS100v2
798 %   connection and \mcuname{} device as shown below. Click \textsc{Save},
799 %   connect your board and click \textsc{Test Connection}.
800
801 %   \medskip
802 %   \includegraphics[width=\linewidth]{images/target_conf.png}
803
804 % \newpage
805 \item Optionally, you can change debugger configuration by selecting
806   \textsc{Run $\rightarrow$ Debug Configurations}. In the
807   \textsc{Target} tab, you can configure not to break at \texttt{main}
808   or not to erase the whole flash, but necessary sectors only (see the
809   figure below).
810
811   \includegraphics[width=\linewidth]{images/debug_conf_flash.png}
812
813
814 \end{compactenum}
815
816 %% Comment this out for Eaton
817 % \subsubsection{Steps to configure new POSIX application:}
818 % Such an application can be used to test certain FreeRTOS features on
819 % Linux and can be compiled with a native GCC compiler.
820
821 % \begin{compactenum}
822 %       \item Create a new managed C project that uses Linux GCC toolchain.
823 %       \item Create a source folder \texttt{src}. Link all files from original
824 % CCS application to this folder.
825 %       \item Create a normal folder \texttt{include}. Create a folder
826 % \texttt{rpp} inside of it.  
827 %       \item Add common \texttt{.gitignore} to the root of that project:
828 % \lstset{language=}
829 % \begin{lstlisting}
830 % Debug
831 % Release
832 % .settings/*
833 % \end{lstlisting}
834 %       \item Add new variable \texttt{RPP\_LIB\_ROOT} and point to this
835 % repository branch root.\newline{}
836 % \noindent\includegraphics[width=\linewidth]{images/base_posix_1.png}
837 %       \item Configure compiler to include local includes, CCS application
838 % includes, OS includes for POSIX and RPP includes, in that order.\newline{}
839 % \noindent\includegraphics[width=\linewidth]{images/base_posix_2.png}
840 % \newpage
841 %       \item Add \texttt{rpp} and \texttt{pthread} to linker libraries and add
842 % \texttt{RPP\_LIB\_ROOT} to the library search path.\newline{}
843 % \noindent\includegraphics[width=\linewidth]{images/base_posix_3.png}
844 % \end{compactenum}
845
846 \subsubsection{Content of the application}
847
848 \begin{enumerate}
849 \item Include RPP library header file. 
850   \lstset{language=c++}
851 \begin{lstlisting}
852 #include "rpp/rpp.h"
853 \end{lstlisting}
854
855   If you want to reduce the size of the final application, you can
856   include only the headers of the needed modules. In that case, you
857   need to include two additional headers: \texttt{base.h} and, in case
858   when SCI is used for printing, \texttt{rpp/sci.h}.
859 \begin{lstlisting}
860 #include "rpp/hbr.h" /* We want to use H-bridge */
861 #include <base.h>       /* This is the necessary base header file of the rpp library. */
862 #include "rpp/sci.h" /* This is needed, because we use rpp_sci_printf in following examples. */
863 \end{lstlisting}
864
865 \newpage
866 \item Create one or as many FreeRTOS task function definitions as
867   required. Those tasks can use functions from the RPP library. Beware
868   that currently not all RPP functions are
869   reentrant\footnote{Determining which functions are not reentrant and
870     marking them as such (or making them reentrant) is planned as
871     future work.}. \lstset{language=c++}
872 \begin{lstlisting}
873 void my_task(void* p)
874 {
875     static const portTickType freq_ticks = 1000 / portTICK_RATE_MS;
876     portTickType last_wake_time = xTaskGetTickCount();
877     while (TRUE) {
878         /* Wait until next step */
879         vTaskDelayUntil(&last_wake_time, freq_ticks);
880         rpp_sci_printf((const char*)"Hello RPP.\r\n");
881     }
882 }
883 \end{lstlisting}
884
885 \item Create the main function that will:
886  \begin{itemize}
887         \item Initialize the RPP board. If you have included only selected
888 modules in step 1, initialize only those modules by calling their init
889 functions, for
890 example \texttt{rpp\_hbr\_init\(\)}.
891         \item Spawn the tasks the application requires. Refer to FreeRTOS API
892 for details.
893 \item Start the FreeRTOS Scheduler. Refer to FreeRTOS API for details
894   \cite{freertosapi}.
895         \item Handle error when the FreeRTOS scheduler cannot be started.
896
897 \lstset{language=c++}
898 \begin{lstlisting}
899 void main(void)
900 {
901     /* In case whole library is included: */
902         /* Initialize RPP board */
903         rpp_init();
904     /* In case only selected modules are included: */
905         /* Initialize HBR */
906         rpp_hbr_init();
907         /* Initialize sci for printf */
908         rpp_sci_init();
909         /* Enable interrups */
910         _enable_IRQ();
911
912     /* Spawn tasks */
913     if (xTaskCreate(my_task, (const signed char*)"my_task",
914             512, NULL, 0, NULL) != pdPASS) {
915         #ifdef DEBUG
916         rpp_sci_printf((const char*)
917             "ERROR: Cannot spawn control task.\r\n"
918         );
919         #endif
920         while (TRUE) { ; }
921     }
922
923     /* Start the FreeRTOS Scheduler */
924     vTaskStartScheduler();
925
926     /* Catch scheduler start error */
927     #ifdef DEBUG
928     rpp_sci_printf((const char*)
929             "ERROR: Problem allocating memory for idle task.\r\n"
930         );
931     #endif
932     while (TRUE) { ; }
933 }
934 \end{lstlisting}
935
936  \end{itemize}
937 \item Create hook functions for FreeRTOS:
938  \begin{itemize}
939  \item \texttt{vApplicationMallocFailedHook()} allows to catch memory allocation
940 errors.
941 \item \texttt{vApplicationStackOverflowHook()} allows to catch stack
942   overflow errors.
943
944 \lstset{language=c++}
945 \begin{lstlisting}
946 #if configUSE_MALLOC_FAILED_HOOK == 1
947 /**
948  * FreeRTOS malloc() failed hook.
949  */
950 void vApplicationMallocFailedHook(void) {
951     #ifdef DEBUG
952     rpp_sci_printf((const char*)
953             "ERROR: manual memory allocation failed.\r\n"
954         );
955     #endif
956 }
957 #endif
958
959
960 #if configCHECK_FOR_STACK_OVERFLOW > 0
961 /**
962  * FreeRTOS stack overflow hook.
963  */
964 void vApplicationStackOverflowHook(xTaskHandle xTask,
965                                    signed portCHAR *pcTaskName) {
966     #ifdef DEBUG
967     rpp_sci_printf((const char*)
968             "ERROR: Stack overflow : \"%s\".\r\n", pcTaskName
969         );
970     #endif
971 }
972 #endif
973 \end{lstlisting}
974
975 \newpage
976  \end{itemize}
977 \end{enumerate}
978
979
980 \subsection{Downloading and running the software}
981 \label{sec-running-software-on-hw}
982 \subsubsection{Code Composer Studio Project}
983 \label{sec-ccs-run-project}
984 When an application is distributed as a CCS project, you have to open the
985 project in the CCS as described in the Section
986 \ref{sec-openning-of-existing-project}. Once the project is opened and built, it
987 can be easily downloaded to the target hardware with the following procedure:
988
989 \begin{enumerate}
990 \ifx\tgtId\tgtIdTMSRPP
991         \item Connect the Texas Instruments XDS100v2 USB emulator to the JTAG port.
992         \item Connect a USB cable to the XDS100v2 USB emulator and the development computer.
993 \else
994         \item Connect the USB cable to the \tgtBoardName{} board.
995 \fi
996         \item Plug in the power supply.  
997         \item In the Code Composer Studio click on the
998 \textsc{Run$\rightarrow$Debug}. The project will  be optionally built and
999 the download process will start. The Code Composer Studio will switch into the debug
1000 perspective, when the download is finished.
1001         \item Run the program by clicking on the \textsc{Run} button, with the
1002 green arrow.  
1003 \end{enumerate}
1004
1005 \subsubsection{Binary File}
1006 \label{sec-binary-file}
1007 If the application is distributed as a binary file, without source code and CCS
1008 project files, you can download and run just the binary file by creating a new
1009 empty CCS project and configuring the debug session according to the following
1010 procedure:
1011
1012 \begin{enumerate}
1013         \item In Code Composer Studio click on
1014 \textsc{File$\rightarrow$New$\rightarrow$CCS Project}.  
1015         \item In the dialog window, type in a project name, for example
1016 myBinaryLoad, Select \textsc{Device
1017 variant} (ARM, Cortex R, \mcuname, Texas Instruments XDS100v2 USB Emulator)
1018 and select project template to \textsc{Empty Project}. The filled dialog should
1019 look like in Figure~\ref{fig-new-empty-project}
1020 \item Click the \textsc{Finish} button and a new empty project will
1021   be created.
1022 \item In the \textsc{Project Explorer} right-click on the project and
1023   select \textsc{Debug as$\rightarrow$Debug configurations}.
1024         \item Click  \textsc{New launch configuration} button
1025         \item Rename the New\_configuration to, for example, myConfiguration.
1026         \item Select configuration target file by clicking the \textsc{File
1027 System} button, finding and selecting the \texttt{rpp-lib-XXX/build/\tgtId/\tgconfigfilename} file. The result
1028 should look like in Figure~\ref{fig-debug-conf-main-diag}.  
1029 \item In the \textsc{program} pane select the binary file you want to
1030   download to the board. Click on the \textsc{File System} button,
1031   find and select the binary file. Try, for example
1032   \texttt{rpp-test-sw.out}. The result should look like in
1033   Figure~\ref{fig-debug-conf-program-diag}.
1034 \item You may also tune the target configuration as described in
1035   Section \ref{sec-target-configuration}.
1036 \item Finish the configuration by clicking the \textsc{Apply} button
1037   and download the code by clicking the \textsc{Debug} button. You can
1038   later invoke the download also from the
1039   \textsc{Run$\rightarrow$Debug} CCS menu. It is not necessary to
1040   create more Debug configurations and CCS empty projects as you can
1041   easily change the binary file in the Debug configuration to load a
1042   different binary file.
1043 \end{enumerate}
1044
1045 \begin{figure}[H]\begin{center}
1046         \includegraphics[scale=.45]{images/new_empty_project.png}
1047         \caption{New empty project dialog}
1048         \label{fig-new-empty-project}
1049 \end{center}\end{figure}
1050
1051 \begin{figure}[H]\begin{center}
1052         \includegraphics[scale=.45]{images/debug_configuration_main.png}
1053         \caption{Debug Configuration Main dialog}
1054         \label{fig-debug-conf-main-diag}
1055 \end{center}\end{figure}
1056
1057 \subsection{Target configuration}
1058 \label{sec-target-configuration}
1059 Default target configuration erases the whole Flash memory, before
1060 downloading the code. This takes long time and in most cases it is
1061 not necessary. You may disable this feature by the following procedure:
1062 \begin{enumerate}
1063         \item Right click on the project name in the \textsc{Project Browser}
1064         \item Select \textsc{Debug as$\rightarrow$Debug Configurations}
1065         \item In the dialog window select \textsc{Target} pane.
1066         \item In the \textsc{Flash Settings}, \textsc{Erase Options} select
1067 \textsc{Necessary sectors only}.
1068         \item Save the configuration by clicking the \textsc{Apply} button
1069 and close the dialog.
1070 \end{enumerate}
1071
1072 \begin{figure}[H]\begin{center}
1073         \includegraphics[scale=.45]{images/debug_configuration_program.png}
1074         \caption{Configuration Program dialog}
1075         \label{fig-debug-conf-program-diag}
1076 \end{center}\end{figure}
1077
1078 \section{Matlab Simulink usage}
1079 \label{sec-matlab-simulink-usage}
1080 This section describes the basics of working with the RPP code
1081 generation target for Simulink. For a more detailed description of the
1082 code generation target refer to
1083 Chapter~\ref{chap-simulink-coder-target}.
1084
1085 \subsection{Configuring Simulink for RPP}
1086 \label{sec-configuration-simulink-for-rpp}
1087 Before any work or experiments with the RPP blocks and models, the RPP
1088 target has to be configured to be able to find the ARM cross-compiler,
1089 native C compiler and some other necessary files. Also the S-Functions
1090 of the blocks have to be compiled by the mex tool.
1091 \begin{enumerate}
1092 \item Download and install Code Composer Studio CCS (see
1093   Section~\ref{sec-ti-ccs}).
1094 \item Install a C compiler. On Windows follow Section~\ref{sec-c-compiler}.
1095 \item On Windows you have to tell the \texttt{mex} which C compiler to
1096   use. In the Matlab command window run the \texttt{mex -setup}
1097   command and select the native C compiler.
1098
1099 \begin{lstlisting}[basicstyle=\tt\footnotesize]
1100 >> mex -setup
1101
1102 Welcome to mex -setup.  This utility will help you set up
1103 a default compiler.  For a list of supported compilers, see
1104 http://www.mathworks.com/support/compilers/R2013b/win64.html
1105
1106 Please choose your compiler for building MEX-files:
1107
1108 Would you like mex to locate installed compilers [y]/n? y
1109
1110 Select a compiler:
1111 [1] Microsoft Software Development Kit (SDK) 7.1 in c:\Program Files (x86)\Microsoft Visual Studio 10.0
1112
1113 [0] None
1114
1115 Compiler: 1
1116
1117 Please verify your choices:
1118
1119 Compiler: Microsoft Software Development Kit (SDK) 7.1
1120 Location: c:\Program Files (x86)\Microsoft Visual Studio 10.0
1121
1122 Are these correct [y]/n? y
1123
1124 ***************************************************************************
1125   Warning: MEX-files generated using Microsoft Windows Software Development
1126            Kit (SDK) require that Microsoft Visual Studio 2010 run-time
1127            libraries be available on the computer they are run on.
1128            If you plan to redistribute your MEX-files to other MATLAB
1129            users, be sure that they have the run-time libraries.
1130 ***************************************************************************
1131
1132
1133 Trying to update options file: C:\Users\Michal\AppData\Roaming\MathWorks\MATLAB\R2013b\mexopts.bat
1134 From template:              C:\PROGRA~1\MATLAB\R2013b\bin\win64\mexopts\mssdk71opts.bat
1135
1136 Done . . .
1137
1138 **************************************************************************
1139   Warning: The MATLAB C and Fortran API has changed to support MATLAB
1140            variables with more than 2^32-1 elements.  In the near future
1141            you will be required to update your code to utilize the new
1142            API. You can find more information about this at:
1143            http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html
1144            Building with the -largeArrayDims option enables the new API.
1145 **************************************************************************
1146 \end{lstlisting}
1147
1148 \item Configure the RPP code generation target:
1149
1150 Open Matlab and in the command window run:
1151
1152 \lstset{language=Matlab}
1153 \begin{lstlisting}
1154 cd <rpp-simulink>/rpp/rpp/
1155 rpp_setup
1156 \end{lstlisting}
1157
1158 This will launch the RPP setup script. This script will ask the user to provide
1159 the path to the CCS compiler root directory (the directory where \texttt{armcl}
1160 binary is located), normally:
1161
1162 \begin{verbatim}
1163 <ccs>/tools/compiler/arm_5.X.X/
1164 \end{verbatim}
1165
1166 Then Matlab path will be updated and block S-Functions will be built.
1167
1168 \item Create new model or load a demo:
1169
1170   Demos are located in \texttt{\repo/rpp/demos}. Creation of new
1171   models is described in Section~\ref{sec-crating-new-model} below.
1172 \end{enumerate}
1173
1174
1175 \subsection{Working with demo models}
1176 \label{sec-openning-demo-models}
1177 The demo models are available from the directory
1178 \texttt{\repo/rpp/demos}. To access the demo models for reference or
1179 for downloading to the RPP board open them in Matlab. Use either the
1180 GUI or the following commands:
1181
1182 \begin{lstlisting}[language=Matlab]
1183 cd <rpp-simulink>/rpp/demos
1184 open cantransmit.slx
1185 \end{lstlisting}
1186
1187 The same procedure can be used to open any other models. To build the
1188 demo select \textsc{Code$\rightarrow$C/C++ Code $\rightarrow$Build
1189   Model}. This will generate the C code and build the binary firmware
1190 for the RPP board. To run the model on the target hardware see
1191 Section~\ref{sec-running-model-on-hw}.
1192
1193 \subsection{Creating new model}
1194 \label{sec-crating-new-model}
1195 \begin{enumerate}
1196         \item Create a model by clicking \textsc{New$\rightarrow$Simulink Model}.
1197         \item Open the configuration dialog by clicking \textsc{Simulation$\rightarrow$Model Configuration Parameters}.
1198         \item The new Simulink model needs to be configured in the following way:
1199         \begin{compactitem}
1200         \item Solver (Figure \ref{fig-solver}):
1201          \begin{compactitem}
1202          \item Solver type: \emph{Fixed-step}
1203      \item Solver: \emph{discrete}
1204      \item Fixed-step size: \emph{Sampling period in seconds. Minimum
1205          is 0.001.}
1206          \item Tasking mode: \textit{SingleTasking}.
1207            \begin{figure}
1208                  \centering
1209                  \includegraphics[scale=.45]{images/simulink_solver.png}
1210                  \caption{Solver settings}
1211                  \label{fig-solver}
1212         \end{figure}
1213          \end{compactitem}
1214 %       \item Diagnostics $\rightarrow$ Sample Time (Figure~\ref{fig-sample-time-settings}):
1215 %        \begin{compactitem}
1216 %        \item Disable warning ``Source block specifies -1 sampling
1217 %        time''. It's ok for the source blocks to run once per tick.
1218 %          \begin{figure}
1219 %                \centering
1220 %                \includegraphics[scale=.45]{images/simulink_diagnostics.png}
1221 %                \caption{Sample Time settings}
1222 %                \label{fig-sample-time-settings}
1223 %       \end{figure}
1224 %       \end{compactitem}
1225         \item Code generation (Figure~\ref{fig-code-gen-settings}):
1226          \begin{compactitem}
1227          \item Set ``System target file'' to \texttt{rpp.tlc}.
1228            \begin{figure}
1229                  \centering
1230                  \includegraphics[scale=.45]{images/simulink_code.png}
1231                  \caption{Code Generation settings}
1232                  \label{fig-code-gen-settings}
1233         \end{figure}
1234         \end{compactitem}
1235 \end{compactitem}
1236 \item Once the model is configured, you can open the Library Browser
1237   (\textsc{View $\rightarrow$ Library Browser}) and add the necessary
1238   blocks to create the model. The RPP-specific blocks are located in
1239   the RPP Block Library.
1240         \item From Matlab command window change the current directory to where
1241 you want your generated code to appear, e.g.:
1242 \begin{lstlisting}[language=Matlab]
1243 cd /tmp/my-code
1244 \end{lstlisting}
1245 The code will be generated in a subdirectory named
1246 \texttt{<model>\_rpp}, where \texttt{model} is the name of the
1247 Simulink model.
1248         \item Generate the code by choosing \textsc{Code $\rightarrow$ C/C++
1249 Code  $\rightarrow$ Build Model}.
1250 \end{enumerate}
1251
1252 To run the model on the \tgtBoardName{} board continue with Section
1253 \ref{sec-running-model-on-hw}.
1254
1255 \subsection{Running models on the RPP board}
1256 \label{sec-running-model-on-hw}
1257 To run the model on the \tgtBoardName{} hardware you have to enable the download
1258 feature and build the model by following this procedure:
1259  \begin{enumerate}
1260  \item Open the model you want to run (see
1261    Section~\ref{sec-openning-demo-models} for example with demo
1262    models).
1263  \item Click on \textsc{Simulation$\rightarrow$Model Configuration
1264      Parameters}.
1265  \item In the \textsc{Code Generation$\rightarrow$RPP Options} pane
1266    check the \textsc{Download compiled binary to RPP} checkbox. Click
1267    the \textsc{OK} button
1268  \item Connect the target hardware to the computer (see Section
1269    \ref{sec-ccs-run-project}) and build the model by \textsc{Code
1270      $\rightarrow$ C/C++ Code $\rightarrow$ Build Model}. If the build
1271    succeeds, the download process will start automatically and once
1272    the downloading is finished, the application will run immediately.
1273 \end{enumerate}
1274
1275 %%\subsubsection{Using OpenOCD for downloading}
1276 %%\label{sec:using-open-downl}
1277 %%
1278 %%On Linux systems, it is possible to use an alternative download
1279 %%mechanism based on the OpenOCD tool. This results in much shorter
1280 %%download times. Using OpenOCD is enabled by checking ``Use OpenOCD to
1281 %%download the compiled binary'' checkbox. For more information about
1282 %%the OpenOCD configuration refer to our
1283 %%wiki\footnote{\url{http://rtime.felk.cvut.cz/hw/index.php/TMS570LS3137\#OpenOCD_setup_and_Flashing}}.
1284 %%
1285 %%Note: You should close any ongoing Code Composer Studio debug sessions
1286 %%before downloading the generated code to the RPP board. Otherwise the
1287 %%download fails.
1288
1289 \section{Configuring serial interface}
1290 \label{sec-configuration-serial-interface}
1291 The main mean for communication with the RPP board is the serial line.
1292 Each application may define its own serial line settings, but the
1293 following settings are the default:
1294
1295 \begin{itemize}
1296         \item Baudrate: 115200
1297         \item Parity: none
1298         \item Bits: 8
1299         \item Stopbits: 1
1300         \item Flow control: none
1301 \end{itemize}
1302
1303 Use GtkTerm on Linux or Bray Terminal on Windows for accessing the
1304 serial interface. On \tgtBoardName{} board, the serial line is tunneled over
1305 the USB.
1306 % TODO: Conditional compilation
1307  % See Section \ref{sec-hardware-description} for reference about
1308 % the position of the serial interface connector on the RPP board.
1309
1310 \section{Bug reporting}
1311 \label{sec-bug-reporting}
1312
1313 Please report any problems to CTU's bug tracking system at
1314 \url{https://redmine.felk.cvut.cz/projects/eaton-rm48}. New users have
1315 to register in the system and notify Michal Sojka about their
1316 registration via $\langle{}sojkam1@fel.cvut.cz\rangle{}$ email
1317 address.
1318
1319 \chapter{C Support Library}
1320 \label{chap-c-support-library}
1321
1322 This chapter describes the implementation of the C support library
1323 (RPP Library), which is used both for Simulink code generation target
1324 and command line testing tool.
1325
1326 \section{Introduction}
1327 \label{sec-description}
1328 The RPP C Support Library (also called RPP library) defines the API for
1329 working with the board. It includes drivers and the operating system.
1330 The library is
1331 designed from the board user perspective and exposes a simplified high-level API
1332 to handle the board's peripheral modules in a safe manner. The library is
1333 compiled as static library named \texttt{rpp-lib.lib} and can be found in
1334 \texttt{\repo/rpp/lib}.
1335
1336 The RPP library can be used in any project, where the RPP hardware
1337 support is required and it is also used in two applications --
1338 Simulink Coder Target, described in Chapter
1339 \ref{chap-simulink-coder-target}, and the command line testing tool,
1340 described in Chapter \ref{chap-rpp-test-software}.
1341
1342 For details about the library architecture, refer to Section~\ref{sec-software-architecture}.
1343
1344 \section{API development guidelines}
1345 \label{sec-api-development-guidlines}
1346
1347 The following are the development guidelines used for developing the RPP API:
1348
1349 \begin{compactitem}
1350         \item User documentation should be placed in header files, not in source
1351 code, and should be Doxygen formatted using autobrief. Documentation for each
1352 function present is mandatory.
1353         \item Function declarations in the headers files is for public functions
1354 only. Do not declare local/static/private functions in the header.
1355         \item Documentation in source code files should be non-doxygen formatted
1356 and intended for developers, not users. Documentation here is optional and at
1357 the discretion of the developer.
1358         \item Always use standard data types for IO when possible. Use custom
1359 structs as very last resort.  \item Use prefix based functions names to avoid
1360 clash. The prefix is of the form \texttt{$\langle$layer$\rangle$\_$\langle$module$\rangle$\_}, for example
1361 \texttt{rpp\_din\_update()} for the update function of the DIN module in the RPP
1362 Layer.  
1363         \item Be very careful about symbol export. Because it is used as a
1364 static library the modules should not export any symbol that is not intended to
1365 be used (function) or \texttt{extern}'ed (variable) from application. As a rule
1366 of thumb declare all global variables as static. 
1367         \item Only the RPP Layer symbols are available to user applications. All
1368 information related to lower layers is hidden for the application. This is
1369 accomplished by the inclusion of the rpp.h or rpp\_\{mnemonic\}.h file on the
1370 implementations files only and never on the interface files. Never expose any
1371 other layer to the application or to the whole system below the RPP layer. In
1372 other words, never \texttt{\#include "foo/bar.h"} in any RPP Layer header
1373 file.
1374 \end{compactitem}
1375
1376 \section{Coding style}
1377 \label{sec-coding-style}
1378 In order to keep the code as clean as possible, unified coding style
1379 should be followed by any contributor to the code. The used coding
1380 style is based on the default configuration of Code Composer Studio
1381 editor. Most notable rule is that the Tab character is 4 spaces.
1382
1383 The RPP library project is prepared for use of a tool named
1384 Uncrustify. The Uncrustify tool checks the code and fixes those lines
1385 that do not match the coding style. However, keep in mind that the
1386 program is not perfect and sometimes it can modify code where the
1387 suggested coding style has been followed. This does not causes
1388 problems as long as the contributor follows the committing procedure
1389 described in next paragraph.
1390
1391 When contributing to the code, the contributor should learn the
1392 current coding style from existing code. When a new feature is
1393 implemented and committed to the local repository, the following
1394 commands should be called in Linux terminal:
1395
1396 \begin{lstlisting}[language=bash]
1397 make uncrustify
1398 git diff
1399 \end{lstlisting}
1400 The first line command corrects many found coding style violations and
1401 the second command displays them. If the user agree with the
1402 modification, he/she should amend the last commit, for example by:
1403 \begin{lstlisting}[language=bash]
1404 git add --update
1405 git commit --amend
1406 \end{lstlisting}
1407
1408 \section{Subdirectory content description}
1409 \label{sec-rpp-lib-subdirectory-content-description}
1410
1411 The following files and directories are present in the library source
1412 code package:
1413
1414 \begin{description}
1415 \item[rpp-lib.lib] Compiled RPP library.
1416
1417   The library is needed for Simulink models and other ARM/\tgname{}
1418   applications. It is placed here by the Makefile, when the library is
1419   compiled.
1420
1421 \item[apps/] Various applications related to the RPP library.
1422
1423   This include the CCS studio project for generating of the static
1424   library and a test suite. The test suit in this directory has
1425   nothing common with the test suite described later in
1426   Chapter~\ref{chap-rpp-test-software} and those two suits are going
1427   to be merged in the future. Also other Hello World applications are
1428   included as a reference about how to create an \tgname{}
1429   application.
1430 \item[build] The library can be compiled for multiple targets. Each
1431   supported target has a subdirectory here, which stores configuration
1432   of how to compile the library and applications for different target.
1433   Each subdirectory contains a CCS project and Makefiles to build the
1434   library for the particular target.
1435 \item[build/$\langle$target$\rangle$/Makefile.config] Configuration
1436   for the particular target. This includes compiler and linker
1437   switches etc.
1438 \item[build/$\langle$target$\rangle$/*.cmd]
1439 CGT Linker command file.
1440
1441 This file is used by all applications that need to tun on the RPP
1442 board, including the Simulink models and test suite. It includes
1443 instructions for the CGT Linker about target memory layout and where
1444 to place various code sections.
1445 \item[os/] OS layers directory. See
1446   Section~\ref{sec-operating-system-layer} for more information about
1447   currently available operating system versions and
1448   Section~\ref{sec-changing-os} for information how to replace the
1449   operating system.
1450 \item[rpp/] Main directory for the RPP library.
1451 \item[rpp/doc/] RPP Library API
1452   documentation.
1453 \item[rpp/include/\{layer\} and rpp/src/\{layer\}] Interface files and
1454   implementations files for given \texttt{\{layer\}}. See
1455   Section~\ref{sec-software-architecture} for details on the RPP
1456   Layer.
1457 \item[rpp/include/rpp/rpp.h] Main library header file.
1458
1459   To use this library with all its modules, just include this file
1460   only. Also, before using any library function call the
1461   \texttt{rpp\_init()} function for hardware initialization.
1462 \item[rpp/include/rpp/rpp\_\{mnemonic\}.h] Header file for
1463   \texttt{\{mnemonic\}} module.
1464
1465   These files includes function definitions, pin definitions, etc,
1466   specific to \{mnemonic\} module. See also
1467   Section~\ref{sec-api-development-guidlines}.
1468
1469   If you want to use only a subset of library functions and make the
1470   resulting binary smaller, you may include only selected
1471   \texttt{rpp\_\{mnemonic\}.h} header files and call the specific
1472   \texttt{rpp\_\{mnemonic\}\_init} functions, instead of the
1473   \texttt{rpp.h} and \texttt{rpp\_init} function.
1474         \item[rpp/src/rpp/rpp\_\{mnemonic\}.c] Module implementation.
1475
1476       Implementation of \texttt{rpp\_\{mnemonic\}.h}'s functions on
1477       top of the DRV library.
1478         \item[rpp/src/rpp/rpp.c] Implementation of library-wide functions.
1479 \end{description}
1480
1481 \section{Compilation}
1482 \label{sec-compilation}
1483
1484 To compile the library open the Code Composer studio project
1485 \texttt{rpp-lib} from appropriate \texttt{build/<target>} directory
1486 (see Section~\ref{sec-openning-of-existing-project}) and build the
1487 project (\textsc{Project $\rightarrow$ Build Project}). If the build
1488 process is successful, the \texttt{rpp-lib.lib} and
1489 \texttt{Makefile.config} files will appear in the library root
1490 directory.
1491
1492 It is also possible to compile the library using the included
1493 \texttt{Makefile}. From the Linux command line run:
1494 \begin{lstlisting}[language=bash]
1495 cd <library-root>/build/<target>/Debug   #or Release
1496 make
1497 \end{lstlisting}
1498 Note that this only works if Code Composer Studio is installed in
1499 \texttt{/opt/ti} directory. Otherwise, you have to set
1500 \texttt{CCS\_UTILS\_DIR} variable.
1501
1502 On Windows command line run:
1503 \begin{lstlisting}[language=bash]
1504 cd <library-root>\build\<target>\Debug
1505 set CCS_UTILS_DIR=C:\ti\ccsv5\utils
1506 C:\ti\ccsv5\utils\bin\gmake.exe lib
1507 \end{lstlisting}
1508
1509 You have to use \texttt{gmake.exe} instead of \texttt{make} and it is
1510 necessary to set variable \texttt{CCS\_UTILS\_DIR} manually. You can
1511 also edit \texttt{\repo/build/Makefile.rules.arm} and set the variable
1512 there.
1513
1514 Note that the Makefile still requires the Code Composer Studio (ARM
1515 compiler) to be installed because of the CGT.
1516
1517 \section{Compiling applications using the RPP library}
1518 \label{sec:comp-appl-using}
1519
1520 The relevant aspects for compiling and linking an application using
1521 the RPP library are summarized below.
1522
1523 % \subsection{ARM target (RPP board)}
1524 % \label{sec:arm-target-rpp}
1525
1526 The detailed instructions are presented in
1527 Section~\ref{sec:creating-new-project}. Here we briefly repeat the
1528 main steps.
1529
1530         \begin{compactitem}
1531     \item Configure include search path to contain the directory of
1532       used FreeRTOS version, e.g.
1533       \texttt{\repo/os/8.2.2/include}. See Section
1534       \ref{sec-software-architecture}.
1535     \item Include \texttt{rpp/rpp.h} header file or just the needed
1536       peripheral specific header files such as \texttt{rpp/can.h}.
1537     \item Add library \texttt{rpp-lib.lib} to the linker libraries.
1538       The RPP library must be placed before Texas Instruments
1539       support library \tgtRtlib.
1540     \item Use the provided linker command file
1541       \texttt{\ldscriptname}.
1542         \end{compactitem}
1543
1544 % \subsection{POSIX target}
1545 % \label{sec:posix-target}
1546
1547 %       \begin{compactitem}
1548 %     \item Include headers files of the OS for Simulation. At the time
1549 %       of this writing the OS is POSIX FreeRTOS 6.0.4.
1550 %     \item Include header files for the RPP library or for modules you
1551 %       want to use (rpp\_can.h for CAN module for example).
1552 %     \item Add library \texttt{librpp.a} to the linker libraries.
1553 %     \item Add \texttt{pthread} to the linker libraries.
1554 %       \end{compactitem}
1555
1556 \section{Compiling API documentation}
1557 \label{sec-compiling-api-documentation}
1558 The documentation of the RPP layer is formatted using Doxygen
1559 documentation generator. This allows to generate a high quality API
1560 reference. To generate the API reference run in a Linux terminal:
1561
1562 \lstset{language=bash}
1563 \begin{lstlisting}
1564 cd <repo>/rpp/doc/api
1565 make
1566 xdg-open html/index.html
1567 \end{lstlisting}
1568
1569 The files under \texttt{\repo/rpp/doc/api/content} are used for the API
1570 reference generation are their name is self-explanatory:
1571
1572 \begin{verbatim}
1573 blocks_map.html
1574 blocks.png
1575 cvut.png
1576 footer.html
1577 main_page.dox
1578 \end{verbatim}
1579
1580 \section{Changing operating system}
1581 \label{sec-changing-os}
1582 The C Support Library contains by default the FreeRTOS operating
1583 system in version 8.2.2. This section describes what is necessary to
1584 change in the library and other packages in order to replace the
1585 operating system.
1586
1587 \subsection{Operating system code and API}
1588
1589 The source and header files of the current operating system (OS) are
1590 stored in directory \texttt{\repo/rpp/lib/os}. The files of the new
1591 operating system should also be placed in this directory.
1592
1593 To make the methods and resources of the new OS available to the C Support
1594 Library, modify the \texttt{\repo/rpp/lib/rpp/include/base.h} file to include
1595 the operating system header files.
1596
1597 Current implementation for FreeRTOS includes a header file
1598 \texttt{\repo/rpp/lib/os/\-8.2.2\-include/os.h}, which
1599 contains all necessary declarations and definitions for the FreeRTOS.
1600 We suggest to provide a similar header file for your operating system as
1601 well.
1602
1603 In order to compile another operating system into the library, it is
1604 necessary to modify \texttt{\repo/rpp/lib/Makefile.var} file, which
1605 contains a list of files that are compiled into the library. All lines
1606 starting with \texttt{os/} should be updated. 
1607
1608 \subsection{Device drivers}
1609 Drivers for SCI and ADC depend on the FreeRTOS features. These
1610 features need to be replaced by equivalent features of the new
1611 operating system. Those files should be modified:
1612 \begin{description}
1613 \item[\repo/rpp/lib/rpp/include/sys/ti\_drv\_sci.h] Defines a data
1614   structure, referring to FreeRTOS queue and semaphore.
1615 \item[\repo/rpp/lib/rpp/src/sys/ti\_drv\_sci.c] Uses FreeRTOS queues
1616   and semaphores.
1617 \item[\repo/rpp/lib/rpp/include/drv/sci.h] Declaration of
1618   \texttt{drv\_sci\_receive()} contains \texttt{portTick\-Type}. We
1619   suggest replacing this with OS independent type, e.g. number of
1620   milliseconds to wait, with $-1$ meaning infinite waiting time.
1621 \item[\repo/rpp/lib/rpp/src/drv/sci.c] Uses the following FreeRTOS
1622   specific features: semaphores, queues, data types
1623   (\texttt{portBASE\_TYPE}) and
1624   critical sections (\texttt{taskENTER\_CRITICAL} and
1625   \texttt{task\-EXIT\_CRITICAL}). Inside FreeRTOS critical sections,
1626   task preemption is disabled. The same should be ensured by the other
1627   operating system or the driver should be rewritten to use other
1628   synchronization primitives.
1629 \item[\repo/rpp/lib/rpp/src/drv/adc.c] Uses FreeRTOS semaphores.
1630 \end{description}
1631
1632 \subsection{System start}
1633 The initialization of the MCU and the system is in the
1634 \texttt{\repo/rpp/lib/rpp/src/sys/sys\_startup.c} file. If the new
1635 operating system needs to handle interrupts generated by the Real-Time
1636 Interrupt module, the pointer to the Interrupt Service Routine (ISR)
1637 \texttt{vPreemptiveTick} has to be replaced.
1638
1639 \subsection{Simulink template for main function}
1640
1641 When the operating system in the library is replaced, the users of the
1642 library must be changed as well. In case of Simulink code generation
1643 target, described in Chapter~\ref{chap-simulink-coder-target}, the
1644 template for generation of the \texttt{ert\_main.c} file, containing
1645 the main function, has to be modified to use proper functions for task
1646 creation, task timing and semaphores. The template is stored in
1647 \texttt{\repo/rpp/rpp/rpp\_srmain.tlc} file.
1648
1649 \chapter{Simulink Coder Target}
1650 \label{chap-simulink-coder-target}
1651
1652 The Simulink Coder Target allows to convert Simulink models to C code,
1653 compile it and download to the board.
1654
1655 \section{Introduction}
1656 \label{sec-introduction}
1657
1658 The Simulink RPP Target provides support for C source code generation from Simulink models and
1659 compilation of that code on top of the RPP library and the FreeRTOS operating system. This target
1660 uses Texas Instruments ARM compiler (\texttt{armcl}) included in the Code Generation Tools distributed with
1661 Code Composer Studio, and thus it depends on it for proper functioning.
1662
1663 This target also provides support for automatic download of the compiled binary to the RPP
1664 board.
1665
1666 \begin{figure}\begin{center}
1667 \noindent
1668 \includegraphics[scale=.45]{images/tlc_process.png}
1669 \caption{TLC code generation process. \cite[p. 1-6]{targetlanguagecompiler2013}}
1670 \end{center}\end{figure}
1671
1672 \section{Features and limitations}
1673 \label{sec-features}
1674
1675 \begin{itemize}
1676 \item Sampling frequencies up to 1\,kHz.
1677 \item Multi-rate models are executed in a single thread in
1678   non-preemptive manner. Support for multi-threaded execution will be
1679   available in the final version and will require careful audit of the
1680   RPP library with respect to thread-safe code.
1681 \item No External mode support yet. We work on it.
1682 \item Custom compiler options, available via OPTS variable in
1683   \emph{Make command} at \emph{Code Generation} tab (see Figure
1684   \ref{fig-code-gen-settings}). For example \texttt{make\_rtw
1685     OPTS="-O0 -g"}.
1686 \end{itemize}
1687
1688 \section{RPP Options pane}
1689 \label{sec-rpp-target-options}
1690
1691 The RPP Target includes the following configuration options, all of them
1692 configurable per model under  \textsc{Code Generation} \noindent$\rightarrow$
1693 \textsc{RPP Options}:
1694
1695 \begin{itemize}
1696 \item \textbf{C system stack size}: this parameter is passed directly
1697   to the linker for the allocation of the stack. Note that this stack
1698   is used only for initializing the application and FreeRTOS. Once
1699   everything is initialized, another stack is used by the generated
1700   code. See below. Default value is 4096.
1701
1702 \item \textbf{C system heap size}:
1703   \label{sec-rpp-target-options-heap-size} this parameter is passed
1704   directly to the linker for the allocation of the heap. Currently,
1705   the heap is not used, but will be used by the external mode in the future.
1706 Note that FreeRTOS uses its own heap whose size is independent of this
1707 parameter. 
1708 \item \textbf{Model step task stack size}: this parameter will be
1709 passed to the \texttt{xTaskCreate()} that
1710   creates the task for the model to run. In a Simulink model there are always two tasks:
1711  \begin{itemize}
1712  \item The worker task. This task is the one that executes the model
1713    step. This task requires enough stack memory to execute the step.
1714    If your model does not run, it might be caused by too small stack.
1715    The memory needed for the stack depends on the size and structure
1716    of the model.
1717  \item The control task. This task controls when the worker task should execute and controls overruns.
1718
1719  \end{itemize}
1720 \item \textbf{Download compiled binary to RPP}: if set, this option will download the generated binary to
1721   the board after the model is successfully built. Note that this option is unaware of the option
1722   \textit{Generate code only} in the \textit{Code Generation} options panel, so it will try to download even if
1723   only source code has been generated, failing graciously or uploading an old binary laying around
1724   in the build directory. This option calls the \texttt{rpp\_download.m} script, which is in turn a
1725   wrapper on the \texttt{loadti.sh}, \texttt{loadti.bat} and \texttt{loadopenocd.sh} script. More information on the \texttt{loadti.sh}
1726   script can be found in:
1727 \begin{verbatim}
1728 <ccs>/ccs_base/scripting/examples/loadti/readme.txt
1729 http://processors.wiki.ti.com/index.php/Loadti
1730 \end{verbatim}
1731
1732   The \texttt{loadti.sh} and \texttt{loadti.bat} script will close after the
1733 download of the generated program, leaving the loaded program running.
1734
1735   The \texttt{loadopenocd.sh} script will close after the download of the
1736 generated program as well, but the program will be stopped.  In order to run
1737 the loaded program a manual reset of the board is required.
1738
1739 \item \textbf{Download compiled binary to SDRAM}: This feature is not yet
1740 implemented for the simulink target.
1741
1742 \item \textbf{Use OpenOCD to download the compiled binary}: This feature is not yet
1743 implemented for the \mcuname{} simulink target.
1744 % TODO Not true - use conditional compilation here.
1745
1746 \item \textbf{Print model metadata to SCI at start}: if set this option will
1747 print a message to the Serial Communication Interface when the model start
1748 execution on the board. This is very helpful to identify the model running on
1749 the board. The message is in the form: 
1750
1751 \begin{verbatim}
1752 `model_name' - generated_date (TLC tlc_version)
1753 \end{verbatim}
1754
1755   For example:
1756 \begin{verbatim}
1757 `hbridge_analog_control' - Wed Jun 19 14:10:44 2013 (TLC 8.3 (Jul 20 2012))
1758 \end{verbatim}
1759 \end{itemize}
1760
1761 \section{Subdirectory  content description}
1762 \label{sec-simulink-subdirectory-content-description}
1763 This section describes the directories of the Simulink Coder. If you are
1764 interested in particular file, refer the description at the beginning of the
1765 file.
1766
1767 \begin{description}
1768         \item[doc/] Contains the sources of the documentation, you are now
1769 reading.  
1770         \item[refs/] Contains third party references, which license allows the
1771 distribution.
1772 \item[rpp/blocks] Contains the Simulink blocks specific to the
1773   \tgtBoardName{} board and their sources (.c and .tlc files). When an
1774   user calls \texttt{rpp\_setup.m}, these files are processed and
1775   Simulink block library \texttt{rpp\_lib.slx} is created.
1776         \item[rpp/blocks/tlc\_c]Contains the templates for C code generation from the
1777 Matlab Simulink model.
1778         \item[rpp/demos] Contains demo models, which purpose is to serve as a
1779 reference for the usage and for testing.  
1780         \item[rpp/lib] Contains the C Support Library. See Chapter
1781 \ref{chap-c-support-library}.  \item[rpp/loadopenocd] Contains download scripts
1782 for Linux support of the OpenOCD, for code downloading to the target.
1783         \item[rpp/loadti] Contains download scripts for Linux and Windows
1784 support for code downloading to the target, using Texas Instruments CCS code
1785 downloader.  
1786         \item[rpp/rpp] Contains set of support script for the Code Generator.
1787 \end{description}
1788
1789 \section{Block Library Overview}
1790 \label{sec-block-library-overview}
1791 The Simulink Block Library is a set of blocks that allows Simulink models to use
1792 board IO and communication peripherals. The available blocks are summarized in
1793 Table~\ref{tab:block-lib-status} and more detailed description is
1794 given in Section~\ref{sec-blocks-description}.
1795
1796 \begin{table}
1797 \begin{center}\begin{tabular}{|lp{5cm}lll|}
1798 \hline
1799 \textbf{Category} & \textbf{Name} & \textbf{Status} & \textbf{Mnemonic} & \textbf{Header} \\
1800 \hline
1801 \input{block_table.tex}
1802 \hline
1803 \end{tabular}\end{center}
1804
1805   \caption{Block library overview}
1806   \label{tab:block-lib-status}
1807 \end{table}
1808
1809 \label{sec-blocks-implementation}
1810 All of the blocks are implemented as manually created C Mex S-Function . In this section the 
1811 approach taken is briefly explained.
1812
1813 \subsection{C MEX S-Functions}
1814 \label{sec-c-mex-functions}
1815  \begin{compactitem}
1816  \item C : Implemented in C language. Other options are Fortran and Matlab language itself.
1817  \item MEX: Matlab Executable. They are compiled by Matlab - C compiler wrapper called MEX.
1818  \item S-Function: System Function, as opposed to standard functions, or user functions.
1819  \end{compactitem}
1820
1821 A C MEX S-Function is a structured C file that implements some mandatory and
1822 optional  callbacks for a specification of a number of inputs, outputs, data
1823 types, parameters, rate, validity checking, etc.  A complete list of callbacks
1824 can be found in:
1825         \begin{quotation}
1826 \htmladdnormallink{http://www.mathworks.com/help/simulink/create-cc-s-functions.html}{http://www.mathworks.com/help/simulink/create-cc-s-functions.html}
1827 \end{quotation}
1828
1829 The way a C MEX S-Function participates in a Simulink simulation is shown on the
1830 diagram \ref{fig-sfunctions-process}:
1831
1832 \begin{figure}[H]\begin{center}
1833 \noindent
1834 \includegraphics[scale=.45]{images/sfunctions_process.png}
1835 \caption{Simulation cycle of a S-Function. \cite[p. 57]{simulinkdevelopingsfunctions2013}}
1836 \label{fig-sfunctions-process}
1837 \end{center}\end{figure}
1838
1839 In general, the S-Function can perform calculations, inputs and outputs for simulation. Because 
1840 the RPP blocks are for hardware peripherals control and IO the blocks are 
1841 implemented as pure sink or pure source, the S-Function is just a descriptor of
1842 the block and does not perform any calculation and does not provide any input or
1843 output for simulations. 
1844
1845 The implementation of the S-Functions in the RPP project has following layout:
1846
1847 \begin{itemize}
1848   \item Define S-Function name \texttt{S\_FUNCTION\_NAME}.
1849   \item Include header file \texttt{header.c}, which in connection with
1850 \texttt{trailer.c} creates a miniframework for writing S-Functions.  
1851   \item In \texttt{mdlInitializeSizes} define:
1852   \begin{itemize}
1853         \item Number of \textit{dialog} parameter.
1854         \item Number of input ports.
1855         \begin{compactitem}
1856                 \item Data type of each input port.
1857         \end{compactitem}
1858         \item Number of output ports.
1859         \begin{compactitem}
1860                 \item Data type of each output port.
1861         \end{compactitem}
1862         \item Standard options for driver blocks.
1863   \end{itemize}
1864   \item In \texttt{mdlCheckParameters}:
1865   \begin{itemize}
1866         \item Check data type of each parameter.
1867         \item Check range, if applicable, of each parameter.
1868   \end{itemize}
1869   \item In \texttt{mdlSetWorkWidths}:
1870   \begin{compactitem}
1871         \item Map \textit{dialog} parameter to \textit{runtime} parameters.
1872         \begin{itemize}
1873                 \item Data type of each \textit{runtime} parameter.
1874         \end{itemize}
1875   \end{compactitem}
1876   \item Define symbols for unused functions.
1877   \item Include trailer file \texttt{trailer.c}.
1878 \end{itemize}
1879
1880 The C MEX S-Function implemented can be compiled with the following command:
1881
1882 \lstset{language=bash}
1883 \begin{lstlisting}
1884 <matlabroot>/bin/mex sfunction_{mnemonic}.c
1885 \end{lstlisting}
1886
1887 As noted the standard is to always prefix S-Function with \texttt{sfunction\_}
1888 and use lower case mnemonic of the block.
1889
1890 Also a script called \texttt{compile\_blocks.m} is included. The script that
1891 allows all \texttt{sfunctions\_*.c} to be fed to the \texttt{mex} compiler so
1892 all S-Functions are compiled at once. To use this script, in Matlab do:
1893
1894 \lstset{language=Matlab}
1895 \begin{lstlisting}
1896 cd <repo>/rpp/blocks/
1897 compile_blocks()
1898 \end{lstlisting}
1899
1900 \subsection{Target Language Compiler files}
1901 \label{sec-target-language-compiler-files}
1902
1903 In order to generate code for each one of the S-Functions, every S-Function implements a TLC file
1904 for \textit{inlining} the S-Function on the generated code. The TLC files describe how to 
1905 generate code for a specific C MEX S-Function block. They are programmed using TLC own language and 
1906 include C code within TLC instructions, just like LaTeX files include normal text in between LaTeX 
1907 macros.
1908
1909 The standard for a TLC file is to be located under the \texttt{tlc\_c} subfolder from where the 
1910 S-Function is located and to use the very exact file name as the S-Function but with the \texttt{.tlc}
1911 extension: \texttt{sfunction\_foo.c} \noindent$\rightarrow$ \texttt{tlc\_c/sfunction\_foo.tlc}
1912
1913 The TLC files implemented for this project use 3 hook functions in particular (other are available, 
1914 see TLC reference documentation):
1915 \begin{itemize}
1916 \item \texttt{BlockTypeSetup}: \newline{}
1917   BlockTypeSetup executes once per block type before code generation begins.
1918   This function can be used to include elements required by this block type, like includes or
1919   definitions.
1920 \item \texttt{Start}: \newline{}
1921   Code here will be placed in the \texttt{void
1922 $\langle$modelname$\rangle$\_initialize(void)}. Code placed here will execute
1923 only once.
1924 \item \texttt{Outputs}: \newline{}
1925   Code here will be placed in the \texttt{void
1926 $\langle$modelname$\rangle$\_step(void)} function. Should be used to get the
1927 inputs of a block and/or to set the outputs of that block.
1928 \end{itemize}
1929
1930 The general layout of the TLC files implemented for this project is:
1931 \begin{itemize}
1932 \item In \texttt{BlockTypeSetup}: \newline{}
1933   Call common function \texttt{\%$<$RppCommonBlockTypeSetup(block, system)$>$} that will include the 
1934   \texttt{rpp/rpp\i\_mnemonic.h} header file (can be called multiple times but header is included only once).
1935 \item \texttt{Start}: \newline{}
1936   Call setup routines from RPP Layer for the specific block type, like HBR enable, DIN pin setup, 
1937   DAC value initialization, SCI baud rate setup, among others.
1938 \item \texttt{Outputs}: \newline{}
1939   Call common IO routines from RPP Layer, like DIN read, DAC set, etc. Success of this functions
1940   is checked and in case of failure error is reported to the block using ErrFlag.
1941 \end{itemize}
1942
1943 C code generated from a Simulink model is placed on a file called
1944 \texttt{$\langle$modelname$\rangle$.c} along with other support files in a
1945 folder called \texttt{$\langle$modelname$\rangle$\_$\langle$target$\rangle$/}.
1946 For example, the source code generated for model \texttt{foobar} will be placed
1947 in current Matlab directory \texttt{foobar\_rpp/foobar.c}.
1948
1949 The file \texttt{$\langle$modelname$\rangle$.c} has 3 main functions:
1950 \begin{compactitem}
1951 \item \texttt{void $\langle$modelname$\rangle$\_step(void)}: \newline{}
1952   This function recalculates all the outputs of the blocks and should be called once per step. This
1953   is the main working function.
1954 \item \texttt{void $\langle$modelname$\rangle$\_initialize(void)}: \newline{}
1955   This function is called only once before the first step is issued. Default values for blocks IOs
1956   should be placed here.
1957 \item \texttt{void $\langle$modelname$\rangle$\_terminate(void)}: \newline{}
1958   This function is called when terminating the model. This should be used to free memory or revert 
1959   other operations made in the initialization function. With current implementation this function
1960   should never be called unless an error is detected and in most models it is empty.
1961 \end{compactitem}
1962
1963 \section{Block reference}
1964 \label{sec-blocks-description}
1965
1966 This section describes each one of the Simulink blocks present in the Simulink
1967 RPP block library, shown in Figure \ref{fig-block-library}.
1968
1969 \begin{figure}[h]
1970   \begin{center}
1971     \includegraphics[width=\textwidth]{images/block_library.png}
1972   \end{center}
1973 \caption{Simulink RPP Block Library.}
1974 \label{fig-block-library}
1975 \end{figure}
1976 \clearpage
1977 \input{block_desc.tex}
1978
1979 \section{Compilation}
1980 \label{sec-simulink-compilation}
1981 The first step, before any attempt to compile demo or other models, is to compile the S-Functions of the RPP blocks. The S-Functions are compiled during the Configuring Simulink for RPP, described in Section \ref{sec-configuration-simulink-for-rpp}. If you want to recompile the S-Functions without reconfiguring the Simulink, open the Matlab and run those commands in the Matlab commad line:
1982 \lstset{language=Matlab}
1983 \begin{lstlisting}
1984 cd <rpp-simulink>/rpp/blocks
1985 compile_blocks
1986 \end{lstlisting}
1987
1988 Once the S-Functions are compiled, the C code can be generated from the models. Demos can be compiled one by one with a procedure described in Section \ref{sec-openning-demo-models} or all at once with one of those procedures:
1989
1990 \begin{enumerate}
1991         \item Open Matlab and run those commands in the Matlab command line:
1992 \lstset{language=Matlab}
1993 \begin{lstlisting}
1994 cd <rpp-simulink>/rpp/demos
1995 rpp_build_demos
1996 \end{lstlisting}
1997         \item Run those commands in a Linux terminal:
1998 \begin{lstlisting}[language=bash]
1999 cd <rpp-simulink>/rpp/demos
2000 make
2001 \end{lstlisting}
2002
2003 or Windows command line:
2004
2005 \begin{lstlisting}[language=bash]
2006 cd <rpp-simulink>\rpp\demos
2007 "C:\ti\ccsv5\utils\bin\"gmake.exe lib
2008 \end{lstlisting}
2009
2010 Both commands will create a directory for each compiled demo, which will contain the generated C code and binary file with the firmware. To download the firmware to the board and run it, see Section \ref{sec-running-software-on-hw}.
2011 \end{enumerate}
2012
2013  \section{Adding new functionality}
2014 \label{sec:adding-new-funct}
2015 This section describes how to create new Simulink blocks and how to add them to the RPP
2016 blocks library. The new block creation process consists of several steps:
2017 \begin{enumerate}
2018         \item Addition of the new functionality to the RPP C support library.
2019         \item Definition of the block interface as a C MEX S-Function
2020           (Section~\ref{sec:block-definition-c})
2021         \item Compilation of the block definition to MEX file
2022           (Section~\ref{sec:c-mex-file})
2023         \item Creation of the code generator template (TLC) file
2024           (Section~\ref{sec:tlc-file-creation}).
2025         \item Creation of an S-Function block in the RPP block library
2026           and ``connecting'' this block with the C MEX and TLC files
2027           (Section~\ref{sec:creation-an-s})
2028         \item Optional: Creation of the mask for the new block. The mask
2029           specifies graphical representation of the block as well as
2030           the content of the block parameters dialog box.
2031 \end{enumerate}
2032 The following subsections demonstrate the procedure on an example of a simple user defined block.
2033
2034 \subsection{Block interface definition in a C MEX S-function}
2035 \label{sec:block-definition-c}
2036 In order to use a custom block in the Simulink model, Simulink must know
2037 a certain number of block attributes, such as the number and type of
2038 block inputs, outputs and parameters. These attributes are specified
2039 by a set of functions in a C file. This C file gets compiled by the MEX
2040 compiler into a MEX file and is then used in an S-Function block.
2041 Simulink calls the functions in the C MEX file to obtain the above
2042 mentioned block attributes. In case of RPP blocks, no other
2043 functionality is present in the C MEX file.
2044
2045 The C files are stored in \texttt{\repo/rpp/blocks} directory and are named as
2046 \texttt{sfunction\_$\langle$name$\rangle$.c}. Feel free to open any of
2047 the C files as a reference.
2048
2049 Every C file that will be used with the RPP library should begin with
2050 a comment in YAML\footnote{\url{http://yaml.org/},
2051   \url{https://en.wikipedia.org/wiki/YAML}} format. The information in
2052 this block is used to automatically generate both printed and on-line
2053 documentation. Although this block is not mandatory, it is highly
2054 recommended, as it helps keeping the documentation consistent and
2055 up-to-date.
2056
2057 The YAML documentation block may look like this:
2058 \begin{lstlisting}[language=c,basicstyle=\tt\footnotesize]
2059 /*
2060 %YAML 1.2
2061 ---
2062 Name: Name Of The Block
2063 Category: IO blocks
2064 Header: rpp/sci.h
2065 Mnemonic: MBLK
2066
2067 Inputs:
2068   - { name: "Some Input Signal", type: "bool" }
2069
2070 Outputs:
2071   - { name: "Some Output Signal", type: "bool"   }
2072
2073 Parameters:
2074
2075 # Description and Help is in Markdown mark-up
2076 Description: |
2077
2078   This is a stub of an example block.
2079
2080 Help: |
2081
2082   This block is a part of an example about how to create
2083   new Matlab Simulink blocks for RPP board.
2084
2085 Status: Unstable
2086
2087 RPP API functions used:
2088   - rpp_sci_print()
2089
2090 Relevant demos:
2091 ...
2092 */
2093 \end{lstlisting}
2094
2095 Following parts are obligatory and the block will not work without them. It starts with a
2096 definition of the block name and inclusion of a common source file:
2097
2098 \begin{lstlisting}[language=c]
2099 #define S_FUNCTION_NAME sfunction_myblock
2100 #include "header.c"
2101 \end{lstlisting}
2102
2103 To let Simulink know the type of the inputs, outputs and how many parameters
2104 will the block have, the \texttt{mdlInitializeSizes()} function has to be defined like this:
2105
2106 \begin{lstlisting}[language=c]
2107 static void mdlInitializeSizes(SimStruct *S)
2108 {
2109     /* The block will have no parameters. */
2110     if (!rppSetNumParams(S, 0)) {
2111         return;
2112     }
2113     /* The block will have one input signal. */
2114     if (!ssSetNumInputPorts(S, 1)) {
2115         return;
2116     }
2117     /* The input signal will be of type boolean */
2118     rppAddInputPort(S, 0, SS_BOOLEAN);
2119     /* The block will have one output signal */
2120     if (!ssSetNumOutputPorts(S, 1)) {
2121         return;
2122     }
2123     /* The output signal will be of type boolean */
2124     rppAddOutputPort(S, 0, SS_BOOLEAN);
2125     
2126     rppSetStandardOptions(S);
2127 }
2128 \end{lstlisting}
2129
2130 The C file may contain several other optional functions definitions for parameters check,
2131 run-time parameters definition and so on. For information about those functions refer the comments
2132 in the header.c file, trailer.c file and documentation of Simulink S-Functions.
2133
2134 The minimal C file compilable into C MEX has to contain following
2135 macros to avoid linker error messages about some of the optional
2136 functions not being defined:
2137 \begin{lstlisting}[language=c]
2138 #define COMMON_MDLINITIALIZESAMPLETIMES_INHERIT
2139 #define UNUSED_MDLCHECKPARAMETERS
2140 #define UNUSED_MDLOUTPUTS
2141 #define UNUSED_MDLTERMINATE
2142 \end{lstlisting}
2143
2144 Every C file should end by inclusion of a common trailer source file:
2145
2146 \begin{lstlisting}[language=c]
2147 #include "trailer.c"
2148 \end{lstlisting}
2149
2150 \subsection{C MEX file compilation}
2151 \label{sec:c-mex-file}
2152 In order to compile the created C file, the development environment
2153 has to be configured first as described in
2154 Section~\ref{sec-matlab-simulink-usage}.
2155
2156 All C files in the directory \texttt{\repo/rpp/blocks} can be compiled
2157 into C MEX by running script
2158 \texttt{\repo/rpp/blocks/compile\_blocks.m} from Matlab command
2159 prompt. If your block requires some special compiler options, edit the
2160 script and add a branch for your block.
2161
2162 To compile only one block run the \texttt{mex sfunction\_myblock.c}
2163 from Matlab command prompt.
2164
2165 \subsection{TLC file creation}
2166 \label{sec:tlc-file-creation}
2167 The TLC file is a template used by the code generator to generate the
2168 C code for the RPP board. The TLC files are stored in
2169 \texttt{\repo/rpp/blocks/tlc\_c} folder and their names must be the
2170 same (except for the extension) as the names of the corresponding
2171 S-Functions, i.e. \texttt{sfunction\_$\langle$name$\rangle$.tlc}. Feel
2172 free to open any of the TLC files as a reference.
2173
2174 TLC files for RPP blocks should contain a header:
2175 \begin{lstlisting}[language=c]
2176 %implements sfunction_myblock "C"
2177 %include "common.tlc"
2178 \end{lstlisting}
2179
2180 Code Generator expects several functions to be implemented in the TLC file. The functions are not obligatory, but most of the blocks will probably need them:
2181 \begin{enumerate}
2182         \item BlockTypeSetup
2183         \item BlockInstanceSetup
2184         \item Start
2185         \item Outputs
2186 \end{enumerate}
2187
2188 For detailed description about each one of those functions, refer to
2189 \cite{targetlanguagecompiler2013}. A simple TLC file, which generates
2190 some code may look like this:
2191 \begin{lstlisting}[language=c]
2192 %implements sfunction_myblock "C"
2193 %include "common.tlc"
2194
2195 %function BlockTypeSetup(block, system) void
2196         %% Ensure required header files are included
2197         %<RppCommonBlockTypeSetup(block, system)>
2198         %<LibAddToCommonIncludes("rpp/sci.h")>
2199 %endfunction
2200
2201 %function Outputs(block, system) Output
2202   %if !SLibCodeGenForSim()
2203     %assign in_signal = LibBlockInputSignal(0, "", "", 0)
2204     %assign out_signal = LibBlockOutputSignal(0, "", "", 0)
2205
2206     %<out_signal> = !%<in_signal>;
2207     rpp_sci_printf("Value: %d\r\n", %<in_signal>);
2208 %endif
2209 %endfunction
2210 %% [EOF]
2211 \end{lstlisting}
2212
2213 The above template causes the generated code to contain
2214 \texttt{\#include "rpp/sci.h"} line and whenever the block is
2215 executed, its output will be the negation of its input and the value
2216 of the input signal will be printed to the serial line.
2217
2218 \subsection{Creation of an S-Function block in the RPP block library}
2219 \label{sec:creation-an-s}
2220 User defined Simulink blocks can be included in the model as
2221 S-Function blocks. Follow this procedure to create a new block in the
2222 RPP block library:
2223 \begin{enumerate}
2224 \item Create a new Simulink library by selecting
2225   \textsc{File$\rightarrow$New$\rightarrow$Library} and save it as
2226   \texttt{\repo\-/rpp/blocks/rpp\_$\langle$name$\rangle$.slx}.
2227   Alternatively, open an existing library.
2228 \item In case of opening an existing library, unlock it for editing by
2229   choosing \textsc{Diagram$\rightarrow$Unlock Library}.
2230 \item Open a Simulink Library Browser
2231   (\textsc{View$\rightarrow$Library Browser}) open
2232   \textsc{Simulink$\rightarrow$User-Defined Functions} and drag the
2233   \textsc{S-Function} block into the newly created library.
2234 \item Double click on the just created \textsc{S-Function} block and
2235   fill in the \textsc{S-function name} field. Put there the name
2236   (without the extension) of the created C MEX S-Function, e.g.
2237   sfunction\_myblock. The result should like like in
2238   Figure~\ref{fig-simulink_s_fun_cfg}.
2239   \begin{figure}[h]\begin{center}
2240       \noindent
2241       \includegraphics[scale=.45]{images/simulink_s_fun_config.png}
2242       \caption{Configuration dialog for user defined S-function.}
2243       \label{fig-simulink_s_fun_cfg}
2244     \end{center}\end{figure}
2245 \item If your block has some parameters, write their names (you can
2246   choose them arbitrarily) in the \textsc{S-function parameters}
2247   field, separated by commas. \label{item:1}
2248 \item Now you should see the new Simulink block with the right number
2249   of inputs and outputs.
2250 \item Optional: Every user-defined block can have a \emph{mask}, which
2251   provides some useful information about the name of the block,
2252   configuration dialog for parameters and names of the IO signals. The
2253   block can be used even without the mask, but it is not as user
2254   friendly as with proper mask. Right-click the block and select
2255   \textsc{Mask$\rightarrow$Create Mask...}. In the definition of
2256   parameters, use the same names as in step~\ref{item:1}. See
2257   \cite[Section ``Block Masks'']{mathworks13:simul_2013b} for more
2258   information.
2259 \item Save the library and run \texttt{rpp\_setup} (or just
2260   \texttt{rpp\_generate\_lib}) from Matlab command line to add the newly
2261   created block to RPP block library (\texttt{rpp\_lib.slx}).
2262 \end{enumerate}
2263
2264 Now, you can start using the new block in Simulink models as described
2265 in Section~\ref{sec-crating-new-model}.
2266
2267
2268 \section{Demos reference}
2269 The Simulink RPP Demo Library is a set of Simulink models that use blocks from
2270 the Simulink RPP Block Library and generates code using the Simulink RPP Target.
2271
2272 This demos library is used as a test suite for the Simulink RPP Block Library
2273 but they are also intended to show basic programs built using it. Because of
2274 this, the demos try to use more than one
2275 type of block and more than one block per block type.
2276
2277 In the reference below you can find a complete description for each of the demos.
2278
2279 \subsection{ADC demo}
2280 \begin{figure}[H]\begin{center}
2281 \noindent
2282 \includegraphics[scale=.45]{images/demo_adc.png}
2283 \caption{Example of the usage of the Analog Input blocks for RPP.}
2284 \end{center}\end{figure}
2285
2286 \textbf{Description:}
2287
2288 Demostrates how to use Analog Input blocks in order to measure voltage. This demo
2289 measures voltage on every available Analog Input and prints the values on the
2290 Serial Interface.
2291
2292 \subsection{Simple CAN demo}
2293 \begin{figure}[H]\begin{center}
2294 \noindent
2295 \includegraphics[scale=.45]{images/demo_simple_can.png}
2296 \caption{The simplest CAN demonstration.}
2297 \end{center}\end{figure}
2298
2299 \textbf{Description:}
2300
2301 The simplest possible usage of the CAN bus. This demo is above all designed for
2302 testing the CAN configuration and transmission.
2303
2304 \subsection{CAN transmit}
2305 \begin{figure}[H]\begin{center}
2306 \noindent
2307 \includegraphics[scale=.45]{images/demo_cantransmit.png}
2308 \caption{Example of the usage of the CAN blocks for RPP.}
2309 \end{center}\end{figure}
2310
2311 \textbf{Description:}
2312
2313 Demostrates how to use CAN Transmit blocks in order to:
2314
2315 \begin{compactenum}
2316 \item Send unpacked data with data type uint8, uint16 and uint32.
2317 \item Send single and multiple signals packed into CAN\_MESSAGE by CAN Pack block.
2318 \item Send a message as extended frame type to be received by CAN Receive
2319 configured to receive both, standard and extended frame types.
2320 \end{compactenum}
2321
2322 Demostrates how to use CAN Receive blocks in order to:
2323
2324 \begin{compactenum}
2325 \item Receive unpacked data of data types uint8, uint16 and uint32.
2326 \item Receive and unpack received CAN\_MESSAGE by CAN Unpack block.
2327 \item Configure CAN Receive block to receive Standard, Extended and both frame types.
2328 \item Use function-call mechanism to process received messages
2329 \end{compactenum}
2330
2331 \subsection{Continuous time demo}
2332 \begin{figure}[H]\begin{center}
2333 \noindent
2334 \includegraphics[scale=.45]{images/demo_continuous.png}
2335 \caption{The demonstration of contiuous time.}
2336 \end{center}\end{figure}
2337
2338 \textbf{Description:}
2339
2340 This demo contains two integrators, which are running at continuous time. The main goal
2341 of this demo is to verify that the generated code is compilable and is working even when
2342 discrete and continuous time blocks are combined together.
2343
2344 \subsection{Simulink Demo model}
2345 \begin{figure}[H]\begin{center}
2346 \noindent
2347 \includegraphics[scale=.45]{images/demo_board.png}
2348 \caption{Model of the complex demonstration of the boards peripherals.}
2349 \end{center}\end{figure}
2350
2351 \textbf{Description:}
2352
2353 This model demonstrates the usage of RPP Simulink blocks in a complex and interactive
2354 application. The TI HDK kit has eight LEDs placed around the MCU. The application
2355 rotates the light around the MCU in one direction. Every time the user presses the button
2356 on the HDK, the direction is switched.
2357
2358 The state of the LEDs is sent on the CAN bus as a message with ID 0x1. The button can
2359 be emulated by CAN messages with ID 0x0. The message 0x00000000 simulates button release
2360 and the message 0xFFFFFFFF simulates the button press.
2361
2362 Information about the state of the application are printed on the Serial Interface. 
2363
2364 \subsection{Echo char}
2365 \begin{figure}[H]\begin{center}
2366 \noindent
2367 \includegraphics[scale=.45]{images/demo_echo_char.png}
2368 \caption{Echo Character Simulink demo for RPP.}
2369 \end{center}\end{figure}
2370
2371 \textbf{Description:}
2372
2373 This demo will echo (print back) any character received through the Serial Communication
2374 Interface (115200-8-N-1).
2375
2376 Note that the send subsystem is implemented a as \textit{triggered} subsystem and will execute only
2377 if data is received, that is, Serial Receive output is non-negative. Negative values are errors.
2378
2379 \subsection{GIO demo}
2380 \begin{figure}[H]\begin{center}
2381 \noindent
2382 \includegraphics[scale=.45]{images/demo_gio.png}
2383 \caption{Demonstration of DIN and DOUT blocks}
2384 \end{center}\end{figure}
2385
2386 \textbf{Description:}
2387
2388 The model demonstrates how to use the DIN blocks and DOUT blocks, configured in every mode. The DOUTs
2389 are pushed high and low with period 1 second. The DINs are reading inputs and printing the values
2390 on the Serial Interface with the same period.
2391
2392 \subsection{Hello world}
2393 \begin{figure}[H]\begin{center}
2394 \noindent
2395 \includegraphics[scale=.45]{images/demo_hello_world.png}
2396 \caption{Hello World Simulink demo for RPP.}
2397 \end{center}\end{figure}
2398
2399 \textbf{Description:}
2400
2401 This demo will print \texttt{Hello Simulink} to the Serial Communication Interface (115200-8-N-1) one
2402 character per second. The output speed is driven by the Simulink model step which is set to one
2403 second.
2404
2405 \subsection{Multi-rate single thread demo}
2406 \label{sec:mult-single-thre}
2407
2408 \begin{figure}[H]\begin{center}
2409 \noindent
2410 \includegraphics[scale=.45]{images/demo_multirate_st.png}
2411 \caption{Multi-rate singlet hread Simulink demo for RPP.}
2412 \end{center}\end{figure}
2413
2414 \textbf{Description:}
2415
2416 This demo will toggle LEDs on the Hercules Development Kit with
2417 different rate. This is implemented with multiple Simulink tasks, each
2418 running at different rate. In the generated code, these tasks are
2419 called from a singe thread and therefore no task can preempt another
2420 one.
2421
2422 The state of each LED is printed to the Serial Communication Interface
2423 (115200-8-N-1) when toggled.
2424
2425 \begin{center}
2426         \begin{tabular}{lll}
2427     \rowcolor[gray]{0.9}
2428                 LED & pin & rate [s] \\
2429                 1 & NHET1\_25 & 0.3 \\
2430                 2 & NHET1\_05 & 0.5 \\
2431                 3 & NHET1\_00 & 1.0 \\
2432         \end{tabular}
2433         \captionof{table}{LEDs connection and rate}
2434         \label{tab:multirate_st_led_desc}
2435 \end{center}
2436
2437
2438 \chapter{Command line testing tool}
2439 \label{chap-rpp-test-software}
2440 \section{Introduction}
2441 \label{sec-rpp-test-sw-intro}
2442 The \texttt{rpp-test-suite} is a RPP application developed testing and direct
2443 control of the RPP hardware. The test suite implements a command processor,
2444 which is listening for commands and prints some output related to the commands
2445 on the serial interface. The command processor is modular and each peripheral
2446 has its commands in a separate module.
2447
2448 The command processor is implemented in \texttt{$\langle$rpp-test-sw$\rangle$/cmdproc} and commands
2449 modules are implemented in \texttt{$\langle$rpp-test-sw$\rangle$/commands} directory.
2450
2451 The application enables a command processor using the SCI at
2452 \textbf{115200-8-N-1}. When the software starts, the received welcome message
2453 and prompt should look like:
2454
2455
2456 \ifx\tgtId\tgtIdTMSRPP
2457 \begin{verbatim}
2458 Rapid Prototyping Platform v00.01-001
2459 Test Software version v0.2-261-gb6361ca
2460 CTU in Prague 2014
2461 --> 
2462 \end{verbatim}
2463 \else
2464 \begin{verbatim}
2465 Ti HDK \mcuname, FreeRTOS 7.0.2
2466 Test Software version eaton-0.1-beta-8-g91419f5
2467 CTU in Prague 10/2014
2468 --> 
2469 \end{verbatim}
2470 \fi
2471
2472 Type in command help for a complete list of available command, or help command
2473 for a description of concrete command.
2474
2475 \section{Compilation}
2476 \label{sec-rpp-test-sw-compilation}
2477 Before the Testing tool can be compiled, the RPP Library has to be built and the binary file \texttt{rpp-lib.lib} has to be present in the \texttt{\repo/rpp-lib/} directory. Once this requirement is fulfilled, there are two ways how to compile the Testing tool.
2478 \begin{enumerate}
2479         \item Using a Code Composer Studio, which is described in Section \ref{sec-project-installation}. The procedure of downloading the firmware right from the CCS and running it on the hardware is described in Section \ref{sec-running-software-on-hw}.
2480         \item Using a make from a Linux terminal or gmake from a Windows command line. The procedure of how to download and run the binary on the hardware is described in Section \ref{sec-binary-file}.
2481
2482 To build the Testing tool from Linux terminal run:
2483 \begin{lstlisting}[language=bash]
2484 cd <rpp-test-sw>
2485 make
2486 \end{lstlisting}
2487
2488 or from Windows command line:
2489
2490 \begin{lstlisting}[language=bash]
2491 cd <rpp-test-sw>
2492 "C:\ti\ccsv5\utils\bin\"gmake.exe
2493 \end{lstlisting}
2494
2495 On Windows \texttt{gmake.exe} supplied with CCS is used instead of
2496 \texttt{make}.
2497 \end{enumerate}
2498
2499 \section{Commands description}
2500
2501 This section contains the description of the available commands. The
2502 same description is also available in the program itself via the
2503 \texttt{help} command.
2504
2505 \input{rpp-test-sw-cmds.tex}
2506
2507 \chapter{Glossary}
2508
2509 \begin{description}
2510 \item[ADC]
2511   \textit{Analog to Digital Converter.} \newline{}
2512   Hardware circuitry that converts a continuous physical quantity (usually voltage) to a
2513   digital number that represents the quantity's amplitude.
2514
2515 \item[AIN]
2516   \textit{Analog Input.} \newline{}
2517   Mnemonic to refer to or something related to the analog input (ADC) hardware module.
2518
2519 \item[AOUT]
2520   \textit{Analog Output.} \newline{}
2521   Mnemonic to refer to or something related to the analog output (DAC) hardware module.
2522
2523 \item[API] \textit{Application Programming Interface}
2524
2525 \item[CAN]
2526   \textit{Controller Area Network.} \newline{}
2527   The CAN Bus is a vehicle bus standard designed to allow microcontrollers and devices to
2528   communicate with each other within a vehicle without a host computer.
2529   In this project it is also used as mnemonic to refer to or something related to the CAN
2530   hardware module.
2531
2532 \item[CCS] \textit{Code Composer Studio} \\
2533   Eclipse-based IDE provided by Texas Instruments.
2534
2535 \item[CGT]
2536   \textit{Code Generation Tools.} \newline{}
2537   Name given to the tool set produced by Texas Instruments used to compile, link, optimize,
2538   assemble, archive, among others. In this project is normally used as synonym for
2539   ``Texas Instruments ARM compiler and linker."
2540
2541 \item[DAC]
2542   \textit{Digital to Analog Converter.} \newline{}
2543   Hardware circuitry that converts a digital (usually binary) code to an analog signal
2544   (current, voltage, or electric charge).
2545
2546 \item[DIN]
2547   \textit{Digital Input.} \newline{}
2548   Mnemonic to refer to or something related to the digital input hardware module.
2549
2550 \item[ECU]
2551   \textit{Engine Control Unit.} \newline{}
2552   A type of electronic control unit that controls a series of actuators on an internal combustion
2553   engine to ensure the optimum running.
2554
2555 \item[ETH]
2556   \textit{Ethernet.} \newline{}
2557   Mnemonic to refer to or something related to the Ethernet hardware module.
2558
2559 \item[FR]
2560   \textit{FlexRay.} \newline{}
2561   FlexRay is an automotive network communications protocol developed to govern on-board automotive
2562   computing.
2563   In this project it is also used as mnemonic to refer to or something related to the FlexRay
2564   hardware module.
2565
2566 \item[GPIO]
2567   \textit{General Purpose Input/Output.} \newline{}
2568   Generic pin on a chip whose behavior (including whether it is an input or output pin) can be
2569   controlled (programmed) by the user at run time.
2570
2571 \item[HBR]
2572   \textit{H-Bridge.} \newline{}
2573   Mnemonic to refer to or something related to the H-Bridge hardware module. A H-Bridge is
2574   an electronic circuit that enables a voltage to be applied across a load in either direction.
2575
2576 \item[HOUT]
2577   \textit{High-Power Output.} \newline{}
2578   Mnemonic to refer to or something related to the 10A, PWM, with current sensing, high-power
2579   output hardware module.
2580
2581 \item[IDE]
2582   \textit{Integrated Development Environment.} \newline{}
2583   An IDE is a Software application that provides comprehensive facilities to computer programmers
2584   for software development.
2585
2586 \item[LCT]
2587   \textit{Legacy Code Tool.} \newline{}
2588   Matlab tool that allows to generate source code for S-Functions given the descriptor of a C 
2589   function call.
2590
2591 \item[MBD]
2592   \textit{Model-Based Design.} \newline{}
2593   Model-Based Design (MBD) is a mathematical and visual method of addressing problems associated
2594   with designing complex control, signal processing and communication systems. \cite{modelbasedwiki2013}
2595
2596 \item[MEX]
2597   \textit{Matlab Executable.} \newline{}
2598   Type of binary executable that can be called within Matlab. In this document the common term
2599   used is `C MEX S-Function", which means Matlab executable written in C that implements a system
2600   function.
2601
2602 \item[PWM]
2603   \textit{Pulse-width modulation.} \newline{}
2604   Technique for getting analog results with digital means. Digital control is used to create a
2605   square wave, a signal switched between on and off. This on-off pattern can simulate voltages
2606   in between full on and off by changing the portion of the time the signal spends on versus
2607   the time that the signal spends off. The duration of ``on time" is called the pulse width or
2608   \textit{duty cycle}.
2609
2610 \item[RPP] \textit{Rapid Prototyping Platform.} \newline{} Name of the
2611   developed platform, that includes both hardware and software.
2612
2613 \item[SCI]
2614   \textit{Serial Communication Interface.} \newline{}
2615   Serial Interface for communication through hardware's UART using communication standard RS-232.
2616   In this project it is also used as mnemonic to refer to or something related to the Serial
2617   Communication Interface hardware module.
2618
2619 \item[SDC]
2620   \textit{SD-Card.} \newline{}
2621   Mnemonic to refer to or something related to the SD-Card hardware module.
2622
2623 \item[SDR]
2624   \textit{SD-RAM.} \newline{}
2625   Mnemonic to refer to or something related to the SD-RAM hardware module for logging.
2626
2627 \item[TLC]
2628   \textit{Target Language Compiler.} \newline{}
2629   Technology and language used to generate code in Matlab/Simulink.
2630
2631 \item[UART]
2632   \textit{Universal Asynchronous Receiver/Transmitter.} \newline{}
2633   Hardware circuitry that translates data between parallel and serial forms.
2634 \end{description}
2635
2636 \printbibliography
2637
2638 \end{document}
2639
2640 %  LocalWords:  FreeRTOS RPP POSIX microcontroller HalCoGen selftests
2641 %  LocalWords:  MCU UART microcontrollers DAC CCS simulink SPI GPIO
2642 %  LocalWords:  IOs HDK TMDSRM