]> rtime.felk.cvut.cz Git - jenkicar/rpp-simulink.git/blob - doc/thesis/report.t2t
Moving thesis to upper level.
[jenkicar/rpp-simulink.git] / doc / thesis / report.t2t
1 Final Report
2 Carlos Jenkins
3 %%date(%B, %Y)
4
5 %!target: tex
6 %!style(xhtmls): media/themes/Clean/style.css
7 %!postproc(xhtmls): 'NEWPAGE' ''
8 %!nested(xhtmls): --libs syntaxhighlighter
9 %!options(tex): --enum-title --toc --toc-level 5
10 %!postproc(tex): '\.pdf\.png' '.pdf'
11 %!postproc(tex): 'NEWPAGE' '\\newpage'
12 %!postproc(tex): '-\$>\$' '\\noindent$\\rightarrow$'
13 %!postproc(tex): 'TAB' '\\hspace{1.0em}'
14 %!nested(tex): --docclass {article} --pdf
15
16 %S = Table of contents =[table_of_contents]
17
18 %DONE
19
20 %Table of contents
21 %%toc
22
23 NEWPAGE
24
25 %Table of contents
26 %tex% ''' \listoffigures
27
28 NEWPAGE
29
30 = Introduction =[introduction]
31
32 %DONE
33
34 This document describes the final results of the project ``Code generation for automotive rapid
35 prototyping platform using Matlab/Simulink".
36
37
38 == Background ==[background]
39
40 %DONE
41
42 Back in the beginning of 2012 a leading automotive company requested the Czech Technical University
43 to develop a Engine Control Unit (ECU) for automotive applications. Real-Time Systems group at the
44 Department of Control Engineering from the Faculty of Electrical Engineering developed a hardware
45 and Software platform to the needs of this industry. The hardware uses Texas Instruments
46 TMS570LS3137 CPU and is built with automotive standards and interfaces in mind. It uses a real-time
47 operating system and was directly programmed in C.
48
49 Nevertheless, in accordance to company policies the Software developed for the engine control unit
50 must be designed in a safe and auditable way. The company has the policy to implement the Software
51 for their system using Model-Based Design:
52
53         Model-Based Design (MBD) is a mathematical and visual method of addressing
54         problems associated with designing complex control, signal processing and
55         communication systems. It is used in many motion control, industrial equipment,
56         aerospace, and automotive applications. Model-based design is a methodology
57         applied in designing embedded software.
58
59 In order to meet this requirement an interaction layer between the platform and the Software the
60 company uses, Matlab/Simulink, must be implemented. This document describes the implementation of
61 this interaction system.
62
63 == Technologies involved ==[technologies_involved]
64
65 %DONE
66
67 + Matlab/Simulink data flow graphical programming language tool for modeling, simulating and
68   analyzing multidomain dynamic systems.
69 + Standard ANSI C programming.
70 + FreeRTOS real-time operating system.
71 + Texas Instruments TI Code Generation Tools (CGT).
72 + RPP in-house automotive hardware board using Texas Instruments TMS570LS3137 CPU.
73
74
75
76 NEWPAGE
77
78 == Objectives ==[objectives]
79
80 %DONE
81
82 Main objectives of this project are:
83
84 + Allow C code generation from Matlab/Simulink models for custom made hardware platform.
85 + Implement model blocks for some of the peripheral units of the board for use in Simulink
86   programming.
87
88
89 At the time of this writing the objectives of this project are considered successfully achieved.
90
91 == Benefits ==[benefits]
92
93 %DONE
94
95 Expected benefits of this project are:
96
97 + Enabling faster implementation and rapid-prototyping of Software components through the use of
98   model-based programming.
99 + Enabling better and clearer visualization of Software implementations for the hardware board
100   through models.
101 + Improve auditability of Software system for automotive applications.
102
103
104 At the time of this writing the benefits of this project are considered enabled.
105
106 == Final outcome ==[final_outcome]
107
108 %DONE
109
110 The main products generated for this project are:
111
112 - **C Support Library**: @@
113   Define the API to communicate with the board. Include drivers and operating system.
114
115 - **Simulink Coder Target**: @@
116   Allows Simulink model's code generation, compilation and download for the board.
117
118 - **Simulink Block Library**: @@
119   Set of blocks that allows Simulink models to use board IO and communication peripherals.
120
121 - **Simulink Demos Library**: @@
122   Just a bunch of examples of control application in form of Simulink models.
123
124
125 Each of this product is described deeply in the following sections.
126
127 NEWPAGE
128
129 == Document layout ==[document_layout]
130
131 %DONE
132
133 The general layout of this document is as follows:
134
135 - Project description, objectives and outcome. This section.
136 - Software and Hardware setup for development, repository layout and programming standards.
137 - A section for each of the four products delivered, with:
138  - Implementation fundamentals.
139  - Repository branch description.
140  - Product specific aspects.
141  - Reference documentation.
142 - Glossary.
143 - References.
144 - Appendices.
145
146
147 NEWPAGE
148
149 = Project setup =[project_setup]
150
151 %DONE
152
153 This sections describes the Software and Hardware aspects required to undertake development for
154 this project. It considers:
155
156 - Software development environment.
157 - Hardware reference documentation and wiring for development.
158 - Repository's general layout.
159
160
161 == Development environment ==[development_environment]
162
163 %DONE
164
165 This section describes the Software environment setup for development.
166
167 === Operating system ===[operating_system]
168
169 %DONE
170
171 This project was developed on a GNU/Linux operating system. For development it is recommended to
172 use a Debian based operating system for development as most of the tools are easily available from
173 repositories.
174
175 Relevant OS information on which this project was developed:
176
177 - Ubuntu 12.04.2 LTS AMD64.
178 - Kernel 3.2.0-48-generic.
179 - GCC version 4.6.3.
180
181
182 No test for cross-platform interoperability was performed on the code developed. Although care was
183 taken to try to provide platform independent code and tools there is elements known to be Linux
184 dependent. For a list of this elements refer to
185 [Appendix B: Known operating-system dependent files #appendix_b_known_operating_system_dependent_files].
186
187 === Version Control System ===[version_control_system]
188
189 %DONE
190
191 The version control system used for this project is **git**. The repository of this project
192 contains all the files produced during development, including documentation, references, code and
193 graphics. Also, the GUI application **giggle** was used to easily review changes. To install both
194 execute on a terminal:
195
196 {{{ bash
197 sudo apt-get install git giggle
198 }}}
199
200 NEWPAGE
201
202 === TI Code Composer Studio ===[ti_code_composer_studio]
203
204 %DONE
205
206 Code Composer Studio (CCS) is the official Integrated Development Environment (IDE) for developing
207 applications for Texas Instruments embedded processors. CCS is multiplatform Software based on
208 Eclipse Open Source IDE.
209
210 The version used in this project is the 5.3.0. Download and install CCS for Linux from:
211
212         http://processors.wiki.ti.com/index.php/Category:Code_Composer_Studio_v5
213
214 CCS download requires a valid MyTI account. Tedious. CCS download is about 1.5GB. Once downloaded
215 extract the content of the ``tar.gz`` archiver and run ``css_setup_<version>.bin`` script as
216 __root__. Installation must done as root in order to install driver set.
217
218 After installation the application can be executed with:
219
220 {{{ bash
221 cd <ccs>/ccsv5/eclipse/
222 ./ccstudio
223 }}}
224
225 If the application fails to start on 64bits systems is because CCS5 is a 32bits application a thus
226 requires 32bits libraries:
227
228 {{{ bash
229 sudo apt-get install libgtk2.0-0:i386 libxtst6:i386
230 }}}
231
232 If the application crashes with a segmentation fault edit file:
233
234 {{{ bash
235 nano <ccs>/ccsv5/eclipse/plugins/com.ti.ccstudio.branding_<version>/plugin_customization.ini
236 }}}
237
238 And change key ``org.eclipse.ui/showIntro`` to false.
239
240 Choose ``FREE License - for use with XDS100 JTAG Emulators" on the licensing options. Code download
241 for the board is uses that particular hardware. See [Development wiring #development_wiring] for
242 more details on this hardware.
243
244 CCS include Texas Instruments Code Generation Tools (CGT) (compiler, linker, etc). Simulink code
245 generation requires the CGT to be available in the system, and thus, even if no library development
246 will be done or the IDE is not going to be used CCS is still required. @@
247 See ``<repo>/rpp/rpp/README.txt`` file for more information.
248
249 You can find documentation for CGT compiler in ``<repo>/ref/armcl.pdf`` and for CGT archiver in
250 ``<repo>/ref/armar.pdf``.
251
252
253 === Matlab/Simulink ===[matlabsimulink]
254
255 %DONE
256
257 Matlab/Simulink version used is R2012b for Linux 64 bits. For in-house development the CVUT should
258 provide a network licensing server descriptor file.
259
260 === GtkTerm ===[gtkterm]
261
262 %DONE
263
264 Most of the interaction with the board for development is done through a RS-232 serial connection.
265 The terminal Software used for communication is called GtkTerm.
266
267 The default configuration for the board serial communication module is 9600-8-N-1. Note that the
268 RPP Library test suite is setup to 115200-8-N-1.
269
270 To install GtkTerm execute:
271
272 {{{ bash
273 sudo apt-get install gtkterm
274 }}}
275
276
277
278 === Doxygen ===[doxygen]
279
280 %DONE
281
282 Doxygen is the name of the documentation generator used to generate the RPP API documentation based
283 on the source code files. The generated API include dependency graphs and thus it also requires
284 Graphviz, a graph drawing tool. To install both execute:
285
286 {{{ bash
287 sudo apt-get install doxygen graphviz
288 }}}
289
290 See [API generation #api_generation] on how to use Doxygen to generate the API Reference
291 documentation.
292
293 NEWPAGE
294
295 === Nested ===[nested]
296
297 %DONE
298
299 Nested is the documentation editor used to create the document you're reading. It features a plain
300 text version control friendly simple to read non-cluttered format, WYSIWYM paradigm, divide and
301 conquer document creation approach, a nested (non-linear) document tree and content/presentation
302 separation scheme and thus documents can be published to LaTeX, PDF or HTML. Nested is a tool
303 created by the author of this report.
304
305 To install Nested first install dependencies:
306
307 {{{ bash
308 sudo apt-get install python2.7 python-gtk2 python-webkit python-gtkspellcheck texlive-publishers texlive texlive-latex-extra rubber iso-codes subversion
309 }}}
310
311 Then get the latest revision from the stable repository:
312
313 {{{ bash
314 svn checkout svn://svn.code.sf.net/p/nestededitor/code/trunk nested
315 }}}
316
317 Run Nested with:
318
319 {{{ bash
320 cd nested/nested/
321 ./nested
322 }}}
323
324 Nested sources for this document can be found on the repository under
325 ``<repo>/doc/reports/report/``.
326
327
328 === LMC1 ===[lmc1]
329
330 %DONE
331
332 The LMC1 is a simple script developed for this project written in Python 3 using Gtk+ 3.0 Python
333 dynamic bindings PyGObject. This script, based on Michal Horn's command line script, allows to set
334 or clear the outputs of the test board.
335
336 This script includes both a GUI and command line tool. If no parameters are given to the script the
337 GUI version is launched:
338
339 %tex% ''' \begin{figure}[H]\begin{center}
340 [350-lmc1.png]
341 %tex% ''' \caption{LMC1 GUI application.}\end{center}\end{figure}
342
343 To run the LMC1 application first install dependencies:
344
345 {{{ bash
346 apt-get install python3 python3-gi python3-serial
347 }}}
348
349 To launch LMC1 GUI version double click file:
350
351 ``<repo>/rpp/lib/apps/lmc1/lmc1.py``
352
353 To launch LMC1 command line version type:
354
355 ``<repo>/rpp/lib/apps/lmc1/lmc1.py --help``
356
357
358 NEWPAGE
359
360 == Hardware reference ==[hardware_reference]
361
362 %DONE 
363
364 This section provides reference documentation for the RPP board:
365
366 - Connectors pinout.
367 - Modules capabilities and features.
368 - Wiring configuration for development and testing.
369
370
371 Please note that although this is a hardware reference documentation this is from a Software
372 development perspective and __**NOT**__ Hardware development perspective. For full hardware details
373 please refer to schematics and related documentation.
374
375 %tex% ''' \begin{figure}[H]\begin{center}
376 [300-board.png]
377 %tex% ''' \caption{The RPP board (signal connector missing).}\end{center}\end{figure}
378
379 === Connectors pinout ===[connectors_pinout]
380
381 %DONE
382
383 %tex% ''' \begin{figure}[H]\advance\leftskip-1cm
384 [530-pinout.pdf.png]
385 %tex% ''' \caption{The RPP connectors pinout.}\end{figure}
386
387
388 === Modules description ===[modules_description]
389
390 %DONE
391
392 This section enumerates the capabilities of the hardware modules from Software perspective.
393
394 ==== Logic IO ====[logic_io]
395
396 %DONE
397
398 ===== Digital Inputs (DIN) =====[digital_inputs_din]
399
400 %DONE
401
402 - 16 pins available on Signal Connector.
403 - Pins 9-16 status can be read via GPIO using configurable threshold. @@
404   Pins 9-12 use variable threshold B and pins 13-16 use variable threshold A.
405 - Variable threshold is a DAC chip MCP4922.
406 - All pins are read at once via SPI (fixed threshold) using chip MC33972.
407 - 1-8 are programmable pins and ca be set to pull-up or pull-down. 9-16 are pull-down only.
408 - All pins can be set to be active or tri-stated.
409 - All pins can be set to trigger interrupt.
410 - On-line diagnostic of broken wire.
411
412
413 ===== Digital Outputs (LOUT) =====[digital_outputs_lout]
414
415 %DONE
416
417 - 8 pins available on Signal Connector.
418 - Pins for logic output only, up to 100mA.
419 - All pins are set at once using a chip through SPI.
420
421
422 ===== Analog Input (AIN) =====[analog_input_ain]
423
424 %DONE
425
426 - 12 channels available.
427 - Differential inputs, thus 24 pins available on Signal Connector.
428 - Range for 0-20 volts.
429 - 12 bits resolution.
430 - Using CPU ADC.
431
432 ===== Analog Output (AOUT) =====[analog_output_aout]
433
434 %DONE
435
436 - 4 pins available on Signal Connector.
437 - Output range is 0-12 volts.
438 - Using 2 x MCP4922 DACs controlled using SPI.
439 - Resolution is 12 bits. But because of amplification and voltage reference not all range is used.
440
441
442 ==== Power Output ====[power_output]
443
444 %DONE
445
446 ===== H-Bridge (HBR) =====[h_bridge_hbr]
447
448 %DONE
449
450 - 1 port (2 pins) available on Power Connector.
451 - Communication is done through SPI.
452 - H-Bridge can be enabled or disabled.
453 - Current direction can be set.
454 - PWM control with 1% resolution change of the duty cycle.
455 - Port can drive load up to 10A.
456
457 ===== Power Output (MOUT) =====[power_output_mout]
458
459 %DONE
460
461 - 6 pins available on Power Connector.
462 - Pins can drive a load up to 2A. Push/Pull.
463 - Pins are set using 6 CPU output GPIOs. Diagnostic are read using 6 externally pulled-up
464   open-drain input GPIOs.
465 - On-line diagnostics. Driver chip will pull-down the corresponding diagnostic pin on the CPU.
466
467
468 ===== High-Power Output (HOUT) =====[high_power_output_hout]
469
470 %DONE
471
472 - 6 pins available on Power Connector.
473 - Pins can be set ON/OFF.
474 - Pins can drive a load up to 10A with PWM.
475 - System can read analog values of current flowing (IFBK).
476 - System can read diagnostics values (DIAG). Detection of a fault condition.
477
478
479 ==== Communication ====[communication]
480
481 %DONE
482
483 ===== CAN bus (CAN) =====[can_bus_can]
484
485 %DONE
486
487 - 3 ports available (CAN uses differential signaling) thus 6 pins are available on Communication
488   connector.
489 - High speed.
490 - Recover from error.
491 - Detection of network errors.
492
493
494 ===== Local Interconnect Network (LIN) =====[local_interconnect_network_lin]
495
496 %DONE
497
498 - 2 ports/pins available on Communication Connector.
499 - Only first port can be used when using the SCI. Second port us shared with SCI.
500
501
502 ===== FlexRay (FR) =====[flexray_fr]
503
504 %DONE
505
506 - 2 ports available. FlexRay uses differential signaling thus 4 pins are available on
507   Communication Connector.
508
509
510
511 ===== Serial Comm. Interface (SCI) =====[serial_comm_interface_sci]
512
513 %DONE
514
515 - 1 port available inside the box on SCI connector (4 pins).
516 - Variable baud rate. Tested on 9600 and 115200.
517 - RS232 standard compatible.
518
519 ===== Ethernet (ETH) =====[ethernet_eth]
520
521 %DONE
522
523 - 1 port available. Standard Ethernet connector available inside box.
524
525
526 NEWPAGE
527
528 ==== Data storage/logging ====[data_storagelogging]
529
530 %DONE
531
532 ===== External Memory SD-RAM (SDR) =====[external_memory_sd_ram_sdr]
533
534 %DONE 
535
536 - 64MB (currently installed) external RAM used for logging. Maximal supported capacity is 256MB.
537 - Memory test routine available with test Software.
538
539
540 ===== SD Card (SDC) =====[sd_card_sdc]
541
542 %DONE
543
544 - Standard SD-Card connector or microSD connector available inside box.
545 - Communication done using SPI.
546
547
548 NEWPAGE
549
550 === Development wiring ===[development_wiring]
551
552 %DONE
553
554 For development, the RPP board needs to be wired as follow:
555
556 - **Power input**: supply around 13 volts on any PWR pin (Power and Communication connectors) and 
557   connect GND to power supply's GND. See [Connectors pinout #connectors_pinout].
558 - **Serial communication**: board serial interface connected to a RS-232 port on the host computer 
559   (``/dev/ttySX``) or to a USB converter (``/dev/ttyUSBX``).
560 **- Debug and code download**: XDS100v2 JTAG Emulator connected to RPP board JTAG connector, 
561   which in turn is connected through USB to the host computer (``/dev/ttyUSBX``). 
562   See below on details for configuring the XDS100v2 on Linux.
563
564
565 Image of the wiring:
566
567 %tex% ''' \begin{figure}[H]\begin{center}
568 [300-dev_wiring.png]
569 %tex% ''' \caption{RPP Wiring for Development.}\end{center}\end{figure}
570
571
572 Setup XDS100v2 on Linux:
573
574 By default the device (if nothing more connected then ``/dev/ttyUSB0``) is added with permissions 
575 ``664`` and ``root`` as user and group. To access the device write access for current user is 
576 required. To do so create a new udev rule file:
577
578 {{{ bash
579 sudo nano /etc/udev/rules.d/45-pes-rpp.rules
580 }}}
581
582 NEWPAGE
583 And add line:
584
585 {{{ plain
586 SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="a6d0", MODE="0660", GROUP="plugdev"
587 }}}
588
589 Then reload udev rules with:
590
591 {{{ bash
592 sudo udevadm control --reload-rules
593 }}}
594
595
596 To check device properties like ``idVendor`` or ``idProduct`` issue the following command:
597
598 {{{ bash
599 udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
600 }}}
601
602
603 === Test wiring ===[test_wiring]
604
605 %DONE
606
607 Wiring for test differ from testing objectives. It test performed for this project no communication
608 test, besides SCI, was performed. The following describes how to wire each of the modules tested:
609
610 - **DIN**: @@
611   Connect all DIN pins to one LMC1 board outputs.
612 - **LOUT**: @@
613   Connect all LOUT pins to one LMC1 board inputs.
614 - **AIN**: @@
615   Connect all low pins to GND and leave all high pins floating. Allow to hook a potentiometer
616   to each pin.
617 - **AOUT**: @@
618   Connect all 4 pins to different channels on a oscilloscope.
619 - **HBR**: @@
620   Connect a motor to the H-bridge pins.
621 - **MOUT**: @@
622   Connect all 6 pins to a LMC1 board inputs. Another option is to connect a motor to one of the 
623   outputs.
624 - **SCI**: @@
625   Connect the SCI to a host computer. See [Development wiring #development_wiring].
626 - **SDR**: @@
627   No particular wiring is required for testing the SD-RAM.
628
629
630 It is recommended to setup a power bus using regulated 12volts from Signal Connector. Power the 
631 LMC1 boards and the potentiometer with this bus. The LCM1 controller board should be connected
632 to the host computer through a RS-232 port or a USB converter.
633
634 NEWPAGE
635
636 %tex% ''' \begin{figure}[H]\advance\leftskip-1cm
637 [530-test_wiring.png]
638 %tex% ''' \caption{RPP Wiring for Testing.}\end{figure}
639
640 NEWPAGE
641
642 == Project repository ==[project_repository]
643
644 %DONE
645
646 This git repository holds all the work done on this project.
647
648 To get the repository:
649
650         ``git clone ssh://git@rtime.felk.cvut.cz/jenkicar/rpp-simulink.git``
651
652 This is a private repository, you require your SSH private key to be authorized. For access please
653 consult the Real-Time Systems Group, Department of Control Engineering, Faculty of Electrical
654 Engineering, Czech Technical University in Prague. For details about this git server refer to:
655
656         http://rtime.felk.cvut.cz/hw/index.php/Git_repository_on_this_server
657
658 The general layout of the repository is:
659
660 ```
661         .
662         |__ doc         - Documentation created for this project.
663         |__ refs        - Official reference documentation.
664         \__ rpp
665             |__ blocks  - Simulink Block Set.
666             |__ demos   - Simulink Demos Library.
667             |__ lib     - C support Library and API.
668             \__ rpp     - Simulink Coder Target.
669 ```
670
671 A detailed description of the content of each subfolder under ``rpp/`` can be found in the section
672 //Subdirectory content description// on each dedicated section for the products developed.
673
674 In this document, the root folder on this repository is used as reference for file location and is
675 referred with the token ``<repo>``.
676
677
678 %S == Programming standards ==[programming_standards]
679
680
681
682 %S === TLC files ===[tlc_files]
683
684
685
686 %S === RPP API ===[rpp_api]
687
688
689
690 %S === S-Functions ===[s_functions]
691
692 NEWPAGE
693
694 = C Support Library =[c_support_library]
695
696 %DONE
697
698 The RPP C Support Library define the API to communicate with the board. It include drivers and
699 operating system. This section documents the implementation of this library.
700
701 == Description ==[description]
702
703 %DONE
704
705 The RPP Library is the support library used by Simulink models. It is designed from the board user
706 perspective and exposes a simplified high-level API to handle the board's peripheral modules in a
707 safe manner.
708
709 The library as a concept and as a functional unit was introduced by this project. At the beginning
710 of this project the RPP board had just one application developed for. This application intended for
711 board testing allows the user to issue low-level commands to control and test the peripherals of
712 the board. This application was created using a combination of custom code, contributed drivers and
713 generated code from TI tool HalCoGen. Library functionality, like drivers and hardware access, and
714 application logic, like command processor and test routines, was largely merged in a single layer,
715 166 source code files long highly coupled application. In order to develop independent applications
716 for the RPP board, as it was expected to be each Simulink model, the library logic needed to be
717 separated from the application logic. This work implied a heavy refactoring on the testing
718 application in order extract from it the library functionality. Because the application files were
719 highly coupled in a single layer the refactoring and testing of the library implied roughly 70% of
720 the work done on this project.
721
722 %tex% ''' \begin{figure}[H]\advance\leftskip-1cm
723 [500-adc_dep_before.png]
724 %tex% ''' \caption{Dependency graph of the ADC driver before refactoring.}\end{figure}
725
726 The above graph shows the dependencies of the ADC driver before the refactoring. Please note the
727 dependency on ``cmdproc_io_tisci.h`` and ``cmdproc.h``, both application level modules. Also, note
728 the indirect dependency on the Operating System is being resolved through the application modules.
729
730 %tex% ''' \begin{figure}[H]\begin{center}
731 [150-adc_dep_after.png]
732 %tex% ''' \caption{Dependency graph of the ADC driver after refactoring.}\end{center}\end{figure}
733
734 The above graph shows the current dependencies for the ADC driver in the RPP Library. Please note
735 that it dependents only on the system layer low-level driver and that the Operating System indirect
736 dependency is resolved through the library foundations ``base.h``.
737
738 Some other relevant changes introduced with the refactoring are:
739
740 - ADC driver was completely rewritten.
741 - MOUT driver was implemented.
742 - DIN driver was slightly modified and extended.
743 - DAC driver was slightly modified.
744 - HBR driver was largely modified (in particular watchdog functionality).
745 - SCI driver was refactored and extended.
746 - SDR driver was implemented.
747
748
749 Also, once the library functionality could be isolated, the resulting API was too low-level to be
750 used by applications, in consequence one of the contributions of this projects was the
751 implementation of a high-level API on top of this low level API: the RPP Layer.
752
753
754 NEWPAGE
755
756 === Architecture ===[architecture]
757
758 %DONE
759
760 The RPP library was structured into 5 layers with the following guidelines:
761
762 - Top-down dependency only. No lower layer depends on anything from upper layers.
763 - 1-1 layer dependency only. The top layer depends exclusively on the bottom layer, not on any
764   lower level layer (except for a couple of exceptions).
765 - Each layer should provide a unified layer interface (``rpp.h``, ``drv.h``, ``hal.h``, ``sys.h``
766   and ``os.h``), so top layers depends on that layer interface and not on individual elements from
767   that layer.
768
769
770 %tex% ''' \begin{figure}[H]\begin{center}
771 [250-layers.pdf.png]
772 %tex% ''' \caption{The RPP library layers.}\end{center}\end{figure}
773
774
775 As a consequence of this division the source code files and interface files are now placed on
776 private directories so the previous prefix based inclusion ``drv_din.h`` is replaced by
777 ``drv/din.h``. With this organization user applications only needs to include the top layer
778 interface file (``rpp/rpp.h``) to be able to use the library API.
779
780 Please note the sublayer uLut, which is used only by the SPI driver in order to use thread safe
781 queue mechanisms. Because the FreeRTOS already provides thread safe queues and in order to match
782 the order parts of the system it would be advisable to drop this dependency in the future.
783
784 NEWPAGE
785
786 === RPP Layer Modules ===[rpp_layer_modules]
787
788 %DONE
789
790 The RPP Layer was structured into 14 different modules from 4 different categories that match the
791 hardware modules on the board:
792
793 || Category      | Description                        | MNEMONIC
794  | Logic IO      | Digital Input                      | ``[DIN ]``   |
795  |               | Digital (Logic) Output             | ``[LOUT]``   |
796  |               | Analog Input                       | ``[AIN ]``   |
797  |               | Analog Output                      | ``[AOUT]``   |
798  | Power output  | H-Bridge output                    | ``[HBR ]``   |
799  |               | Power output (12V, 2A)             | ``[MOUT]``   |
800  |               | High-Power output (12V, 10A)       | ``[HOUT]``   |
801  | Communication | CAN Bus                            | ``[CAN ]``   |
802  |               | LIN (Local Interconnect Network)   | ``[LIN ]``   |
803  |               | FlexRay                            | ``[FR  ]``   |
804  |               | Serial Communication Interface     | ``[SCI ]``   |
805  |               | Ethernet                           | ``[ETH ]``   |
806  | Logging       | SD Card                            | ``[SDC ]``   |
807  |               | SD-RAM                             | ``[SDR ]``   |
808
809
810 Please note the mnemonic of each module, as they are constantly used on the Software and
811 documentation. Also note that only the following modules where implemented as part of this project:
812
813 %tex% ''' \begin{multicols}{2}
814 - DIN.
815 - LOUT.
816 - AIN.
817 - AOUT.
818 - HBR.
819 - MOUT.
820 - SCI.
821 - SDR.
822
823
824 %tex% ''' \end{multicols}
825
826 Modules for which there is a low-level API available on the library but no high-level module was
827 implemented:
828
829 %tex% ''' \begin{multicols}{2}
830 - CAN.
831 - LIN.
832 - FR.
833
834
835 %tex% ''' \end{multicols}
836
837 Modules that are not yet available on the library at all:
838
839 %tex% ''' \begin{multicols}{2}
840 - ETH (in the works).
841 - SDC.
842 - HOUT (partial).
843
844
845 %tex% ''' \end{multicols}
846
847 The following graphic shows the library modules and the connectors on the hardware they map to.
848
849 %tex% ''' \begin{figure}[H]\advance\leftskip-1cm
850 [500-blocks.pdf.png]
851 %tex% ''' \caption{The RPP Library modules.}\end{figure}
852
853 NEWPAGE
854
855 === OS interchangeable layer ===[os_interchangeable_layer]
856
857 %DONE
858
859 The OS Layer is composed by the FreeRTOS source code files. Because the FreeRTOS exposes an stable
860 API the OS layer can be changed in order to upgrade the Operating System or use a different port of
861 the OS, without changing the upper layers source code. The OS Layers currently available for the
862 RPP Library at ``<repo>/rpp/lib/os/`` at the time of this writing are:
863
864 - Version 6.0.4 using POSIX port. This layer is the one that should be used when compiling a
865   program for x86(_64) simulation. The port uses the ``pthread`` library and because of this the
866   port is not true real time and this is considered a simulator.
867 - Version 7.0.2 using HalCoGen port for TMS570. This layer is the one currently supported and
868   tested. It was originally included in the testing application and was generated by an older
869   version of TI code generation tool HalCoGen.
870 - Version 7.4.0 using HalCoGen port for TMS570. This layer was extracted from a newly generated
871   project using a newer version of HalCoGen. This layer is untested but //should// work out of the
872   box.
873 - Version 7.4.2 using ARM Cortex R4 official port for CCS. This layer was created from vanilla
874   FreeRTOS 7.4.2 release. It is tested but non-working. Ticks are proved to be executed in time but
875   applications using this kernel runs at full-speed. The reason if this is currently unknown.
876
877
878 The general layout of all the layers are as following:
879
880 - Common source code (kernel):
881
882 ```
883     src/os/croutine.c (Optional)
884     src/os/list.c
885     src/os/queue.c
886     src/os/tasks.c
887     src/os/timers.c (Optional)
888 ```
889
890 Originally found in vanilla distribution in: ``<FreeRTOSRoot>/FreeRTOS/Source``
891
892 - Common interface files:
893
894 ```
895     include/os/croutine.h
896     include/os/FreeRTOS.h
897     include/os/list.h
898     include/os/mpu_wrappers.h
899     include/os/portable.h (with minor editions)
900     include/os/projdefs.h
901     include/os/queue.h
902     include/os/semphr.h
903     include/os/StackMacros.h
904     include/os/task.h
905     include/os/timers.h
906 ```
907
908 Originally found in vanilla distribution in: ``<FreeRTOSRoot>/FreeRTOS/Source/include``
909
910 - Memory management file:
911
912 ```
913     src/os/heap.c (One of 4 version available, see Appendix A).
914 ```
915
916 Originally found in vanilla distribution in: ``<FreeRTOSRoot>/FreeRTOS/Source/portable/MemMang``
917
918 - Port specific files:
919
920 ```
921     src/os/port.c
922     src/os/portASM.asm
923     include/os/portmacro.h
924     include/os/FreeRTOSConfig.h
925 ```
926
927 This depend of the port. In the case of the 7.4.2 TMS570 / ARM Cortex R4 for CCS port:
928
929  - First three files can be found in vanilla distribution in @@
930    ``<FreeRTOSRoot>/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4``.
931  - Last file in ``<FreeRTOSRoot>/FreeRTOS/Demo/CORTEX_R4_RM48_TMS570_CCS5``.
932
933
934 In general, the following changes were applied to the source code base of all kernels:
935
936 - Replaced include directives to adapt to RPP library standard:
937
938 ``#include "`` with ``#include "os/``
939
940 - Line ending character set to UNIX '\n' and tabs replaced by 4 spaces.
941
942
943 NEWPAGE
944
945 === API development guidelines ===[api_development_guidelines]
946
947 %DONE
948
949 %tex% ''' \vspace{-0.40cm}
950
951 The following are the development guidelines use for developing the RPP API:
952
953 - User documentation should be placed in header files, not in source code, and should be Doxygen
954   formatted using autobrief. Documentation for each function present is mandatory.
955 - Function declarations on the headers files is for public functions only. Do not declare
956   local/static/private functions on the header.
957 - Documentation on source code files should be non-doxygen formatted and intended for developers,
958   not users. Documentation here is optional and at the discretion of the developer.
959 - Always use standard data types for IO when possible. Use custom structs as very last resort.
960 - Use prefix based functions names to avoid clash. The prefix is of the form ``[layer]_[module]_``,
961   for example ``rpp_din_update()`` for the update function of the DIN module in the RPP Layer.
962 - To be very careful about symbol export. Because it is used as a static library the modules should
963   not export any symbol that is not intended to be used (function) or ``extern``'ed (variable) from
964   application. As a rule of thumb declare all global variables as static.
965 - Only the RPP Layer symbols are available to user applications. All information related to lower
966   layers is hidden for the application. This is accomplished by conditionally including the layers
967   elements on the implementations files only and never on the interface files. Never expose any
968   other layer to the application or the the whole system below that layer will be exposed. In other
969   words, never ``#include "foo/foo.h"`` in any RPP Layer interface file.
970 - Any module is conditionally included by using ``rppCONFIG_INCLUDE_{MNEMONIC}`` directive on the
971   ``RppConfig.h`` configuration file.
972
973
974 %tex% ''' \vspace{-0.40cm}
975
976 === Further improvements ===[further_improvements]
977
978 %DONE
979
980 %tex% ''' \vspace{-0.40cm}
981
982 The following are recommendations for future improvements of the library:
983
984 - General code revision to remove local-only methods and variables from being exported.
985 - General code revision and refactoring to normalize the functions naming scheme. Normalize DRV and
986   HAL to use prefix based scheme, not all the functions and exported variables do. Refactor the SYS
987   layer, most of it generated by HalCoGen and that uses ``thisNamingScheme`` to use library
988   standards (see [RPP API #rpp_api] programming standards).
989 - Simplify doxygen documentation on the SYS layer, because is clunky, doesn't add any value and is
990   repetitive. Move it the header files.
991 - Remove error throwing from wrong parameter input in the DRV layer and assume a
992   //correct parameter and continue// safe approach. Move all error throwing and validation to the
993   RPP layer (already implemented).
994
995
996 %tex% ''' \vspace{-0.40cm}
997 Recommendations for changes on the electrical diagrams:
998
999 - Change name of GPIO MOUT1_EN to MOUT1_DIAG.
1000 - Change name of GPIO MOUT1_IN to MOUT1_EN.
1001
1002
1003 The current names are misleading.
1004
1005 == Subdirectory  content description ==[subdirectory__content_description]
1006
1007 %DONE
1008
1009 -> ``librpp.a`` and ``rpp-lib.lib``
1010
1011 Version controlled RPP static libraries.
1012
1013 The first one is for POSIX simulation, the second one for Simulink models and other ARM/TMS570
1014 applications. This files are placed here by the projects ``apps/rpp-lib_posix`` and
1015 ``apps/rpp-lib`` when built.
1016
1017
1018 -> ``apps/``
1019
1020 Applications related to the RPP library.
1021
1022 This include the CCS studio project for generation of the static library and the test suite. See
1023 [Static libraries #static_libraries], [Test Suite #test_suite] and
1024 [Base application #base_application] for more information.
1025
1026
1027 -> ``os/``
1028
1029 OS layers directory.
1030
1031 See [OS interchangeable layer #os_interchangeable_layer] for more information.
1032
1033
1034 -> ``rpp/``
1035
1036 Main directory for the RPP Library.
1037
1038
1039 -> ``rpp/doc/``
1040
1041 Documentation directory for the RPP Library. See [API generation #api_generation] for more
1042 information.
1043
1044
1045 -> ``rpp/TMS570LS3137.ccxml``
1046
1047 Descriptor for code download.
1048
1049 This file is used by all the projects including the Simulink RPP Target for code download. It is
1050 configured to use the Texas Instruments XDS100v2 USB Emulator. See
1051 [Development wiring #development_wiring] for information about this hardware.
1052
1053
1054 -> ``rpp/TMS570LS313xFlashLnk.cmd``
1055
1056 CGT Linker command file.
1057
1058 This file is used by all applications linking for the board, including the Simulink models, static
1059 library and test suite. It includes instructions for the CGT Linker on where to place sections
1060 and size of some sections.
1061
1062
1063 -> ``rpp/include/{layer}`` and ``rpp/src/{layer}``
1064
1065 Interface files and implementations files for given ``{layer}``. See below for details on the RPP 
1066 Layer.
1067
1068
1069 -> ``rpp/include/rpp/rpp.h``
1070
1071 Main library header file.
1072
1073 To use this library just include this file and this file only. Also, before using any library
1074 function please call ``rpp_init()`` function for hardware initialization.
1075
1076
1077 -> ``rpp/include/rpp/RppConfig.h``
1078
1079 Library configuration file.
1080
1081 Please refer to the API documentation and header file comments for specific documentation for each
1082 configuration parameter.
1083
1084
1085 -> ``rpp/include/rpp/rpp_{mnemonic}.h``
1086
1087 Header file for ``{mnemonic}`` module.
1088
1089 This files includes function definitions, pin definitions, etc, specific to {mnemonic} module. The
1090 inclusion of this header can be configured in ``RppConfig.h`` using
1091 ``rppCONFIG_INCLUDE_{MNEMONIC}`` directive. See
1092 [API development guidelines #api_development_guidelines].
1093
1094
1095 -> ``rpp/src/rpp/rpp_{mnemonic}.c``
1096
1097 Module implementation.
1098
1099 Implementation of ``rpp_{mnemonic}.h``'s functions on top of the DRV library. See
1100 [API development guidelines #api_development_guidelines].
1101
1102
1103 -> ``rpp/src/rpp/rpp.c``
1104
1105 Implementation of library-wide functions.
1106
1107
1108 NEWPAGE
1109
1110
1111 == Test Suite ==[test_suite]
1112
1113 %DONE
1114
1115 The ``rpp-test-suite`` is a RPP application developed as part of this project that includes a
1116 series of test tasks or test commands to verify the correct behavior and functionality of the RPP
1117 layer modules. There is one command per module, and the command use the same mnemonic that the
1118 module.
1119
1120 This test suite can be found in ``<repo>/rpp/lib/apps/rpp-test-suite`` for the ARM version and in
1121 ``<repo>/rpp/lib/apps/rpp-test-suite_posix`` for the simulated version.
1122
1123 The application enables a command processor using the SCI at **115200-8-N-1**:
1124
1125 ```
1126 RPP Library Test Suite.
1127 ===========================================================
1128 [Type a module to test or 'help']
1129 --> help
1130 Available commands:
1131         help - Display this help.
1132         ain  - Test Analog Input.
1133         aout - Test Analog Output.
1134         can  - Test CAN communication.
1135         din  - Test Digital Inputs.
1136         eth  - Test Ethernet communication.
1137         fr   - Test FlexRay communication.
1138         hbr  - Test H-Bridge.
1139         hout - Test High Power Output.
1140         lin  - Test LIN communication.
1141         lout - Test Digital Outputs.
1142         mout - Test Power Outputs.
1143         sci  - Test Serial Communication Interface.
1144         sdc  - Test SD-Card.
1145         sdr  - Test SD-RAM.
1146 ```
1147
1148 Current modules with tests implemented are:
1149
1150 %tex% ''' \begin{multicols}{2}
1151 - AIN.
1152 - AOUT.
1153 - DIN.
1154 - HBR.
1155 - LOUT.
1156 - MOUT.
1157 - SCI. (the test-suite itself)
1158 - SDR.
1159
1160
1161 %tex% ''' \end{multicols}
1162
1163 A note of warning: tests spawn OS tasks at the beginning of the test and deletes them at the end.
1164 Because current memory memory management implementation cannot free memory the test suite will
1165 fill all the memory and tests will be unable to start. In this case just reset the board. See
1166 [Appendix A: Notes on FreeRTOS memory management #appendix_a_notes_on_freertos_memory_management]
1167 for more information.
1168
1169 NEWPAGE
1170
1171 === AIN test description ===[ain_test_description]
1172
1173 %DONE
1174
1175 This test will read all the analog inputs at a rate of 100 times per second and print the result.
1176
1177 ```
1178 --> ain
1179 Analog Inputs Test [1-12]:
1180 ===========================================================
1181    1    2    3    4    5    6    7    8    9   10   11   12
1182    0    0    0    0    0    0    0    0    0    0    0    0
1183 ```
1184
1185 Status: **PASSED** for channels 1-5. 6-12 remain untested but they //should// work.
1186
1187 === AOUT test description ===[aout_test_description]
1188
1189 %DONE
1190
1191 This test will generate a 10Hz sinus wave on all the analog outputs with a sampling rate of 1kHz.
1192 The sinus wave of each analog output channel is sifted by (1/4)pi.
1193
1194 ```
1195 --> aout
1196 Analog Output Test at 10 Hz:
1197 ===========================================================
1198 Samples: 7331
1199 ```
1200
1201 Status: **PASSED**.
1202
1203 === DIN test description ===[din_test_description]
1204
1205 %DONE
1206
1207 This test will read all 16 + 8 digital inputs at a rate of 100 times per second, using both low
1208 speed SPI chip and variable threshold high-speed inputs.
1209
1210 ```
1211 --> din
1212 Digital Inputs Test [1-16]:
1213 ===========================================================
1214  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16  A  B  C  D  E  F  G  H
1215  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
1216 ```
1217
1218 Status:
1219  - Low speed fixed threshold [1-16]: **PASSED**.
1220  - High speed variable threshold [A-H]: **PASSED**.
1221
1222 === HBR test description ===[hbr_test_description]
1223
1224 %DONE
1225
1226 This test will generate a sinus wave to control the H-Bridge of one period per 20 seconds (0.05Hz)
1227 at a sampling rate of 20Hz.
1228
1229 ```
1230 --> hbr
1231 H-Bridge Test at 0.05 Hz:
1232 ===========================================================
1233 Samples: 72
1234 ```
1235
1236 Status: **PASSED**.
1237
1238 === LOUT test description ===[lout_test_description]
1239
1240 %DONE
1241
1242 This test will show in the digital outputs the value in binary of a counter, incrementing the
1243 counter once per second. The counter is 8 bits, the same as the outputs, so 255 seconds are
1244 required for an overflow/restart of the counting.
1245
1246 ```
1247 --> lout
1248 Digital Output Test:
1249 ===========================================================
1250 Counter:   40
1251 ```
1252
1253 Status: **PASSED**.
1254
1255 === MOUT test description ===[mout_test_description]
1256
1257 %DONE
1258
1259 This test will toggle the power outputs one by one per second, then wait 10 seconds in that state
1260 while constantly verifying the diagnostics.
1261
1262 ```
1263 --> mout
1264 Power Output Test:
1265 ===========================================================
1266 1     2     3     4     5     6
1267 1: OK 1: OK 1: OK 1: OK 1: OK 1: OK
1268 ```
1269
1270 Status: **PASSED**.
1271
1272 === SCI test description ===[sci_test_description]
1273
1274 %DONE
1275
1276 A more comprehensive test is not implemented. The very use of this test-suite implies the correct
1277 function of the SCI module. Nevertheless, as a future improvement, a test that will verify run-time
1278 baud rate changes and test some other RPP SCI functions is desirable.
1279
1280 ```
1281 --> sci
1282 You're using the SCI, reading this and typing this command.
1283 Press any key to continue...
1284 ```
1285
1286 Status: **PASSED**.
1287
1288 === SDR test description ===[sdr_test_description]
1289
1290 %DONE
1291
1292 This test will launch a noise generator task that will log noise and then start the library
1293 included SD-RAM logging command processor, allowing the user to see and handle the log on the
1294 SD-RAM.
1295
1296 ```
1297 --> sdr
1298 Log control: 1024kB available.
1299 ===========================================================
1300 --> log
1301 [   1239864] This is the noise generator at iteration 1 putting some noise value 279735017.
1302 [   1240779] This is the noise generator at iteration 2 putting some noise value 1943579783.
1303
1304 --> available
1305 1023 kB of 1024 kB available.
1306
1307 --> clear
1308 Done.
1309
1310 --> exit
1311 ```
1312
1313 Status: **PASSED**.
1314
1315 NEWPAGE
1316
1317 == Static libraries ==[static_libraries]
1318
1319 %DONE
1320
1321 The RPP Library can be compiled as a static library for ARM using TI CGT and for x86(_64) using
1322 GCC. CCS projects ``rpp-lib`` and ``rpp-lib_posix`` in ``<repo>/rpp/lib/apps/`` allows to generate
1323 the static libraries. After compilation, as part of the build process, both projects will
1324 automatically update the version-controlled static libraries in ``<repo>/rpp/lib/``:
1325
1326 - ``rpp-lib.lib``, static library for ARM using TI naming scheme.
1327 - ``librpp.a``, static library for x86(_64) using standard Linux naming scheme.
1328
1329
1330 One future improvement would be the creation of a Makefile for each compilation scheme in order to
1331 not depend on CCS managed build system. For ARM manual compilation or makefile creation using Texas
1332 CGT see the ``target_tools.mk`` file under the Simulink RPP Target folder. The relevant aspects for
1333 compiling and linking an application using the static libraries are:
1334
1335 **ARM compilation using CCS for the RPP board:**
1336
1337 - Include headers files of the OS for which the library was compiled against. At the time of this
1338   writing the OS is FreeRTOS 7.0.2. See [OS interchangeable layer #os_interchangeable_layer]
1339   section above.
1340 - Include header files for the RPP library.
1341 - Add library ``rpp-lib.lib`` to the linker libraries. The RPP library **MUST** be looked for
1342   before Texas Instruments support library ``rtsv7R4_T_be_v3D16_eabi.lib``.
1343 - Configure linker to retain ``.intvecs`` section from RPP Library:@@
1344   ``--retain="rpp-lib.lib<sys_intvecs.obj>(.intvecs)"``
1345 - Use the provided linker command file ``TMS570LS313xFlashLnk.cmd``.
1346
1347
1348 **x86(_64) compilation using GCC for Simulation:**
1349
1350 - Include headers files of the OS for Simulation. At the time of this writing the OS is POSIX
1351   FreeRTOS 6.0.4.
1352 - Include header files for the RPP library.
1353 - Create a ``RppConfig.h`` override file and drop DRV layer dependency: ``rppCONFIG_DRV 0``.
1354 - Includes must be configured in a way that the ``RppConfig.h`` taken under consideration is the
1355   override and not the library one.
1356 - Add library ``librpp.a`` to the linker libraries.
1357 - Add ``pthread`` to the linker libraries.
1358
1359
1360 As an important note, all the models compiled using Simulink will link against ``rpp-lib.lib``.
1361 When compiling a Simulink model, Simulink, and then ``make``, will not update the generated binary
1362 if the model hasn't changed, and then if the source code hasn't changed. Static libraries changes
1363 are not considered for re-compilation and re-linking. If library development is being done and
1364 static library is updated, in order for the Simulink model to generate a newly linked version of
1365 the binary the whole code generation folder needs to be deleted in order to force code generation,
1366 compilation and linking with the new static library.
1367
1368
1369 NEWPAGE
1370
1371 == Base application ==[base_application]
1372
1373 %DONE
1374
1375 In ``<repo>/rpp/lib/apps/`` there is two RPP base applications, ``base`` and ``base_posix``, that
1376 already configured for the RPP Library. It is advised that new applications uses this projects a
1377 foundations.
1378
1379 To create a new application copy this directory and rename it. Now open files ``.project``,
1380 ``.cproject`` and ``.ccsproject`` (if available) and change any occurrence of the work ``base``
1381 with the name of your project. Use lower case ASCII letters and underscores only.
1382
1383 **Steps to configure a new CCS (ARM, using CGT) RPP application:**
1384
1385 + Create a new CCS project. @@
1386 [400-base_1.png]
1387 + Create a normal folder ``include``.
1388 + Create a source folder ``src``.
1389 + Add common ``.gitignore`` to the root of that project:
1390 {{{ plain
1391 Debug
1392 Release
1393 .settings/*
1394 }}}
1395 NEWPAGE
1396 + Add new variable ``RPP_LIB_ROOT`` and point to this repository branch root.@@
1397 [400-base_2.png]
1398 + Add ``rpp-lib.lib`` static library to linker libraries and add ``RPP_LIB_ROOT`` to the library
1399   search path.@@
1400 [400-base_3.png]
1401 NEWPAGE
1402 + Configure linker to retain ``.intvecs`` from RPP static library.@@
1403 [350-base_4.png]
1404 + Configure compiler to include local includes, OS includes for TMS570 and RPP includes, in that
1405   order.@@
1406 [350-base_5.png]
1407 NEWPAGE
1408 + Configure compiler to allow GCC extensions.@@
1409 [400-base_6.png]
1410 + Import and link (__do not copy!__) linker file and board upload descriptor.@@
1411 [200-base_7.png]
1412
1413
1414 **Steps to configure a new GCC (x86(_64)) RPP simulated application:**
1415
1416 + Create a new managed C project that uses Linux GCC toolchain.
1417 + Create a source folder ``src``. Link all files from original CCS application to this folder.
1418 + Create a normal folder ``include``. Create a folder ``rpp`` inside of it.
1419 + Add common ``.gitignore`` to the root of that project:
1420 {{{ plain
1421 Debug
1422 Release
1423 .settings/*
1424 }}}
1425 NEWPAGE
1426 + Add new variable ``RPP_LIB_ROOT`` and point to this repository branch root.@@
1427 [400-base_posix_1.png]
1428 + Configure compiler to include local includes, CCS application includes, OS includes for POSIX and
1429   RPP includes, in that order.@@
1430 [400-base_posix_2.png]
1431 NEWPAGE
1432 + Add ``rpp`` and ``pthread``to linker libraries and add ``RPP_LIB_ROOT`` to the library search
1433   path.@@
1434 [400-base_posix_3.png]
1435 + Copy ``RppConfig.h`` from RPP Library to a new folder ``include/rpp`` and configure it drop DRV
1436   layer dependency: ``rppCONFIG_DRV 0``.@@
1437 [200-base_posix_4.png]
1438
1439
1440 **In general any RPP application uses the layout/template:**
1441
1442 + Include RPP library header file.
1443 {{{ cpp
1444 #include "rpp/rpp.h"
1445 }}}
1446
1447 NEWPAGE
1448 + Create one or as many FreeRTOS task function definitions as required. Those tasks should use
1449   functions from this library.
1450 {{{ cpp
1451 void my_task(void* p)
1452 {
1453     static const portTickType freq_ticks = 1000 / portTICK_RATE_MS;
1454     portTickType last_wake_time = xTaskGetTickCount();
1455     while(TRUE) {
1456         /* Wait until next step */
1457         vTaskDelayUntil(&last_wake_time, freq_ticks);
1458         rpp_sci_printf((const char*)"Hello RPP.\r\n");
1459     }
1460 }
1461 }}}
1462
1463 + Create the main function that will:
1464  - Initialize the RPP board.
1465  - Spawn the tasks the application requires. Refer to FreeRTOS API for
1466    details.
1467  - Start the FreeRTOS Scheduler. Refer to FreeRTOS API for details.
1468  - Catch if idle task could not be created.
1469 +
1470 {{{ cpp
1471 void main(void)
1472 {
1473     /* Initialize RPP board */
1474     rpp_init();
1475
1476     /* Spawn tasks */
1477     if(xTaskCreate(my_task, (const signed char*)"my_task",
1478             512, NULL, 0, NULL) != pdPASS) {
1479         #ifdef DEBUG
1480         rpp_sci_printf((const char*)
1481             "ERROR: Cannot spawn control task.\r\n"
1482         );
1483         #endif
1484         while(TRUE) { asm(" nop"); }
1485     }
1486
1487     /* Start the FreeRTOS Scheduler */
1488     vTaskStartScheduler();
1489
1490     /* Catch scheduler start error */
1491     #ifdef DEBUG
1492     rpp_sci_printf((const char*)
1493             "ERROR: Problem allocating memory for idle task.\r\n"
1494         );
1495     #endif
1496     while(TRUE) { asm(" nop"); }
1497 }
1498 }}}
1499
1500 + Create hook functions for FreeRTOS:
1501  - ``vApplicationMallocFailedHook()`` allows to catch memory allocation errors.
1502  - ``vApplicationStackOverflowHook()`` allows to catch if a task overflows it's
1503    stack.
1504 +
1505 {{{ cpp
1506 #if configUSE_MALLOC_FAILED_HOOK == 1
1507 /**
1508  * FreeRTOS malloc() failed hook.
1509  */
1510 void vApplicationMallocFailedHook(void) {
1511     #ifdef DEBUG
1512     rpp_sci_printf((const char*)
1513             "ERROR: manual memory allocation failed.\r\n"
1514         );
1515     #endif
1516 }
1517 #endif
1518
1519
1520 #if configCHECK_FOR_STACK_OVERFLOW > 0
1521 /**
1522  * FreeRTOS stack overflow hook.
1523  */
1524 void vApplicationStackOverflowHook(xTaskHandle xTask,
1525                                    signed portCHAR *pcTaskName) {
1526     #ifdef DEBUG
1527     rpp_sci_printf((const char*)
1528             "ERROR: Stack overflow : \"%s\".\r\n", pcTaskName
1529         );
1530     #endif
1531 }
1532 #endif
1533 }}}
1534
1535 NEWPAGE
1536
1537
1538 == API generation ==[api_generation]
1539
1540 %DONE
1541
1542 The RPP Layer is formatted using Doxygen documentation generator. This allows to generate a high
1543 quality API reference. To generate the API reference do in a terminal:
1544
1545 {{{ bash
1546 cd <repo>/rpp/lib/rpp/doc/api
1547 doxygen doxygen.conf
1548 xdg-open html/index.html
1549 }}}
1550
1551 The files under ``<repo>/rpp/lib/rpp/doc/api/content`` are used for the API reference generation
1552 are their name is self-explanatory:
1553
1554 ```
1555 blocks_map.html
1556 blocks.png
1557 cvut.png
1558 footer.html
1559 main_page.dox
1560 ```
1561
1562 To install Doxygen see [Development environment #development_environment] section.
1563
1564 == API Reference ==[api_reference]
1565
1566 %DONE
1567
1568 For the complete API reference please generate the HTML version using the above section
1569 instructions. Here is listed the index of functions of each module and their brief.
1570
1571 Please note that not all modules were implemented as part of this project. See
1572 [RPP Layer Modules #rpp_layer_modules] for a list of the modules implemented.
1573
1574 NEWPAGE
1575
1576 === DIN API Reference ===[din_api_reference]
1577
1578 %DONE
1579
1580 ``int8_t rpp_din_init();`` @@ -> DIN module initialization. @@ @@
1581 ``int8_t rpp_din_ref(uint16_t refA, uint16_t refB);`` @@ -> Configure voltage reference levels for digital inputs using variable reference threshold. @@ @@
1582 ``int8_t rpp_din_setup(uint8_t pin, boolean_t pull_type, boolean_t active, boolean_t can_wake);`` @@ -> Configure given pin. @@ @@
1583 ``int8_t rpp_din_get(uint8_t pin, boolean_t var_thr);`` @@ -> Get the current cached value of the given pin. @@ @@
1584 ``int8_t rpp_din_diag(uint8_t pin);`` @@ -> Get the diagnostic cached value for given pin. @@ @@
1585 ``int8_t rpp_din_update();`` @@ -> Read and update cached values and diagnostic values of all pins. Also commit configuration changes.
1586
1587 === LOUT API Reference ===[lout_api_reference]
1588
1589 %DONE
1590
1591 ``int8_t rpp_lout_init();`` @@ -> LOUT module initialization. @@ @@
1592 ``int8_t rpp_lout_set(uint8_t pin, uint8_t val);`` @@ -> Set the output cache of given pin to given value. @@ @@
1593 ``int8_t rpp_lout_diag(uint8_t pin);`` @@ -> Get the diagnostic cached value for given pin. @@ @@
1594 ``int8_t rpp_lout_update();`` @@ -> Flush cached output values and read back diagnostic values of all pins.
1595
1596 === AIN API Reference ===[ain_api_reference]
1597
1598 %DONE
1599
1600 ``int8_t rpp_ain_init();`` @@ -> AIN module initialization. @@ @@
1601 ``int16_t rpp_ain_get(uint8_t pin);`` @@ -> Get the current analog value on the given pin. @@ @@
1602 ``int8_t rpp_ain_update();`` @@ -> Read and update analog cached values.
1603
1604
1605 === AOUT API Reference ===[aout_api_reference]
1606
1607 %DONE
1608
1609 ``#define RPP_DAC_OA   5.6`` @@ -> DAC output operational amplifier multiplication constant. @@ @@
1610 ``#define RPP_DAC_VREF 2.5`` @@ -> DAC hardware reference voltage. @@ @@
1611 ``int8_t rpp_aout_init();`` @@ -> AOUT module initialization. @@ @@
1612 ``int8_t rpp_aout_setup(uint8_t pin, boolean_t enabled);`` @@ -> Configure enabled/disabled state for given pin. @@ @@
1613 ``int8_t rpp_aout_set(uint8_t pin, uint16_t val);`` @@ -> Set the output cache of given pin to given value. @@ @@
1614 ``int8_t rpp_aout_set_voltage(uint8_t pin, uint16_t mv);`` @@ -> Set output to given voltage. @@ @@
1615 ``int8_t rpp_aout_update();`` @@ -> Flush cached output values and configuration changes.
1616
1617 === HBR API Reference ===[hbr_api_reference]
1618
1619 %DONE
1620
1621 ``int8_t rpp_hbr_init();`` @@ -> HBR module initialization. @@ @@
1622 ``int8_t rpp_hbr_enable(int32_t period);`` @@ -> Enable the H-Bridge for control. @@ @@
1623 ``int8_t rpp_hbr_control(double cmd);`` @@ -> Control the H-Bridge direction, enabled/disabled and PWM. @@ @@
1624 ``int8_t rpp_hbr_disable();`` @@ -> Disable the H-Bridge.
1625
1626 NEWPAGE
1627
1628 === MOUT API Reference ===[mout_api_reference]
1629
1630 %DONE
1631
1632 ``int8_t rpp_hbr_init();`` @@ -> HBR module initialization. @@ @@
1633 ``int8_t rpp_mout_init();`` @@ -> MOUT module initialization. @@ @@
1634 ``int8_t rpp_mout_set(uint8_t pin, uint8_t val);`` @@ -> Set the output of given pin to given value. @@ @@
1635 ``int8_t rpp_mout_get(uint8_t pin);`` @@ -> Get the cached value of the given pin set by rpp_mout_set(). @@ @@
1636 ``int8_t rpp_mout_diag(uint8_t pin);`` @@ -> Reads the value on the given diagnostic pin.
1637
1638 === HOUT API Reference ===[hout_api_reference]
1639
1640 %DONE
1641
1642 ``int8_t rpp_hout_init();`` @@ -> HOUT module initialization.
1643
1644 === CAN API Reference ===[can_api_reference]
1645
1646 %DONE
1647
1648 ``int8_t rpp_can_init();`` @@ -> CAN module initialization.
1649
1650 === LIN API Reference ===[lin_api_reference]
1651
1652 %DONE
1653
1654 ``int8_t rpp_lin_init();`` @@ -> LIN module initialization.
1655
1656 === FR API Reference ===[fr_api_reference]
1657
1658 %DONE
1659
1660 ``int8_t rpp_fr_init();`` @@ -> FR module initialization.
1661
1662 NEWPAGE
1663
1664 === SCI API Reference ===[sci_api_reference]
1665
1666 %DONE
1667
1668 ``int8_t rpp_sci_init();`` @@ -> SCI module initialization. @@ @@
1669 ``boolean_t rpp_sci_setup(uint32_t baud);`` @@ -> SCI module setup. @@ @@
1670 ``uint16_t rpp_sci_available();`` @@ -> Number of bytes available on input buffer. @@ @@
1671 ``int8_t rpp_sci_read(uint32_t amount, uint8_t* buffer);`` @@ -> Read n number of bytes from input buffer. @@ @@
1672 ``int8_t rpp_sci_read_nb(uint32_t amount, uint8_t* buffer);`` @@ -> Read n number of bytes from input buffer if possible. @@ @@
1673 ``int8_t rpp_sci_write(uint32_t amount, uint8_t* data);`` @@ -> Write n number of bytes to the output buffer. @@ @@
1674 ``int8_t rpp_sci_write_nb(uint32_t amount, uint8_t* data);`` @@ -> Write n number of bytes to the output buffer if possible. @@ @@
1675 ``int8_t rpp_sci_flush(boolean_t buff);`` @@ -> Flush incomming or outgoing buffers. @@ @@
1676 ``int32_t rpp_sci_printf(const char* format, ...);`` @@ -> C style printf using RPP SCI module. @@ @@
1677 ``int8_t rpp_sci_putc(uint8_t byte);`` @@ -> C style putc (put character) using RPP SCI module. @@ @@
1678 ``int16_t rpp_sci_getc();`` @@ -> C style getc (get character) using RPP SCI module.
1679
1680 === ETH API Reference ===[eth_api_reference]
1681
1682 %DONE
1683
1684 ``int8_t rpp_eth_init();`` @@ -> ETH module initialization.
1685
1686 === SDC API Reference ===[sdc_api_reference]
1687
1688 %DONE
1689
1690 ``int8_t rpp_sdc_init();`` @@ -> SDC module initialization.
1691
1692 === SDR API Reference ===[sdr_api_reference]
1693
1694 %DONE
1695
1696 ``#define RPP_SDR_ADDR_START 0x80000000U`` @@ -> SDRAM start address on RPP board. @@ @@
1697 ``#define RPP_SDR_ADDR_END   0x83FFFFFFU`` @@ -> SDRAM end address on RPP board. @@ @@
1698 ``int8_t rpp_sdr_init();`` @@ -> SDR module initialization. @@ @@
1699 ``int8_t rpp_sdr_setup(boolean_t enable);`` @@ -> Configure SD-RAM logging. @@ @@
1700 ``uint32_t rpp_sdr_available();`` @@ -> Query for the amount of space free on the SD-RAM. @@ @@
1701 ``int32_t rpp_sdr_printf(const char* format, ...);`` @@ -> Store a formatted user string on the log, if logging is enabled. @@ @@
1702 ``int8_t rpp_sdr_clear();`` @@ -> Clear log. @@ @@
1703 ``int8_t rpp_sdr_show(boolean_t start);`` @@ -> Start/Stop the task that sends the log to the SCI.
1704
1705 NEWPAGE
1706
1707 = Simulink Coder Target =[simulink_coder_target]
1708
1709 %DONE
1710
1711 The Simulink Coder Target allows Simulink model's code generation, compilation and download for the 
1712 board.
1713
1714 == Description ==[description]
1715
1716 %DONE
1717
1718 The Simulink RPP Target provides support for C source code generation from Simulink models and
1719 compilation of that code on top of the RPP library and the FreeRTOS operating system. This target
1720 uses Texas Instrument ARM compiler (armcl) included in the Code Generation Tools available with
1721 Code Composer Studio, and thus it depends on it for proper functioning.
1722
1723 This library also provides support for automatically download the compiled machine code to the RPP
1724 board.
1725
1726 === Code generation process ===[code_generation_process]
1727
1728 %DONE
1729
1730 %tex% ''' \begin{figure}[H]\advance\leftskip-1cm
1731 [350-tlc_process.png]
1732 %tex% ''' \caption{TLC code generation process.}\end{figure}
1733
1734 == Subdirectory  content description ==[subdirectory__content_description]
1735
1736 %DONE
1737
1738 -> ``rpp_setup.m``
1739
1740 RPP Target install script.
1741
1742 This script will, among other things, ask the user to provide the location of the armcl parent
1743 directory, infer and save some relevant CCS paths, add paths to Matlab path and build S-Function
1744 blocks for user's architecture (using Matlab's mex command line tool).
1745
1746 - __Reference:__
1747  - ``<repo>/refs/rtw_ug.pdf`` p. 1137.
1748
1749
1750 -> ``rpp.tlc``
1751
1752 Embedded real-time system target file for RPP.
1753
1754 This file is the system target file (STF), or target manifest file. Functions of the STF include:
1755
1756 - Making the target visible in the System Target File Browser.
1757 - Definition of code generation options for the target (inherited and target-specific).
1758 - Providing an entry point for the top-level control of the TLC code generation process.
1759
1760
1761 - __Reference:__
1762  - ``<repo>/refs/rtw_ug.pdf`` p. 1129 and __1144__.
1763
1764
1765 -> ``rpp.tmf``
1766
1767 Embedded Coder Template Makefile.
1768
1769 This is just standard Embedded Coder Template Makefile, provided by Matlab. It was slightly
1770 modified to support ``armcl`` particularities and added template rules for assembler files (which
1771 were included by the ``rpp_lib_support.m`` script, but is no longer the case).
1772
1773 - __Reference:__
1774  - ``<repo>/refs/rtw_ug.pdf`` p. 1130 and __1183__.
1775
1776
1777 -> ``rpp_download.m``
1778
1779 Code download utility for Simulink RPP Target.
1780
1781 This function is optionally executed at the end of the build process if it is successful and the
1782 user selected //Download compiled binary to RPP// option on the build configuration panel. This
1783 function calls ``loadti.sh`` script with the generated binary and using configuration for the
1784 XDS100v2 JTAG Emulators. The board should be powered and correctly wired. @@
1785 See [Development wiring #development_wiring].
1786
1787
1788 NEWPAGE
1789 -> ``rpp_file_process.tlc``
1790
1791 Code generation custom file processing template.
1792
1793 This file should decide which //main// to generate according to configuration, in particular which
1794 mode, Single Tasking or Multitasking, is chosen. The RPP Target ignores this settings because it
1795 uses a tasking system based on tasking features provided by FreeRTOS. In consequence is only a
1796 wrapper to the //Single Tasking// main, which clearly is not for single tasking.
1797
1798 - __Reference:__
1799  - ``<repo>/refs/ecoder_ug.pdf`` p. 556.
1800  - ``<repo>/refs/ecoder_ref.pdf`` p. 1347.
1801
1802
1803 -> ``rpp_lib_support.m``
1804
1805 **DEPRECATED**. Simulink support for RPP library and operating system setup.
1806
1807 This files used to add the source code from the RPP library and operating to the build. This is no
1808 longer required when using the static library. This is left for future reference in case new source
1809 code needs to be included to the build.
1810
1811 - __Reference:__
1812  - ``<repo>/refs/rtw_ug.pdf`` p. 1058.
1813  - ``<repo>/refs/rtw_ref.pdf`` p. 56.
1814
1815
1816 -> ``rpp_make_rtw_hook.m``
1817
1818 Build process hooks file.
1819
1820 This file is hook file that invoke target-specific functions or executables at specified points in
1821 the build process. In particular, this file handle the copying of required files before the
1822 compilation stage.
1823
1824 - __Reference:__
1825  - ``<repo>/refs/rtw_ug.pdf`` p. 1066-1072 and 1131.
1826
1827
1828 -> ``rpp_select_callback_handler.m``
1829
1830 RPP Target select callback handler.
1831
1832 This callback function is triggered whenever the user selects the target in the System Target File
1833 Browser. Default values for Simulation and configurations parameters are set. Some options are
1834 disabled if it is not allowed to be changed by user.
1835
1836 - __Reference:__
1837  - ``<repo>/refs/rtw_ug.pdf`` p. 1211.
1838
1839
1840 NEWPAGE
1841 -> ``rpp_srmain.tlc``
1842
1843 Custom file processing to generate a //main// file.
1844
1845 This file generated the //main// file for the RPP target on top of the RPP library and the FreeRTOS
1846 operating system. The ``sr`` prefix is standard to mark Single Tasking main, which is the case.
1847 See ``rpp_file_process.m`` description above for more information about this.
1848
1849 - __Reference:__
1850  - Example in ``<matlab>/rtw/c/tlc/mw/bareboard_srmain.tlc``.
1851
1852
1853 -> ``target_tools.mk``
1854
1855 Makefile for CCS (``armcl``) toolchain support.
1856
1857 This file set variables to CCS tools to support build for this toolchain. This file is included by
1858 ``rpp.tmf`` before declaring the rules for source code.
1859
1860 - __Reference:__
1861  - //Include a tool specification settings// comment block in ``rpp.tmf``.
1862  - Compiler options documentation available in ``armcl.pdf``.
1863
1864
1865 NEWPAGE
1866
1867 == Installation procedure ==[installation_procedure]
1868
1869 %DONE
1870
1871 **1) Download and install CCS for Linux:**
1872
1873 Details on how to setup CCS are available in section
1874 [TI Code Composer Studio #ti_code_composer_studio].
1875
1876
1877 **2) Install RPP Target:**
1878
1879 Open Matlab and type on command window:
1880
1881 {{{ plain
1882 cd <repo>/rpp/rpp/
1883 rpp_setup()
1884 }}}
1885
1886 This will launch the RPP setup script. This script will ask the user to provide the path to the CCS
1887 compiler root directory (the directory where ``armcl`` binary is located), normally:
1888
1889 ```
1890 <ccs>/tools/compiler/arm_5.X.X/
1891 ```
1892
1893 This script will, among other things, ask the user to provide the location of the armcl parent
1894 directory, infer and save some relevant CCS paths, add paths to Matlab path and build S-Function
1895 blocks for user's architecture (using Matlab's mex command line tool).
1896
1897
1898 **3) Create a new model or load a demo:**
1899
1900 Demos are located on ``<repo>/rpp/demo`` or you can start a new model and configure target to RPP.
1901 For new models see [Target Reference #target_reference] section below.
1902
1903 NEWPAGE
1904
1905 == Target Reference ==[target_reference]
1906
1907 %DONE
1908
1909 This section describes the options required or available for running a Simulink model with the RPP
1910 Target.
1911
1912 === Simulink model options ===[simulink_model_options]
1913
1914 %DONE
1915
1916 The Simulink model needs to be configured in the following way:
1917
1918 - Solver:
1919  - //fixed-step discrete//.
1920  - Tasking mode set to //SingleTasking//. @@
1921 [400-simulink_solver.png]
1922 NEWPAGE
1923 - Diagnostics - Sample Time:
1924  - Disable warning source block specifies -1 sampling time. It's ok for the source blocks to run
1925    once per tick. @@
1926 [400-simulink_diagnostics.png]
1927 - Code generation:
1928  - Set to ``rpp.tlc``. @@
1929 [400-simulink_code.png]
1930
1931
1932 Note: Single Tasking is the only currently supported mode. If multitasking is required to be
1933       implemented in the future create a new file ``rpp_mrmain.tlc`` in ``<repo>/rpp/rpp/`` and
1934       edit ``rpp_file_process.tlc`` to use that file instead when multitasking is selected.
1935
1936
1937 === RPP Target options ===[rpp_target_options]
1938
1939 %DONE
1940
1941 The RPP Target include the following configuration options, all of them configurable per model
1942 under  ``Code Generation`` -> ``RPP Options``:
1943
1944 - **C system stack size**: this parameter is passed directly to the linker for the allocation of
1945   the stack. Note that this is the stack for the application when running outside a FreeRTOS task,
1946   normally before the scheduler has started and for system routines. Default value is 4096.
1947
1948 - **C system heap size**: this parameter is passed directly to the linker for the allocation of the
1949   heap. See
1950   [Appendix A: Notes on FreeRTOS memory management #appendix_a_notes_on_freertos_memory_management]
1951   for an important information about this parameter.
1952
1953 - **Model step task stack size**: this parameter will be passed to the ``xTaskCreate()`` that
1954   creates the task for the model to run. In a Simulink model there is always two tasks:
1955  - The worker task. This task is the one that executes the model step. This task requires enough
1956    stack memory to execute the step. Take into account for example than only a single call to
1957    ``rpp_sci_printf()`` requires, with current configuration, 128 bytes from the stack. This value
1958    should be minor than the C system heap and leaving enough heap for the system tasks. See
1959    [Appendix A: Notes on FreeRTOS memory management #appendix_a_notes_on_freertos_memory_management]
1960    for more information.
1961  - The control task. This task controls when the worker task should execute and controls overruns.
1962
1963 - **Download compiled binary to RPP**: if set, this option will download the generated binary to
1964   the board after the model is successfully built. Note that this option is unaware of the option
1965   //Generate code only// in the //Code Generation// options panel, so it will try to upload even if
1966   only source code has being generated, failing graciously or uploading an old binary laying around
1967   in the build directory. This option calls the ``rpp_download.m`` script, which is in turn a
1968   wrapper on the ``loadti.sh`` script. More information on the ``loadti.sh`` script can be found
1969   in:
1970 ```
1971 <css>/ccs_base/scripting/examples/loadti/readme.txt
1972 http://processors.wiki.ti.com/index.php/Loadti
1973 ```
1974   The ``loadti.sh`` script will close after the download of the generated program and in
1975   consequence the execution of the loaded program will stop (because it work as the CCS debug
1976   server). In order to test the loaded model a manual reset of the board is always required after a
1977   successful download.
1978
1979 - **Print model metadata to SCI at start**: if set this option will print a message to the Serial
1980   Communication Interface when the model start execution on the board. This is very helpful to
1981   identify the model running on the board. The message is in the form:
1982 ```
1983 `model_name' - generated_date (TLC tlc_version)
1984 ```
1985   For example:
1986 ```
1987 `hbridge_analog_control' - Wed Jun 19 14:10:44 2013 (TLC 8.3 (Jul 20 2012))
1988 ```
1989
1990 NEWPAGE
1991
1992 = Simulink Block Library =[simulink_block_library]
1993
1994 %DONE
1995
1996 %tex% ''' \vspace{-0.25cm}
1997
1998 The Simulink Block Library is a set of blocks that allows Simulink models to use board IO and 
1999 communication peripherals.
2000
2001 %tex% ''' \vspace{-0.5cm}
2002
2003 == Description ==[description]
2004
2005 %DONE
2006
2007 %tex% ''' \vspace{-0.25cm}
2008
2009 As part of this project the ideal set was defined, but not all blocks were implemented. The
2010 following table shows the current status of the block library.
2011
2012 %tex% ''' \vspace{-0.25cm}
2013
2014 || CATEGORY                | NAME                           | STATUS*  | MNEMONIC    | LRH*
2015  | System blocks           | Configuration block            | ``X``    | ``[CONF]``  | ``RppConfig.h``  |
2016  | Logic IO blocks         | Digital Input block            | ``T``    | ``[DIN ]``  | ``rpp_din.h``    |
2017  |                         | Digital Output block           | ``T``    | ``[LOUT]``  | ``rpp_lout.h``   |
2018  |                         | Analog Input block             | ``T``    | ``[AIN ]``  | ``rpp_ain.h``    |
2019  |                         | Analog Output block            | ``T``    | ``[AOUT]``  | ``rpp_aout.h``   |
2020  | Power output blocks     | H-Bridge Control block         | ``T``    | ``[HBR ]``  | ``rpp_hbr.h``    |
2021  |                         | Power output block             | ``T``    | ``[MOUT]``  | ``rpp_mout.h``   |
2022  |                         | High-Power output block        | ``X``    | ``[HOUT]``  | ``rpp_hout.h``   |
2023  | Communication blocks    | CAN Bus receive block          | ``X``    | ``[CANR]``  | ``rpp_can.h``    |
2024  |                         | CAN Bus send msg block         | ``X``    | ``[CANS]``  | - Idem -         |
2025  |                         | LIN receive block              | ``X``    | ``[LINR]``  | ``rpp_lin.h``    |
2026  |                         | LIN send msg block             | ``X``    | ``[LINS]``  | - Idem -         |
2027  |                         | FlexRay receive block          | ``X``    | ``[FRR ]``  | ``rpp_fr.h``     |
2028  |                         | FlexRay send msg block         | ``X``    | ``[FRS ]``  | - Idem -         |
2029  |                         | SCI receive block              | ``T``    | ``[SCIR]``  | ``rpp_sci.h``    |
2030  |                         | SCI send msg block             | ``T``    | ``[SCIS]``  | - Idem -         |
2031  |                         | SCI configure block            | ``T``    | ``[SCIC]``  | - Idem -         |
2032  |                         | Ethernet receive block         | ``X``    | ``[ETHR]``  | ``rpp_eth.h``    |
2033  |                         | Ethernet send msg block        | ``X``    | ``[ETHS]``  | - Idem -         |
2034  | Logging/Storage blocks  | SD Card write block            | ``T``    | ``[SDCW]``  | ``rpp_sdc.h``    |
2035  |                         | SDRAM write block              | ``X``    | ``[SDRW]``  | ``rpp_sdr.h``    |
2036  | Trigger blocks          | Overrun detected block         | ``X``    | ``[TROR]``  | - None -         |
2037  |                         | Stack overflow detected block  | ``X``    | ``[TRSO]``  | - None -         |
2038  |                         | Malloc Failed detected block   | ``X``    | ``[TRMF]``  | - None -         |
2039
2040 %tex% ''' \vspace{-0.5cm}
2041
2042 %tex% ''' \begin{multicols}{2}
2043 **Legend:**
2044 - *LRH    : Library Reference Header.
2045 - *STATUS :
2046  - ``X`` - Unimplemented. Files non present.
2047  - ``P`` - Unimplemented. Files present.
2048  - ``W`` - Work in progress.
2049  - ``I`` - Implemented.
2050  - ``T`` - Implemented and tested.
2051
2052
2053 %tex% ''' \vfill\columnbreak
2054 **Notes:** @@
2055 Each block that can detect fault condition should have a trigger output. @@
2056 High-power output provides current flow as an input to the model.
2057
2058 %tex% ''' \end{multicols}
2059
2060
2061
2062
2063
2064
2065
2066
2067 === C MEX S-Functions ===[c_mex_s_functions]
2068
2069 %DONE
2070
2071 All of the blocks are implemented as a C Mex S-Function coded by hand. In the this section the 
2072 approach taken is explained.
2073
2074 C-MEX S-Function:
2075  - C : Implemented in C language. Other options are Fortran and Matlab language itself.
2076  - MEX: Matlab Executable. They are compiled by Matlab GCC wrapper called MEX.
2077  - S-Function: System Function, as opposed to standard functions, or user functions.
2078
2079
2080 A C-MEX S-Function is a structured C file that includes the following mandatory callbacks:
2081
2082 + ``mdlInitializeSizes``: @@
2083   Specify the number of inputs, outputs, states, parameters, and other characteristics of the C 
2084   MEX S-function.
2085 + ``mdlInitializeSampleTimes``: @@
2086   Specify the sample rates at which this C MEX S-function operates.
2087 + ``mdlOutputs``: @@
2088   Compute the signals that this block emits.
2089 + ``mdlTerminate``: @@
2090   Perform any actions required at termination of the simulation.
2091
2092
2093 Plus many more optional callbacks. Relevant optional callbacks are:
2094
2095 + ``mdlCheckParameters``: @@
2096   Check the validity of a C MEX S-function's parameters.
2097 + ``mdlRTW``: @@
2098   Generate code generation data for a C MEX S-function.
2099 + ``mdlSetWorkWidths``: @@
2100   Specify the sizes of the work vectors and create the run-time parameters required by the C MEX 
2101   S-function.
2102 + ``mdlStart``: @@
2103   Initialize the state vectors of the C MEX S-function.
2104
2105
2106 A complete list of callbacks can be found in:
2107
2108         http://www.mathworks.com/help/simulink/create-cc-s-functions.html
2109
2110 NEWPAGE
2111 The way a C-MEX S-Function participates in a Simulink simulation is shown by the following diagram:
2112
2113 %tex% ''' \begin{figure}[H]\begin{center}
2114 [250-sfunctions_process.png]
2115 %tex% ''' \caption{Simulation cycle of a S-Function.}\end{center}\end{figure}
2116
2117 In general, a S-Function can perform calculations and inputs and outputs for simulation. Because 
2118 the blocks implemented for this project are for hardware peripherals control and IO the blocks are 
2119 implemented as pure sink or pure source. That is, the S-Function is a descriptor of the block but
2120 does not any calculation, input or output for simulation. 
2121
2122 The S-Functions required could be implemented in several ways:
2123
2124 + Writing the S-Function. @@
2125   Using this method, the user hand write a new C S-Function and associated TLC file. This method 
2126   requires the most knowledge about the structure of a C S-Function.
2127 + Using an S-Function Builder block. @@
2128   Using this method, the user enter the characteristics of the S-function into a block dialog. This 
2129   method does not require any knowledge about writing S-Functions. However, a basic understanding 
2130   of the structure of an S-Function can make the S-Function Builder dialog box easier to use.
2131 + Using the Legacy Code Tool (LCT). @@
2132   Using this command line method, the user define the characteristics of your S-function in a data 
2133   structure in the MATLAB workspace. This method requires the least amount of knowledge about 
2134   S-Functions.
2135
2136
2137 From the above, the LCT is a tool that can be called within Matlab workshop that allows to generate 
2138 source code for S-Functions given the descriptor of a C function call. This approach is used by
2139 most of the other targets reviewed for this project. The descriptor is a Matlab file with 
2140 definitions like the following:
2141
2142 NEWPAGE
2143 {{{ plain
2144 %% GPIO Write
2145 % Populate legacy_code structure with information
2146 GPIOWrite = legacy_code('initialize');
2147 GPIOWrite.SFunctionName = 'sfun_GPIOWrite';
2148 GPIOWrite.HeaderFiles = {'gpiolct.h'};
2149 GPIOWrite.SourceFiles = {'gpiolct.c'};
2150 GPIOWrite.OutputFcnSpec = 'GPIOWrite(uint32 p1, uint8 u1, uint8 u2)';
2151 % Support calling from within For-Each subsystem
2152 GPIOWrite.Options.supportsMultipleExecInstances = true;
2153 }}}
2154
2155 The interface and implementation files specified should hold the declaration and implementation of
2156 the ``OutputFcnSpec`` function. This tool will generate a simple S-Function that will input and 
2157 output the values required by that function. This approach was **not** for this project, mainly 
2158 because:
2159
2160 - The RPP Library requires that after some actions (like setting one LOUT output) the changes are 
2161   committed to the hardware, or before some other actions (like getting the value from DIN using 
2162   the fixed threshold) the values cached are updated. And the implementation of a wrapper function
2163   that would update or commit the changes wasn't considered because of the efficiency impact it
2164   would have.
2165
2166 - Furthermore, the error handling of the function call is not considered, and for some blocks 
2167   (like MOUT and HOUT) the diagnostic handling is mandatory.
2168
2169 - Also, the dialog parameters of the S-Function cannot be validated otherwise than data type 
2170   (cannot validate range, for example). 
2171
2172 - For future improvements the LCT cannot generate code for simulation, and a lot of S-Function 
2173   options cannot not be fine tuned. 
2174
2175 - Finally, the generated code is very obscure, hard to read and to maintain in case the above 
2176   functionality had to be implemented on top of the generated code.
2177
2178
2179 Similarly the hand written S-Functions shares a large amount of code like parameters scalar, data 
2180 type and range validation, standard options for this kind of blocks, unused functions, among other. 
2181 Because of this a mini framework for writing S-Functions for RPP was implemented in the form of two 
2182 files that are directly included at the beginning and end of the S-Function implementation: 
2183 ``header.c`` and  ``trailer.c``. 
2184
2185 This mini-framework reduces the amount of required code for each S-Function considerably, making 
2186 easier to maintain and adapt. Because each S-Function is a program by itself there is no need to 
2187 use interface files and the files are directly included.
2188
2189 NEWPAGE
2190 The final form of the S-Function is a C file of around 100 lines of code with the following layout:
2191
2192 - Define S-Function name ``S_FUNCTION_NAME``.
2193
2194 - Include header file ``header.c``.
2195
2196 - In ``mdlInitializeSizes`` define:
2197  - Number of //dialog// parameter.
2198  - Number of input ports.
2199   - Data type of each input port.
2200  - Number of output ports.
2201   - Data type of each output port.
2202  - Standard options for driver blocks.
2203
2204 - In ``mdlCheckParameters``:
2205  - Check data type of each parameter.
2206  - Check range, if applicable, of each parameter.
2207
2208 - In ``mdlSetWorkWidths``:
2209  - Map //dialog// parameter to //runtime// parameters.
2210   - Data type of each //runtime// parameter.
2211
2212 - Define symbols for unused functions.
2213
2214 - Include trailer file ``trailer.c``.
2215
2216
2217 The C-MEX S-Function implemented can be compile with the following command:
2218
2219 {{{ bash
2220 <matlabroot>/bin/mex sfunction_{mnemonic}.c
2221 }}}
2222
2223 As noted the standard is to always prefix S-Function with ``sfunction_`` and use lower case 
2224 mnemonic of the block.
2225
2226 Also a script called ``compile_blocks.m`` is included that allows all ``sfunctions_*.c`` to be fed 
2227 to the ``mex`` compiler so all S-Functions are compiled at once. To use this script, in Matlab do:
2228
2229 {{{ plain
2230 cd <repo>/rpp/blocks/
2231 compile_blocks()
2232 }}}
2233
2234 NEWPAGE
2235
2236 === Target Language Compiler files ===[target_language_compiler_files]
2237
2238 %DONE
2239
2240 C code generated from a Simulink model is placed on a file called ``<modelname>.c`` along with 
2241 other support files in a folder called ``<modelname>_<target>/``. For example, the source code
2242 generated for model ``foobar`` will be placed in current Matlab directory ``foobar_rpp/foobar.c``.
2243
2244 The file ``<modelname>.c`` has 3 main functions:
2245
2246 - ``void <modelname>_step(void)``: @@
2247   This function recalculates all the outputs of the blocks and should be called once per step. This
2248   is the main working function.
2249 - ``void <modelname>_initialize(void)``: @@
2250   This function is called only once before the first step is issued. Default values for blocks IOs
2251   should be placed here.
2252 - ``void <modelname>_terminate(void)``: @@
2253   This function is called when terminating the model. This should be used to free memory of revert 
2254   other operations made on the initialization function. With current implementation this function
2255   should never be called unless an errors is detected and in most models it is empty.
2256
2257
2258 In order to generate code for each one of those functions each S-Function implement a TLC file
2259 for //inlining// the S-Function on the generated code. The TLC files are files that describe how to 
2260 generate code for a specific C-MEX S-Function block. They are programmed using TLC own language and 
2261 include C code within TLC instructions, just like LaTeX files include normal text in between LaTeX 
2262 macros.
2263
2264 TLC files are located under ``<repo>/rpp/blocks/tlc_c/`` directory. For a diagram on how TLC files 
2265 work see [Code generation process #code_generation_process] section.
2266
2267 The standard for a TLC file is to be located under the ``tlc_c`` subfolder from where the 
2268 S-Function is located and to use the very exact file name as the S-Function but with the ``.tlc``
2269 extension:
2270
2271 ``sfunction_foo.c`` -> ``tlc_c/sfunction_foo.tlc``
2272
2273 The TLC files implemented for this project use 3 hook functions in particular (other are available, 
2274 see TLC reference documentation):
2275
2276 - ``BlockTypeSetup``: @@
2277   BlockTypeSetup executes once per block type before code generation begins.
2278   This function can be used to include elements required by this block type, like includes or
2279   definitions.
2280
2281 - ``Start``: @@
2282   Code here will be placed in the ``void <modelname>_initialize(void)``. Code placed here will
2283   execute only once.
2284
2285 - ``Outputs``: @@
2286   Code here will be placed in the ``void <modelname>_step(void)`` function. Should be used to 
2287   get the inputs o a block and/or to set the outputs of that block.
2288
2289
2290 The general layout of the TLC files implemented for this project are:
2291
2292 - In ``BlockTypeSetup``: @@
2293   Call common function ``%<RppCommonBlockTypeSetup(block, system)>`` that will include the 
2294   ``rpp/rpp.h`` header file (can be called multiple times but header is included only once).
2295
2296 - ``Start``: @@
2297   Call setup routines from RPP Layer for the specific block type, like HBR enable, DIN pin setup, 
2298   AOUT value initialization, SCI baud rate setup, among others.
2299
2300 - ``Outputs``: @@
2301   Call common IO routines from RPP Layer, like DIN read, AOUT set, etc. Success of this functions
2302   is checked and in case of failure error is reported to the block using ErrFlag.
2303
2304
2305 NEWPAGE
2306
2307 == Subdirectory  content description ==[subdirectory__content_description]
2308
2309 %DONE
2310
2311 -> ``header.c`` and ``trailer.c``
2312
2313 RPP framework for simple S-Functions.
2314
2315 This files are included at the head and tail of each S-Function file. They include refactored and
2316 commonly repeated structures that pollute S-Functions implementations. They include basic includes,
2317 required definitions, macro definitions, common functions implementations and documentation on
2318 optional functions and commented prototypes for optional model calls/hooks.
2319
2320 - __Reference:__
2321  - See header of those files.
2322
2323
2324 -> ``sfunction_{mnemonic}.c``
2325
2326 C-MEX S-Function implementation for {mnemonic} block.
2327
2328 This file implements the {mnemonic} block using C-MEX S-Function API. See the reference for 
2329 information about the S-Function API.
2330
2331 - __Reference:__
2332  - ``<repo>/refs/sfunctions.pdf``
2333
2334
2335 -> ``tlc_c/sfunction_{mnemonic}.tlc``
2336
2337 Target Language Compiler (TLC) file for {mnemonic} block.
2338
2339 This file implements the C code inlining for {mnemonic} block. See the reference for information 
2340 about the TLC API.
2341
2342 - __Reference:__
2343  - ``<repo>/refs/rtw_tlc.pdf``
2344
2345
2346 -> ``tlc_c/common.tlc``
2347
2348 Common TLC functions.
2349
2350 This file implements common TLC functions used by all the blocks.
2351
2352 - __Reference:__
2353  - None.
2354
2355
2356 NEWPAGE
2357 -> ``slblocks.m``
2358
2359 Simulink library control file.
2360
2361 This file allows a group of blocks to be integrated into the Simulink Library and Simulink Library
2362 Browser. This file is required by Simulink in order to interpret this folder as a block library.
2363 For information about this file see the references.
2364
2365 - __Reference:__
2366  - ``<repo>/refs/rtw_ug.pdf`` p. 1127
2367
2368
2369 -> ``rpp_lib.slx``
2370
2371 RPP Simulink block library.
2372
2373 Simulink block library that includes all the blocks. This file is referenced by ``slblocks.m``
2374
2375 - __Reference:__
2376  - None.
2377
2378
2379 -> compile_blocks.m
2380
2381 Blocks compilation script.
2382
2383 This script compiles all the sfunction blocks to MEX executables. This script is called by the
2384 ``rpp_setup()`` function in order make all the blocks available to the Simulink environment or it
2385 can be called independently when developing S-Functions.
2386
2387 - __Reference:__
2388  - None.
2389
2390
2391 NEWPAGE
2392
2393 == Block Library Reference ==[block_library_reference]
2394
2395 %DONE
2396
2397 This section describes each one of the Simulink blocks implements as part of this project:
2398
2399 %tex% ''' \begin{figure}[H]\advance\leftskip-1cm
2400 [530-block_library.png]
2401 %tex% ''' \caption{Simulink RPP Block Library.}\end{figure}
2402
2403 NEWPAGE
2404
2405 === DIN Digital Input block ===[din_digital_input_block]
2406
2407 %DONE
2408
2409 ```
2410     Inputs      : 0
2411         None
2412
2413     Outputs     : 2
2414         bool    Digital Input
2415         bool    ErrFlag
2416
2417     Parameters  : 2
2418         uint8   Pin number [1-16]
2419         bool    Use variable threshold
2420 ```
2421
2422 This block allows to read the digital inputs on the RPP board. The variable threshold check change 
2423 the read mode of the pin. The ErrFlag should raise if ``rpp_din_update()`` or ``rpp_din_get()`` 
2424 returns error. ``rpp_din_update()`` is called just by the first DIN block in the model and thus 
2425 only the first block could raise the flag because of this. In case an errors occurs the return 
2426 value will always be LOW (0). Because the ErrFlag should never set, once set the following steps 
2427 will never clear it back.
2428
2429
2430 %tex% ''' \begin{multicols}{3}
2431 - **Tested**:
2432  - Changing the pin.
2433  - Compilation and general use.
2434  - Using variable threshold.
2435
2436
2437 %tex% ''' \vfill\columnbreak
2438 - **Untested**:
2439  - Faulty situation for the ErrFlag to set.
2440
2441
2442 %tex% ''' \vfill\columnbreak
2443 - **Not working**:
2444
2445
2446 %tex% ''' \end{multicols}
2447
2448
2449 **RPP API functions used:**
2450 - ``rpp_din_setup()``.
2451 - ``rpp_din_update()``.
2452 - ``rpp_din_get()``.
2453
2454
2455 **Relevant demos:**
2456 - ``digital_passthrough``.
2457 - ``hbridge_digital_control``.
2458
2459
2460 NEWPAGE
2461
2462 === LOUT Digital Output block ===[lout_digital_output_block]
2463
2464 %DONE
2465
2466 ```
2467     Inputs      : 1
2468         bool    Digital Output
2469
2470     Outputs     : 1
2471         bool    ErrFlag
2472
2473     Parameters  : 1
2474         uint8   Pin number [1-8]
2475 ```
2476
2477 This block allows to write to the digital outputs on the RPP board. The ErrFlag should raise if 
2478 ``rpp_lout_set()`` or ``rpp_lout_update()`` returns error. Because the ErrFlag should never set, 
2479 once set the following steps will never clear it back. ``rpp_lout_update()`` is called on each 
2480 block, which is not the most efficient but guaranties consistent behavior.
2481
2482
2483 **Status:**
2484 %tex% ''' \begin{multicols}{3}
2485 - **Tested**:
2486  - Changing the pin.
2487  - Compilation and general use.
2488
2489
2490 %tex% ''' \vfill\columnbreak
2491 - **Untested**:
2492  - Faulty situation for the ErrFlag to set.
2493
2494
2495 %tex% ''' \vfill\columnbreak
2496 - **Not working**:
2497
2498
2499 %tex% ''' \end{multicols}
2500
2501
2502 **RPP API functions used:**
2503 - ``rpp_lout_set()``.
2504 - ``rpp_lout_update()``.
2505
2506
2507 **Relevant demos:**
2508 - ``digital_passthrough``.
2509 - ``led_blink_all``.
2510 - ``led_blink``.
2511
2512
2513 NEWPAGE
2514
2515 === AIN Analog Input block ===[ain_analog_input_block]
2516
2517 %DONE
2518
2519 ```
2520     Inputs      : 0
2521         None
2522
2523     Outputs     : 2
2524         uint16  Analog Input
2525         bool    ErrFlag
2526
2527     Parameters  : 1
2528         uint8   Pin number [1-12]
2529 ```
2530
2531 This block allows to read the analog inputs on the RPP board. The ErrFlag should if raise 
2532 ``rpp_ain_update()`` or ``rpp_ain_get()`` returns error. ``rpp_ain_update()`` is called just by the 
2533 first DIN block in the model and thus only the first block could raise the flag because of this. 
2534 In case an errors occurs the return value will always be 0. Because the ErrFlag should never set, 
2535 once set the following steps will never clear it back.
2536
2537
2538 **Status:**
2539 %tex% ''' \begin{multicols}{3}
2540 - **Tested**:
2541  - Changing the pin.
2542  - Compilation and general use.
2543
2544
2545 %tex% ''' \vfill\columnbreak
2546 - **Untested**:
2547  - Faulty situation for the ErrFlag to set.
2548
2549
2550 %tex% ''' \vfill\columnbreak
2551 - **Not working**:
2552
2553
2554 %tex% ''' \end{multicols}
2555
2556
2557 **RPP API functions used:**
2558 - ``rpp_ain_update()``.
2559 - ``rpp_ain_get()``.
2560
2561
2562 **Relevant demos:**
2563 - ``analog_passthrough``.
2564 - ``hbridge_analog_control``.
2565 - ``log_analog_input``.
2566
2567
2568 NEWPAGE
2569
2570 === AOUT Analog Output block ===[aout_analog_output_block]
2571
2572 %DONE
2573
2574 ```
2575     Inputs      : 1
2576         uint16  Analog Output
2577
2578     Outputs     : 1
2579         bool    ErrFlag
2580
2581     Parameters  : 1
2582         uint8   Pin number [1-4]
2583         bool    UseVoltage
2584 ```
2585
2586 This block allows to write to the analog outputs on the RPP board. The UseVoltage flag allows the 
2587 user to configure if block inputs should be interpreted as raw DAC value or millivolts. The ErrFlag 
2588 should raise if ``rpp_aout_update()`` or ``rpp_aout_set()`` (or ``rpp_aout_set_voltage()`` 
2589 depending on block configuration) returns error. Because the ErrFlag should never set, once set the 
2590 following steps will never clear it back.
2591
2592 ``rpp_aout_update()`` is called on each block but the implementation provides this to be efficient.
2593
2594 There is a know bug on the RPP Library, check ``rpp_aout_update()`` on the RPP API for details. 
2595 Because of this, the outputs of the DACs are initialized on the first step of the model and not on 
2596 the model initialization.
2597
2598
2599 **Status:**
2600 %tex% ''' \begin{multicols}{3}
2601 - **Tested**:
2602  - Changing the pin.
2603  - Changing voltage/value flag.
2604  - Compilation and general use.
2605
2606
2607 %tex% ''' \vfill\columnbreak
2608 - **Untested**:
2609  - Faulty situation for the ErrFlag to set.
2610
2611
2612 %tex% ''' \vfill\columnbreak
2613 - **Not working**:
2614  - Initializing DACs on model's initialization.
2615
2616
2617 %tex% ''' \end{multicols}
2618
2619
2620 **RPP API functions used:**
2621 - ``rpp_aout_setup()``.
2622 - ``rpp_aout_set()``, or
2623 - ``rpp_aout_set_voltage()``.
2624 - ``rpp_aout_update()``.
2625
2626
2627 **Relevant demos:**
2628 - ``analog_passthrough``.
2629 - ``analog_sinewave``.
2630
2631
2632 NEWPAGE
2633
2634 === HBR H-Bridge Control block ===[hbr_h_bridge_control_block]
2635
2636 %DONE
2637
2638 ```
2639     Inputs      : 1
2640         double  Control
2641
2642     Outputs     : 1
2643         bool    ErrFlag
2644
2645     Parameters  : 0
2646         None
2647 ```
2648
2649 This block allows to control the H-Bridge on the RPP board. The ErrFlag should raise only if
2650 ``rpp_hbr_control()`` returns error. The H-Bridge is initialized with the default frequency 
2651 (~18kHz). A future improvement could include a parameter to set the frequency. Because the ErrFlag 
2652 should never set, once set the following steps will never clear it back.
2653
2654
2655 **Status:**
2656 %tex% ''' \begin{multicols}{3}
2657 - **Tested**:
2658  - Compilation and general use.
2659
2660
2661 %tex% ''' \vfill\columnbreak
2662 - **Untested**:
2663  - Faulty situation for the ErrFlag to set.
2664
2665
2666 %tex% ''' \vfill\columnbreak
2667 - **Not working**:
2668
2669
2670 %tex% ''' \end{multicols}
2671
2672
2673 **RPP API functions used:**
2674 - ``rpp_hbr_enable()``.
2675 - ``rpp_hbr_control()``.
2676
2677
2678 **Relevant demos:**
2679 - ``hbridge_analog_control``.
2680 - ``hbridge_digital_control``.
2681 - ``hbridge_sinewave_control``.
2682
2683
2684 NEWPAGE
2685
2686 === MOUT Power Output block ===[mout_power_output_block]
2687
2688 %DONE
2689
2690 ```
2691     Inputs      : 1
2692         bool    Power Output
2693
2694     Outputs     : 1
2695         bool    ErrFlag
2696
2697     Parameters  : 1
2698         uint8   Pin number [1-6]
2699 ```
2700
2701 This block allows to write the power outputs (2A) on the RPP board. The ErrFlag should raise only 
2702 if ``rpp_mout_set()``returns error. Note that ``rpp_mout_set()`` returns error only if some bad 
2703 parameter or in case it could detect a faulty condition on the pin in a very very short period of 
2704 time after setting the value, see the function API for details. If the faulty condition persist on 
2705 the next step the call will successfully detect the faulty condition and ErrFlag should set. 
2706 Because the ErrFlag should never set, once set the following steps will never clear it back.
2707
2708
2709 **Status:**
2710 %tex% ''' \begin{multicols}{3}
2711 - **Tested**:
2712  - Changing the pin.
2713  - Compilation and general use.
2714
2715
2716 %tex% ''' \vfill\columnbreak
2717 - **Untested**:
2718  - Faulty situation for the ErrFlag to set.
2719
2720
2721 %tex% ''' \vfill\columnbreak
2722 - **Not working**:
2723
2724
2725 %tex% ''' \end{multicols}
2726
2727
2728 **RPP API functions used:**
2729 - ``rpp_mout_set()``.
2730
2731
2732 **Relevant demos:**
2733 - ``power_toggle``.
2734
2735
2736 NEWPAGE
2737
2738 === SCIR Serial Comm. Interface Receive ===[scir_serial_comm_interface_receive]
2739
2740 %DONE
2741
2742 ```
2743     Inputs      : 0
2744         None
2745
2746     Outputs     : 2
2747         uint8   Data
2748         bool    ErrFlag
2749
2750     Parameters  : 0
2751         None
2752 ```
2753
2754 This block allows to receive a byte from the SCI. The ErrFlag should raise if ``rpp_sci_read_nb()``
2755 doesn't succeed. The behavior of the ErrFlag is different from others blocks in that this block 
2756 will set or clear the flag if the call fails of success at each step. Note that this block uses the
2757 non-blocking call to read the SCI and thus will never cause an overrun.
2758
2759
2760 **Status:**
2761 %tex% ''' \begin{multicols}{3}
2762 - **Tested**:
2763  - Receiving data.
2764  - Compilation and general use.
2765  - Faulty situation for the ErrFlag to set.
2766
2767
2768 %tex% ''' \vfill\columnbreak
2769 - **Untested**:
2770
2771
2772 %tex% ''' \vfill\columnbreak
2773 - **Not working**:
2774
2775
2776 %tex% ''' \end{multicols}
2777
2778
2779 **RPP API functions used:**
2780 - ``rpp_sci_read_nb()``.
2781
2782
2783 **Relevant demos:**
2784 - ``echo_char``.
2785
2786
2787 NEWPAGE
2788
2789 === SCIS Serial Comm. Interface Send ===[scis_serial_comm_interface_send]
2790
2791 %DONE
2792
2793 ```
2794     Inputs      : 1
2795         uint8   Data
2796
2797     Outputs     : 1
2798         bool    ErrFlag
2799
2800     Parameters  : 2
2801         bool    UsePrintf
2802         string  PrintFormat [SETTING]
2803 ```
2804
2805 This block allows to send a byte to the SCI or to print a formatted string that uses that byte. The
2806 UsePrintf flag allows to user to select ``rpp_sci_write_nb()`` (raw send) or ``rpp_sci_printf()``
2807 (formatted print) as the function the block should use on code generation. If UsePrintf is set the
2808 PrintFormat string parameters SETTING is used as the format specifier. Note that this value is
2809 inserted raw between quotes on code generation and thus there is no validation on it. User should
2810 always put any valid integer specifier for the value on the input of the block.
2811
2812 The behavior of this block depends if UsePrintf is set or not. If set, the call ``rpp_sci_printf()``
2813 (a blocking call) could potentially overrun the step. Also, the ErrFlag will set only if
2814 ``rpp_sci_printf()`` returns an error, and because it should never set, once set it will never
2815 clear back. On the contrary, if UsePrintf is clear, the call ``rpp_sci_write_nb()`` (non-blocking)
2816 is used and thus the step cannot be overrun, but because is a best-effort call it cannot guarantee 
2817 that all the data will be sent. In the case that not all data could be sent, the ErrFlag will set, 
2818 but it will clear back if the next step is able to send all it's data (which with the current 
2819 implementation is just one byte).
2820
2821 A possible future improvement for this block is to allow input to be non-scalar so user can print a 
2822 whole string in one step using raw non-blocking write. This is currently possible if input 
2823 configuration is adapted in S-Function and TLC. The problem this could pose is is that for printf 
2824 user should include specifiers for all the cells in the non-scalar input, and if unknown, then 
2825 printf cannot be used.
2826
2827
2828 **Status:**
2829 %tex% ''' \begin{multicols}{3}
2830 - **Tested**:
2831  - Sending data.
2832  - Compilation and general use.
2833
2834
2835 %tex% ''' \vfill\columnbreak
2836 - **Untested**:
2837  - Faulty situation for the ErrFlag to set.
2838
2839
2840 %tex% ''' \vfill\columnbreak
2841 - **Not working**:
2842
2843
2844 %tex% ''' \end{multicols}
2845
2846
2847 **RPP API functions used:**
2848 - ``rpp_sci_write_nb()``, or ``rpp_sci_printf()``.
2849
2850
2851 **Relevant demos:**
2852 - ``echo_char`` and ``hello_world``.
2853
2854
2855 NEWPAGE
2856
2857 === SCIC Serial Comm. Interface Configure ===[scic_serial_comm_interface_configure]
2858
2859 %DONE
2860
2861 ```
2862     Inputs      : 0
2863         None
2864
2865     Outputs     : 0
2866         None
2867
2868     Parameters  : 1
2869         uint32  Baud rate
2870 ```
2871
2872 This block allows to configure the baud rate of the SCI. There should only one block of this type 
2873 per model, and this requirement is not validated, but the inclusion of several blocks is harmless 
2874 and will just produce the baud rate to be changed several times, being the final baud rate to be 
2875 the one of the last executed block. This block just executes on model initialization and not on 
2876 each step.
2877
2878
2879 **Status:**
2880 %tex% ''' \begin{multicols}{3}
2881 - **Tested**:
2882  - Changing baud rate.
2883  - Compilation and general use.
2884
2885
2886 %tex% ''' \vfill\columnbreak
2887 - **Untested**:
2888  - Using more than one block in a model.
2889
2890
2891 %tex% ''' \vfill\columnbreak
2892 - **Not working**:
2893
2894
2895 %tex% ''' \end{multicols}
2896
2897
2898 **RPP API functions used:**
2899 - ``rpp_sci_setup()``.
2900
2901
2902 **Relevant demos:**
2903 - ``echo_char``.
2904 - ``hello_world``.
2905
2906
2907 NEWPAGE
2908
2909 === SDRW SD-RAM Write ===[sdrw_sd_ram_write]
2910
2911 %DONE
2912
2913 ```
2914     Inputs      : 1
2915         double  Data
2916
2917     Outputs     : 1
2918         bool    ErrFlag
2919
2920     Parameters  : 2
2921         uint8   Block ID
2922         string  PrintFormat [SETTING]
2923 ```
2924
2925 This block allows to log a double value to the SD-RAM. User needs to provide a valid PrintFormat 
2926 string to format and register the double value on the log. The PrintFormat string should include 
2927 two specifiers:
2928
2929 - For the block ID. Any valid integer specifier.
2930 - For the value to log. Any valid double specifier.
2931
2932
2933 Note that the value of PrintFormat is inserted raw between quotes on code generation and thus there 
2934 is no validation on it. Error to provide a valid PrintFormat could generate compilation errors on 
2935 even run-time errors (normally this generates a warning on compile time). Note that the function 
2936 for logging used is ``rpp_sdr_printf()``, which is a blocking call, and can potentially overrun the 
2937 step. The ErrFlag will set if ``rpp_sdr_printf()`` returns an error (for example out of memory), 
2938 but will clear back if the next step the call to this function is successful.
2939
2940
2941 **Status:**
2942 %tex% ''' \begin{multicols}{3}
2943 - **Tested**:
2944  - Logging data.
2945  - Compilation and general use.
2946
2947
2948 %tex% ''' \vfill\columnbreak
2949 - **Untested**:
2950  - Faulty situation for the ErrFlag to set.
2951
2952
2953 %tex% ''' \vfill\columnbreak
2954 - **Not working**:
2955
2956
2957 %tex% ''' \end{multicols}
2958
2959
2960 **RPP API functions used:**
2961 - ``rpp_sdr_printf()``.
2962
2963
2964 **Relevant demos:**
2965 - ``log_analog_input``.
2966
2967
2968 NEWPAGE
2969
2970 = Simulink Demos Library =[simulink_demos_library]
2971
2972 %DONE
2973
2974 The Simulink RPP Demo Library is a set of Simulink models that use blocks from the Simulink RPP
2975 Block Library and generates code using the Simulink RPP Target.
2976
2977 == Description ==[description]
2978
2979 %DONE
2980
2981 This demos library is used as a test suite for the Simulink RPP Block Library but they are also
2982 intended to show basic programs built using it. Because of this, the demos try to use more than one
2983 type of block and more than one block per block type.
2984
2985 The following table shows the current status of the demos:
2986
2987 || Name                         | Implemented | Tested   |
2988  | analog_passthrough           |     YES     |  SUCCESS |
2989  | analog_sinewave              |     YES     |  SUCCESS |
2990  | digital_passthrough          |     YES     |  SUCCESS |
2991  | echo_char                    |     YES     |  SUCCESS |
2992  | hbridge_analog_control       |     YES     |  SUCCESS |
2993  | hbridge_digital_control      |     YES     |  SUCCESS |
2994  | hbridge_sinewave_control     |     YES     |  SUCCESS |
2995  | hello_world                  |     YES     |  SUCCESS |
2996  | led_blink_all                |     YES     |  SUCCESS |
2997  | led_blink                    |     YES     |  SUCCESS |
2998  | log_analog_input             |     YES     |  SUCCESS |
2999  | power_toggle                 |     YES     |  SUCCESS |
3000
3001 In the reference below you can find a complete description for each of the demos.
3002
3003 == Subdirectory  content description ==[subdirectory__content_description]
3004
3005 %DONE
3006
3007 -> ``{demo}.slx``
3008
3009 A Simulink demo.
3010
3011 This subdirectory just includes all the Simulink demos described in the following section.
3012
3013 NEWPAGE
3014
3015 == Demos Reference ==[demos_reference]
3016
3017 %DONE
3018
3019 This section describes the demos implemented as part of this project that uses the Simulink RRP
3020 Block Library and generates code using the RPP Simulink Target.
3021
3022 === Analog pass-through ===[analog_pass_through]
3023
3024 %DONE
3025
3026 %tex% ''' \begin{figure}[H]\begin{center}
3027 [450-demo_analog_passthrough.png]
3028 %tex% ''' \caption{Analog Passthrough Simulink demo for RPP.}\end{center}\end{figure}
3029
3030 **Description:**
3031
3032 This demo will read analog input 1 and write it to analog output 1.
3033
3034 In laboratory the minimum read value for analog input a 0 volts is 107. The maximum read at 12
3035 volts is 2478. The map subsystem will map the input domain (AIN)``[110, 2400]`` to the output domain
3036 (AOUT)``[0, 4095]``.
3037
3038 NEWPAGE
3039
3040 === Analog sinewave ===[analog_sinewave]
3041
3042 %DONE
3043
3044 %tex% ''' \begin{figure}[H]\begin{center}
3045 [450-demo_analog_sinewave.png]
3046 %tex% ''' \caption{Analog Sinewave Simulink demo for RPP.}\end{center}\end{figure}
3047
3048 **Description:**
3049
3050 This demo will generate a sinewave on analog output 1. Siwave is 10Hz and sampling rate is set to
3051 1000Hz (driven from Simulink step of 1ms, same as operating system). Amplitude is set to use AOUT
3052 full range [0-4095] which means output amplitude will be [0-12] volts.
3053
3054 The Software oscilloscope shown should match an external one connected to AOUT 1.
3055
3056 Note that the driver configuration of the MCP4922 is set to unbuffered (which should eventually
3057 be changed to buffered) and thus the last resolution millivolts are lost.
3058
3059 NEWPAGE
3060
3061 === Digital pass-through ===[digital_pass_through]
3062
3063 %DONE
3064
3065 %tex% ''' \begin{figure}[H]\begin{center}
3066 [400-demo_digital_passthrough.png]
3067 %tex% ''' \caption{Digital Pass-through Simulink demo for RPP.}\end{center}\end{figure}
3068
3069 **Description:**
3070
3071 This demo will directly pass the digital values read on DIN [1-8] to LOUT [1-8], and thus acting
3072 as a digital pass-through or gateway.
3073
3074 Also note that all the ErrFlag are aggregated on a global ErrFlag.
3075
3076 NEWPAGE
3077
3078 === Echo char ===[echo_char]
3079
3080 %DONE
3081
3082 %tex% ''' \begin{figure}[H]\begin{center}
3083 [450-demo_echo_char.png]
3084 %tex% ''' \caption{Echo Character Simulink demo for RPP.}\end{center}\end{figure}
3085
3086 **Description:**
3087
3088 This demo will echo twice (print back) any character received through the Serial Communication
3089 Interface (9600-8-N-1).
3090
3091 Note that the send subsystem is implemented a as //triggered// subsystem and will execute only
3092 if data is received, that is, Serial Receive output is non-negative. Negative values are errors.
3093
3094 NEWPAGE
3095
3096 === H-bridge analog control ===[h_bridge_analog_control]
3097
3098 %DONE
3099
3100 %tex% ''' \begin{figure}[H]\begin{center}
3101 [450-demo_hbridge_analog_control.png]
3102 %tex% ''' \caption{H-Bridge Analog Control Simulink demo for RPP.}\end{center}\end{figure}
3103
3104 **Description:**
3105
3106 This demo will read values from the analog input, map them, and control the H-Bridge. This allows
3107 a motor connected to the H-Bridge to be controlled with a potentiometer connected to Analog Input 1.
3108
3109 Setting the potentiometer to output around 6 volts will stop the motor. Less (or greater) than 6
3110 volts will trigger the motor in one sense (or in the other sense) and speed proportional with 1%
3111 resolution.
3112
3113 In laboratory the minimum read value for analog input is 107 at 0 volts. The maximum read at 12 volts
3114 is 2478. The map subsystem will map the input domain (AIN)``[110, 2400]`` to the output domain
3115 (HBR)``[-1.0, 1.0]``.
3116
3117 NEWPAGE
3118
3119 === H-bridge digital control ===[h_bridge_digital_control]
3120
3121 %DONE
3122
3123 %tex% ''' \begin{figure}[H]\begin{center}
3124 [450-demo_hbridge_digital_control.png]
3125 %tex% ''' \caption{H-Bridge Digital Control Simulink demo for RPP.}\end{center}\end{figure}
3126
3127 **Description:**
3128
3129 This demo toggle the H-Bridge from stop to full speed in one direction using digital input 1.
3130 So basically is a ON/OFF switch on DIN 1 for a motor connected on the HBR. Note the data type
3131 conversion because the output of the DIN is a boolean and the input to the HBR is a double.
3132
3133 NEWPAGE
3134
3135 === H-bridge sine wave control ===[h_bridge_sine_wave_control]
3136
3137 %DONE
3138
3139 %tex% ''' \begin{figure}[H]\begin{center}
3140 [300-demo_hbridge_sinewave_control.png]
3141 %tex% ''' \caption{H-Bridge Sinewave Control Simulink demo for RPP.}\end{center}\end{figure}
3142
3143 **Description:**
3144
3145 This demo will generate a sine wave to control the H-Bridge. Sine wave is one period per 20
3146 seconds or 0.05Hz. Sampling rate is 20Hz or 100 samples per 1/4 of period (for 1% speed
3147 resolution change).
3148
3149 Note that the Software oscilloscope should is not the output of the H-Bridge, the H-Bridge will
3150 change current sense and the duty cycle of the pulse that drive it (PWM), it does not output
3151 analog values. The Software oscilloscope just shows what the input to the HBR block is.
3152
3153 NEWPAGE
3154
3155 === Hello world ===[hello_world]
3156
3157 %DONE
3158
3159 %tex% ''' \begin{figure}[H]\begin{center}
3160 [450-demo_hello_world.png]
3161 %tex% ''' \caption{Hello World Simulink demo for RPP.}\end{center}\end{figure}
3162
3163 **Description:**
3164
3165 This demo will print ``"Hello Simulink"`` to the Serial Communication Interface (9600-8-N-1) one
3166 character per second. The output speed is driven by the Simulink model step which is set to one
3167 second.
3168
3169 NEWPAGE
3170
3171 === LED blink ===[led_blink]
3172
3173 %DONE
3174
3175 %tex% ''' \begin{figure}[H]\begin{center}
3176 [450-demo_led_blink.png]
3177 %tex% ''' \caption{LED Blink Simulink demo for RPP.}\end{center}\end{figure}
3178
3179 **Description:**
3180
3181 This the simplest demo of all that shows the basics of using the RPP target and blocks. The
3182 goal of this demo is to show the configuration of the model (not shown on the picture above),
3183 that is, how the RPP Simulink Coder Target is setup, general model setup and step setup.
3184
3185 This demo will toggle each second a LED connected on LOUT 1. The timing is set by the Simulink
3186 model step which is set to 1 second.
3187
3188 NEWPAGE
3189
3190 === LED blink all ===[led_blink_all]
3191
3192 %DONE
3193
3194 %tex% ''' \begin{figure}[H]\begin{center}
3195 [350-demo_led_blink_all.png]
3196 %tex% ''' \caption{LED Blink All Simulink demo for RPP.}\end{center}\end{figure}
3197
3198 **Description:**
3199
3200 This demo will toggle all LEDs connected to the LOUT port. Even outputs pins will be negated.
3201 Toggle will happen each second. The timing is driven by Simulink model step configuration that
3202 is set to 1 second. All blocks ErrFlags are aggregated into one global ErrFlag.
3203
3204 NEWPAGE
3205
3206 === Log analog input ===[log_analog_input]
3207
3208 %DONE
3209
3210 %tex% ''' \begin{figure}[H]\begin{center}
3211 [450-demo_log_analog_input.png]
3212 %tex% ''' \caption{Log Analog Input Simulink demo for RPP.}\end{center}\end{figure}
3213
3214 **Description:**
3215
3216 This demo will log once per second the value read on the analog input 1. User can read the log
3217 using the SCI logging integrated command processor (9600-8-N-1). Logging block ID set to 1. The
3218 timing is driven by Simulink model step configuration that is set to 1 second.
3219
3220 NEWPAGE
3221
3222 === Power toggle ===[power_toggle]
3223
3224 %DONE
3225
3226 %tex% ''' \begin{figure}[H]\begin{center}
3227 [300-demo_power_toggle.png]
3228 %tex% ''' \caption{Power Toggle Simulink demo for RPP.}\end{center}\end{figure}
3229
3230 **Description:**
3231
3232 This demo will toggle the power output once per second. If an error is detected on at least one of
3233 the outputs a generic error message is printed to the serial line. The timing is driven by Simulink
3234 model step configuration that is set to 1 second. Power outputs can drive a load up to 2A, so please
3235 take into account required safety considerations.
3236
3237 NEWPAGE
3238
3239 = Glossary =[glossary]
3240
3241 %DONE
3242
3243 : ADC
3244   //Analog to Digital Converter.// @@
3245   Hardware circuitry that converts a continuous physical quantity (usually voltage) to a
3246   digital number that represents the quantity's amplitude.
3247
3248 : AIN
3249   //Analog Input.// @@
3250   Mnemonic to refer to or something related to the analog input (ADC) hardware module.
3251
3252 : AOUT
3253   //Analog Output.// @@
3254   Mnemonic to refer to or something related to the analog output (DAC) hardware module.
3255
3256 : CAN
3257   //Controller Area Network.// @@
3258   The CAN Bus is a vehicle bus standard designed to allow microcontrollers and devices to
3259   communicate with each other within a vehicle without a host computer.
3260   In this project it is also used as mnemonic to refer to or something related to the CAN
3261   hardware module.
3262
3263 : CGT
3264   //Code Generation Tools.// @@
3265   Name given to the tool set produced by Texas Instruments used to compile, link, optimize,
3266   assemble, archive, among others. In this project is normally used as synonym for
3267   ``Texas Instruments ARM compiler and linker."
3268
3269 : DAC
3270   //Digital to Analog Converter.// @@
3271   Hardware circuitry that converts a digital (usually binary) code to an analog signal
3272   (current, voltage, or electric charge).
3273
3274 : DIN
3275   //Digital Input.// @@
3276   Mnemonic to refer to or something related to the digital input hardware module.
3277
3278 : ECU
3279   //Engine Control Unit.// @@
3280   A type of electronic control unit that controls a series of actuators on an internal combustion
3281   engine to ensure the optimum running.
3282
3283 : ETH
3284   //Ethernet.// @@
3285   Mnemonic to refer to or something related to the Ethernet hardware module.
3286
3287 : FR
3288   //FlexRay.// @@
3289   FlexRay is an automotive network communications protocol developed to govern on-board automotive
3290   computing.
3291   In this project it is also used as mnemonic to refer to or something related to the FlexRay
3292   hardware module.
3293
3294 : GPIO
3295   //General Purpose Input/Output.// @@
3296   Generic pin on a chip whose behavior (including whether it is an input or output pin) can be
3297   controlled (programmed) by the user at run time.
3298
3299 : HBR
3300   //H-Bridge.// @@
3301   Mnemonic to refer to or something related to the H-Bridge hardware module. A H-Bridge is
3302   an electronic circuit that enables a voltage to be applied across a load in either direction.
3303
3304 : HOUT
3305   //High-Power Output.// @@
3306   Mnemonic to refer to or something related to the 10A, PWM, with current sensing, high-power
3307   output hardware module.
3308
3309 : IDE
3310   //Integrated Development Environment.// @@
3311   An IDE is a Software application that provides comprehensive facilities to computer programmers
3312   for software development.
3313
3314 : LCT
3315   //Legacy Code Tool.// @@
3316   Matlab tool that allows to generate source code for S-Functions given the descriptor of a C 
3317   function call.
3318
3319 : LIN
3320   //Local Interconnect Network.// @@
3321   The LIN is a serial network protocol used for communication between components in vehicles.
3322   In this project it is also used as mnemonic to refer to or something related to the LIN
3323   hardware module.
3324
3325 : LOUT
3326   //Logic Output.// @@
3327   Mnemonic to refer to or something related to the digital output hardware module.
3328   It is logic output (100mA), as opposed to power outputs (2A, 10A).
3329
3330 : MBD
3331   //Model-Based Design.// @@
3332   Model-Based Design (MBD) is a mathematical and visual method of addressing problems associated
3333   with designing complex control, signal processing and communication systems.
3334
3335 : MEX
3336   //Matlab Executable.// @@
3337   Type of binary executable that can be called within Matlab. In this document the common term
3338   used is `C MEX S-Function", which means Matlab executable written in C that implements a system
3339   function.
3340
3341 : MOUT
3342   //(Motor) Power Output.// @@
3343   Mnemonic to refer to or something related to the 2A push/pull power output hardware module.
3344
3345 : PWM
3346   //Pulse-width modulation.// @@
3347   Technique for getting analog results with digital means. Digital control is used to create a
3348   square wave, a signal switched between on and off. This on-off pattern can simulate voltages
3349   in between full on and off by changing the portion of the time the signal spends on versus
3350   the time that the signal spends off. The duration of ``on time" is called the pulse width or
3351   //duty cycle//.
3352
3353 : RPP
3354   //Rapid Prototyping Platform.// @@
3355   Name of the automotive hardware board. Also generic term to define something related
3356   to the board, like the RPP Library, RPP Layer, RPP API, etc.
3357
3358 : SCI
3359   //Serial Communication Interface.// @@
3360   Serial Interface for communication through hardware's UART using communication standard RS-232.
3361   In this project it is also used as mnemonic to refer to or something related to the Serial
3362   Communication Interface hardware module.
3363
3364 : SDC
3365   //SD-Card.// @@
3366   Mnemonic to refer to or something related to the SD-Card hardware module.
3367
3368 : SDR
3369   //SD-RAM.// @@
3370   Mnemonic to refer to or something related to the SD-RAM hardware module for logging.
3371
3372 : TLC
3373   //Target Language Compiler.// @@
3374   Technology and language used to generate code in Matlab/Simulink.
3375
3376 : UART
3377   //Universal Asynchronous Receiver/Transmitter.// @@
3378   Hardware circuitry that translates data between parallel and serial forms.
3379
3380
3381
3382 NEWPAGE
3383
3384 = References =[references]
3385
3386 %DONE
3387
3388 - Horn, M. (2013). //Software obsluhující periferie a flexray na automobilové rídicí jednotce//.
3389   (Unpublished master's thesis, Czech Technical University in Prague, Prague, Czech Republic).
3390
3391 - //Model-based design//. (n.d.). In Wikipedia. Retrieved March 10, 2013, from @@
3392   http://en.wikipedia.org/wiki/Model-based_design
3393
3394 - (2012). //ARM Assembly Language Tools//. Texas Instruments.
3395
3396 - (2012). //ARM Optimizing C/C++ Compiler//. Texas Instruments.
3397
3398 - (2013). //Embedded Coder - Reference//. MathWorks.
3399
3400 - (2013). //Embedded Coder - User's Guide//. MathWorks.
3401
3402 - Barry, R. (2009). //Using the FreeRTOS real time kernel - A practical guide//.
3403
3404 - (2013). //Simulink Coder - Reference//. MathWorks.
3405
3406 - (2013). //Simulink - Target Language Compiler//. MathWorks.
3407
3408 - (2013). //Simulink Coder - User's Guide//. MathWorks.
3409
3410 - (2013). //Simulink - Developing S-Functions//. MathWorks.
3411
3412 - (2012). //TMS570LS31x/21x 16/32-Bit RISC Flash Microcontroller - Technical Reference Manual//.
3413   Texas Instruments.
3414
3415
3416 NEWPAGE
3417
3418 = Appendix A: Notes on FreeRTOS memory management =[appendix_a_notes_on_freertos_memory_management]
3419
3420 %DONE
3421
3422 FreeRTOS provides 4 different (at the time of this writing) memory management implementations.
3423 On vanilla distribution of FreeRTOS these can be found in
3424 ``<FreeRTOSRoot>/FreeRTOS/Source/portable/MemMang`` with the names ``heap_1.c``, ``heap_2.c``,
3425 ``heap_3.c`` and ``heap_4.c``. The user is supposed to choose one and rename it to ``heap.c``
3426 and include it in the port for the target processor. Memory management implementation of each file
3427 is explained in depth in:
3428
3429         [Memory Management http://www.freertos.org/a00111.html]
3430
3431 The above is a must read documentation. In summary:
3432
3433 -> ``heap_1.c``
3434
3435 - Use a static allocated array for memory and thus will be placed on the ``.bss`` section.
3436 - Subdivides the array into smaller blocks as RAM is requested.
3437 - Memory cannot be freed.
3438 - Array is as large as ``configTOTAL_HEAP_SIZE`` option in ``FreeRTOSConfig.h``.
3439
3440
3441 -> ``heap_2.c``
3442
3443 - Use a static allocated array for memory and thus will be placed on the ``.bss`` section.
3444 - Uses a best fit algorithm and allows previously allocated blocks to be freed.
3445 - It does **not** however combine adjacent free blocks into a single large block.
3446 - Array is as large as ``configTOTAL_HEAP_SIZE`` option in ``FreeRTOSConfig.h``.
3447
3448
3449 -> ``heap_3.c``
3450
3451 - Wrapper around standard C library ``malloc()`` and ``free()``.
3452 - Wrapper makes ``malloc()`` and ``free()`` functions thread safe.
3453 - Memory is as large as defined in linker for C system heap.
3454 - ``configTOTAL_HEAP_SIZE`` option in ``FreeRTOSConfig.h`` is ignored.
3455
3456
3457 -> ``heap_4.c``
3458
3459 - Use a static allocated array for memory and thus will be placed on the ``.bss`` section.
3460 - Uses a first fit algorithm.
3461 - It **does** combine adjacent free memory blocks into a single large block (it does include a
3462   coalescence algorithm).
3463 - Array is as large as ``configTOTAL_HEAP_SIZE`` option in ``FreeRTOSConfig.h``.
3464
3465
3466 Not all kernels available for the RPP C Library use the same implementation. This is what each
3467 kernel is currently configured to use:
3468
3469 ||        Kernel |               Origin                |  Implementation  |
3470  |   6.0.4 Posix |    Simulator from OpenPilot.org     |   ``heap_3.c``   |
3471  |  7.0.2 TMS570 |              HalCoGen               |   ``heap_1.c``   |
3472  |  7.4.0 TMS570 |              HalCoGen               |   ``heap_4.c``   |
3473  |  7.4.2 TMS570 |  Adapted from vanilla distribution  |   ``heap_4.c``   |
3474
3475 The relevant implications of this are:
3476
3477 - If a kernel with ``heap_3.c`` is used the Simulink model //C system heap size// and
3478   //Model step task stack size// should be tightly related and the first should be large enough to
3479   allocate system tasks and the stack for the stepping task.
3480
3481 - If a kernel with ``heap_1.c`` is used the programs should not delete tasks, queues or semaphores.
3482   If the application spawn and deletes tasks it will eventually deplete the memory available. This
3483   is the case with the //rpp-test-suite//. Note that failure to allocated memory from the array
3484   will trigger the //Malloc Failed Hook Function// ``vApplicationMallocFailedHook()``, even if the
3485   implementation doesn't use the C system ``malloc()`` function. @@
3486   Also, //Model step task stack size// should never be set larger than ``configTOTAL_HEAP_SIZE``
3487   option in ``FreeRTOSConfig.h``. Currently the RPP Target doesn't include a GUI option for setting
3488   ``configTOTAL_HEAP_SIZE`` because the library is statically linked and thus memory will be of the
3489   size specified when built. The RPP Target **doesn't** check that the requested memory for the
3490   step task is less than the ``configTOTAL_HEAP_SIZE``, and if greater then the application will
3491   fail at runtime and trigger the //Malloc Failed Hook Function//.
3492
3493
3494 NEWPAGE
3495
3496 = Appendix B: Known operating-system dependent files =[appendix_b_known_operating_system_dependent_files]
3497
3498 %DONE
3499
3500 This project was developed on a GNU/Linux operating system. No test for cross-platform
3501 interoperability was performed on the code developed. Although care was taken to try to provide
3502 platform independent code and tools this are the elements that are know to be Linux dependent:
3503
3504 - LCM1 hardware control tool ``lmc1.py``. @@
3505   This tool is both GUI and command line capable, the following just affects the GUI part. @@
3506   Command line should be usable under Windows systems.
3507
3508   __Cause__: Serial port search algorithm is Linux dependent and Gtk 3.0 dynamic Python bindings
3509              are not yet available on other operating systems.
3510
3511 - TI CGT support file for RPP Simulink Target ``target_tools.mk``.
3512
3513   __Cause__: Use UNIX path separator ``/``.
3514
3515 - Simulink RPP Target download script ``rpp_download.m``.
3516
3517   __Cause__: Use UNIX path separator ``/``.
3518
3519 - Simulink RPP Target install script ``rpp_setup.m``.
3520
3521   __Cause__: Use UNIX path separator ``/``.
3522
3523 - Simulink RPP Block Library block compilation script ``compile_blocks.m``.
3524
3525   __Cause__: Call Matlab MEX executable with Unix name.
3526
3527 - All CCS projects under ``<repo>/rpp/lib/apps/``.
3528   __Cause__: Paths are configure using UNIX path separator ``/``.
3529
3530
3531