1 %% Copyright (C) 2013 Czech Technical University in Prague
4 %% - Carlos Jenkins <carlos@jenkins.co.cr>
6 %% This program is free software; you can redistribute it and/or modify
7 %% it under the terms of the GNU General Public License as published by
8 %% the Free Software Foundation; either version 2 of the License, or
9 %% (at your option) any later version.
11 %% This program is distributed in the hope that it will be useful,
12 %% but WITHOUT ANY WARRANTY; without even the implied warranty of
13 %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 %% GNU General Public License for more details.
16 %% You should have received a copy of the GNU General Public License
17 %% along with this program. If not, see <http://www.gnu.org/licenses/>.
19 %% File : rpp_srmain.tlc
21 %% Custom TLC file to generate a "main" file.
23 %% This file generated the "main" file for the RPP target on top of the RPP
24 %% library and the FreeRTOS operating system.
27 %% Example in <matlabroot>/rtw/c/tlc/mw/bareboard_srmain.tlc
32 %function FcnSingleTaskingMain() void
34 %if GenerateSampleERTMain
35 %assign CompiledModel.GenerateSampleERTMain = TLC_FALSE
39 %assign cFile = LibCreateSourceFile("Source", "Custom", "ert_main")
45 /* Standard includes */
54 #include "%<LibGetMdlPubHdrBaseName()>.h"
57 %<LibSetSourceFileSection(cFile, "Includes", tmpBuf)>
64 #define STEP_SIZE_MILLIS (%<CompiledModel.FundamentalStepSize>*1000.0)
65 #define CONTROL_PRIORITY 2
66 #define WORKING_PRIORITY 1
69 %<LibSetSourceFileSection(cFile, "Defines", tmpBuf)>
77 bool SHUTDOWN = false;
78 xSemaphoreHandle step_signal = NULL;
81 %<LibSetSourceFileSection(cFile, "Declarations", tmpBuf)>
89 * Model step control and overrun detection task.
91 void control_task(void *p) {
93 static const portTickType freq_ticks = STEP_SIZE_MILLIS / portTICK_RATE_MS;
94 portTickType last_wake_time = xTaskGetTickCount();
98 /* Wait until next step */
99 vTaskDelayUntil(&last_wake_time, freq_ticks);
102 /* Overrun detected */
103 %<LibSetRTModelErrorStatus("\"Overrun\"")>;
104 /* FIXME: Call overrun routine */
106 /* Release semaphore */
107 xSemaphoreGive(step_signal);
112 /* In case of shutdown, delete this task */
117 * Model step logic execution task.
119 void working_task(void *p) {
124 if(xSemaphoreTake(step_signal, portMAX_DELAY)) {
126 %<LibCallModelStep(0)>\
131 /* In case of shutdown, delete this task */
137 * Hardware initialization, task spawning and OS scheduler start.
141 /* Initialize model */
142 %<LibCallModelInitialize()>\
144 /* Create and lock semaphore */
145 vSemaphoreCreateBinary(step_signal);
146 xSemaphoreTake(step_signal, 0);
148 /* Create tasks to step model and start scheduler */
149 xTaskCreate(control_task, (signed char*) "control_task", 128, NULL,
150 CONTROL_PRIORITY, NULL);
151 xTaskCreate(working_task, (signed char*) "working_task", %<rppModelTaskStack>, NULL,
152 WORKING_PRIORITY, NULL);
153 vTaskStartScheduler();
155 /* We should never get here */
156 %<LibCallModelTerminate()>\
163 * FreeRTOS malloc() failed hook.
165 void vApplicationMallocFailedHook(void) {
167 rpp_sci_printf((const char*)"<malloc() failed>\r\n");
172 * FreeRTOS stack overflow hook.
174 void vApplicationStackOverflowHook(xTaskHandle xTask,
175 signed portCHAR *pcTaskName) {
177 rpp_sci_printf((const char*)"<stack overflow : \"%s\">\r\n", pcTaskName);
182 %<LibSetSourceFileSection(cFile, "Functions", tmpBuf)>