1 %% Copyright (C) 2013-2015 Czech Technical University in Prague
4 %% - Carlos Jenkins <carlos@jenkins.co.cr>
5 %% - Michal Sojka <sojkam1@fel.cvut.cz>
7 %% This document contains proprietary information belonging to Czech
8 %% Technical University in Prague. Passing on and copying of this
9 %% document, and communication of its contents is not permitted
10 %% without prior written authorization.
12 %% File : rpp_mrmain.tlc
14 %% Custom TLC file to generate an RPP "main" file.
16 %% This file generates the "main" file for the RPP target on top of the RPP
17 %% library and the FreeRTOS operating system.
19 %% The mr prefix is standard to mark Multi Tasking main, which is the case. See
20 %% rpp_file_process.m description above for more information about this.
22 %% !!!!!!!!!!!!!!!!!!!!!!!!
23 %% !!! This is not ready to use source code. It is just a concept with some ideas
24 %% !!! from our experiments and has to be reworked.
25 %% !!!!!!!!!!!!!!!!!!!!!!!!
27 %% Example in <matlabroot>/rtw/c/tlc/mw/bareboard_mrmain.tlc
32 %function FcnMultiTaskingMain() void
34 %if GenerateSampleERTMain
35 %assign CompiledModel.GenerateSampleERTMain = TLC_FALSE
39 %assign cFile = LibCreateSourceFile("Source", "Custom", "ert_main")
46 #include "%<LibGetMdlPubHdrBaseName()>.h"
48 /* RPP runtime includes */
49 #include "rpp_simulink_runtime.h"
52 /* External mode header file */
58 %<LibSetSourceFileSection(cFile, "Includes", tmpBuf)>
66 #define STEP_SIZE_MILLIS %<CompiledModel.FundamentalStepSize>*1000.0
67 #define CONTROL_PRIORITY 3
68 #define WORKING_PRIORITY 2
69 #define EXTMODE_PRIORITY 1
72 %<LibSetSourceFileSection(cFile, "Defines", tmpBuf)>
79 static boolean_t working = FALSE;
80 static xSemaphoreHandle step_signal = NULL;
81 static xSemaphoreHandle initialized_signal = NULL;
83 static xSemaphoreHandle ext_mode_ready = NULL;
85 static uint32_t steps_control = 0;
86 static uint32_t steps_working = 0;
87 boolean_t overrun_flag = FALSE;
90 %<LibSetSourceFileSection(cFile, "Declarations", tmpBuf)>
98 * Model step control and overrun detection task.
100 void control_task(void* p)
103 xSemaphoreTake(initialized_signal, portMAX_DELAY);
105 xSemaphoreTake(ext_mode_ready, portMAX_DELAY);
108 static const portTickType freq_ticks = STEP_SIZE_MILLIS / portTICK_RATE_MS;
109 portTickType last_wake_time = xTaskGetTickCount();
111 %% This condition has been added because of the warning:
112 %% "ert_main.c", line 46: warning #238-D: controlling expression is constant
113 %% caused by the expression (void*) 0 passed to the while statement. The rtmGetStopRequested
114 %% macro is defined to this constant if and only if the GenerateSampleERTMain is not set. So
115 %% The condition is not needed in this case as well.
117 %% See <MATLAB_ROOT>/rtw/c/tlc/mw/rtmspecmacs.tlc at line 198.
119 %if !GenerateSampleERTMain
120 while (rtmGetErrorStatus(%<modelName>_M) == NULL) {
122 while (rtmGetErrorStatus(%<modelName>_M) == NULL && !rtmGetStopRequested(%<modelName>_M)) {
124 /* Wait until next step */
125 vTaskDelayUntil(&last_wake_time, freq_ticks);
128 /* Overrun detected */
131 overrun_flag = FALSE;
132 /* Release semaphore */
133 xSemaphoreGive(step_signal);
138 rtExtModeCheckEndTrigger();
143 /* In case of shutdown, delete this task */
148 * Model step logic execution task.
150 void working_task(void* p)
152 %% This idea might be useful in the MR implementation
153 %if LibNumSynchronousSampleTimes() > 1
154 static int_T taskCounter[%<FcnNumST()>] = %<FcnInitializeTaskCounter()>;
157 /* Initialize model */
158 %<LibCallModelInitialize()>\
159 /* Step the model for any subrate */
160 xSemaphoreGive(initialized_signal);
163 if (xSemaphoreTake(step_signal, portMAX_DELAY)) {
166 %<LibCallModelStep(0)>\
168 %% This idea might be useful in the MR implementation
170 %if LibNumSynchronousSampleTimes() > 1
171 %foreach idx = LibGetNumSyncPeriodicTasks() - 1
172 %assign tid = 1 + idx + tid01Eq
173 /* Task %<tid> handling */
174 if (taskCounter[%<tid>] == 0) {
175 %<LibCallModelStep(tid)>\
177 if (++taskCounter[%<tid>] == %< FcnComputeTaskTickLimit(tid)>)
178 taskCounter[%<tid>]=0;
189 %% /* In case of shutdown, delete this task */
190 %% vTaskDelete(NULL);
194 void ext_mode_comm_task(void* p)
196 drv_sci_set_crlf_conv_en(FALSE); /* Disable CR->CRLF conversion */
198 %<SLibGenERTExtModeInit()>
199 xSemaphoreGive(ext_mode_ready);
201 while (rtmGetErrorStatus(%<modelName>_M) == NULL && !rtmGetStopRequested(%<modelName>_M)) {
202 rtExtModeOneStep(rtmGetRTWExtModeInfo(%<modelName>_M), %<numSampleTimes>, (boolean_T *)&rtmGetStopRequested(%<modelName>_M));
204 rtExtModeShutdown(%<numSampleTimes>);
205 /* In case of shutdown, delete this task */
211 * Hardware initialization, task spawning and OS scheduler start.
215 /* Initialize RPP board */
216 %if EXISTS(::rpp_ain_present)
219 %if EXISTS(::rpp_din_present) || EXISTS(::rpp_dout_present)
220 rpp_gio_init(RPP_GIO_PORT_ALL);
225 rpp_sci_setup(115200);
228 %assign model_info = SPRINTF("'%s' - %s (TLC %s)\\r\\n", LibGetMdlPubHdrBaseName(), TLC_TIME, TLC_VERSION)
229 rpp_sci_printk("%<model_info>");
232 /* Create and lock semaphore */
233 vSemaphoreCreateBinary(step_signal);
234 xSemaphoreTake(step_signal, 0);
235 vSemaphoreCreateBinary(initialized_signal);
236 xSemaphoreTake(initialized_signal, 0);
238 vSemaphoreCreateBinary(ext_mode_ready);
239 xSemaphoreTake(ext_mode_ready, 0);
242 /* Create tasks to step model and model task */
243 if (xTaskCreate(control_task, "control_task",
244 configMINIMAL_STACK_SIZE, NULL, CONTROL_PRIORITY, NULL) != pdPASS) {
245 rpp_sci_printk("ERROR: Cannot spawn control task.\r\n");
248 if (xTaskCreate(working_task, "working_task",
249 %<rppModelTaskStack>, NULL, WORKING_PRIORITY, NULL) != pdPASS) {
250 rpp_sci_printk("ERROR: Cannot spawn model task.\r\n"
256 rtParseArgsForExtMode(0, NULL);
258 if (xTaskCreate(ext_mode_comm_task, "ext_mode_comm_task", 1024, NULL, EXTMODE_PRIORITY, NULL) != pdPASS) {
259 rpp_sci_printk("ERROR: Cannot spawn model task.\r\n");
264 /* Start FreeRTOS Scheduler */
265 vTaskStartScheduler();
267 /* We should never get here */
268 %<LibCallModelTerminate()>
269 rpp_sci_printk("ERROR: Problem allocating memory for idle task.\r\n");
273 #if configUSE_MALLOC_FAILED_HOOK == 1
275 * FreeRTOS malloc() failed hook.
277 void vApplicationMallocFailedHook(void) {
278 rpp_sci_printk("ERROR: Memory allocation failed.\r\n");
283 #if configCHECK_FOR_STACK_OVERFLOW > 0
285 * FreeRTOS stack overflow hook.
287 void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR *pcTaskName)
289 rpp_sci_printk("ERROR: Stack overflow : \"%s\".\r\n", pcTaskName);
294 %<LibSetSourceFileSection(cFile, "Functions", tmpBuf)>