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 file processing to generate a "main" file.
27 %function FcnSingleTaskingMain() void
29 %if GenerateSampleERTMain
30 %assign CompiledModel.GenerateSampleERTMain = TLC_FALSE
33 %assign cFile = LibCreateSourceFile("Source", "Custom", "ert_main")
37 %<LibSetSourceFileSection(cFile, "Includes", tmpBuf)>
40 #define STEP_SIZE_MILLIS (%<CompiledModel.FundamentalStepSize>*1000)
41 #define CONTROL_PRIORITY 2
42 #define WORKING_PRIORITY 1
44 /* Standard includes */
53 #include "sys_common.h"
56 /* Library includes */
57 // FIXME: Implement conditional #include's
58 %% IF GIO (General Input/Outputs)
59 %% IF HOUT (PWM outputs)
60 %% IF MOUT (Motor outputs)
61 %% IF ADC (Analog to Digital Converter)
62 %% IF SCI (Serial Communication Interface)
67 #include "%<LibGetMdlPubHdrBaseName()>.h"
70 %<LibSetSourceFileSection(cFile, "Declarations", tmpBuf)>
73 bool SHUTDOWN = false;
74 xSemaphoreHandle step_signal = NULL;
77 %<LibSetSourceFileSection(cFile, "Functions", tmpBuf)>
80 void control_task(void *p) {
82 const portTickType freq_ticks = STEP_SIZE_MILLIS / portTICK_RATE_MS;
83 portTickType last_wake_time = xTaskGetTickCount();
87 // Wait until next step
88 vTaskDelayUntil(&last_wake_time, freq_ticks);
92 // FIXME: Call overrun routine
95 xSemaphoreGive(step_signal);
100 /* In case of shutdown, delete this task */
104 void working_task(void *p) {
109 if(xSemaphoreTake(step_signal, portMAX_DELAY)) {
111 %<LibCallModelStep(0)>\
116 /* In case of shutdown, delete this task */
124 /* Initialize peripherals */
125 // FIXME: Implement conditional init()'s
128 /* Initialize model */
129 %<LibCallModelInitialize()>\
131 /* Create and lock semaphore */
132 vSemaphoreCreateBinary(step_signal);
133 xSemaphoreTake(step_signal, 0);
135 /* Create tasks to step model and start scheduler */
136 // FIXME: How to calculate / policy about model stack size
137 xTaskCreate(control_task, (signed char*) "control_task", 128, NULL,
138 CONTROL_PRIORITY, NULL);
139 xTaskCreate(working_task, (signed char*) "working_task", 4096, NULL,
140 WORKING_PRIORITY, NULL);
141 vTaskStartScheduler();
143 // We should never get here
144 %<LibCallModelTerminate()>\