-%% Copyright (C) 2013-2014 Czech Technical University in Prague
+%% Copyright (C) 2013-2015 Czech Technical University in Prague
%%
%% Authors:
%% - Carlos Jenkins <carlos@jenkins.co.cr>
%% This file generates the "main" file for the RPP target on top of the RPP
%% library and the FreeRTOS operating system.
%%
+%% The sr prefix is standard to mark Single Tasking main, which is the case. See
+%% rpp_file_process.m description above for more information about this.
+%%
%% References:
%% Example in <matlabroot>/rtw/c/tlc/mw/bareboard_srmain.tlc
%%%%%%%%
%openfile tmpBuf
- /* RPP includes */
- #include "rpp/rpp.h"
-
/* Model includes */
#include "%<LibGetMdlPubHdrBaseName()>.h"
+ /* RPP runtime includes */
+ #include "rpp_simulink_runtime.h"
+
%if extMode == 1
/* External mode header file */
#include "ext_work.h"
%openfile tmpBuf
/* Definitions */
- #define STEP_SIZE_MILLIS %<CompiledModel.FundamentalStepSize>*1000.0
+ #define STEP_SIZE_MILLIS (%<CompiledModel.FundamentalStepSize>*1000.0)
#define CONTROL_PRIORITY 3
#define WORKING_PRIORITY 2
#define EXTMODE_PRIORITY 1
%%%%%%%%
%openfile tmpBuf
- static boolean_t WORKING = FALSE;
+ static boolean_t working = FALSE;
static xSemaphoreHandle step_signal = NULL;
static xSemaphoreHandle initialized_signal = NULL;
%if extMode == 1
%endif
static uint32_t steps_control = 0;
static uint32_t steps_working = 0;
+ boolean_t overrun_flag = FALSE;
%closefile tmpBuf
%<LibSetSourceFileSection(cFile, "Declarations", tmpBuf)>
static const portTickType freq_ticks = STEP_SIZE_MILLIS / portTICK_RATE_MS;
portTickType last_wake_time = xTaskGetTickCount();
- while(rtmGetErrorStatus(%<modelName>_M) == NULL && !rtmGetStopRequested(%<modelName>_M)) {
-
+ %% This condition has been added because of the warning:
+ %% "ert_main.c", line 46: warning #238-D: controlling expression is constant
+ %% caused by the expression (void*) 0 passed to the while statement. The rtmGetStopRequested
+ %% macro is defined to this constant if and only if the GenerateSampleERTMain is not set. So
+ %% The condition is not needed in this case as well.
+ %%
+ %% See <MATLAB_ROOT>/rtw/c/tlc/mw/rtmspecmacs.tlc at line 198.
+
+ %if !GenerateSampleERTMain
+ while (rtmGetErrorStatus(%<modelName>_M) == NULL) {
+ %else
+ while (rtmGetErrorStatus(%<modelName>_M) == NULL && !rtmGetStopRequested(%<modelName>_M)) {
+ %endif
/* Wait until next step */
vTaskDelayUntil(&last_wake_time, freq_ticks);
- if(WORKING) {
+ if (working) {
/* Overrun detected */
- %<LibSetRTModelErrorStatus("\"Overrun\"")>;
- /* FIXME: Call overrun routine or set some overrun flag. */
+ overrun_flag = TRUE;
} else {
/* Release semaphore */
xSemaphoreGive(step_signal);
{
/* Initialize model */
%<LibCallModelInitialize()>\
-
+ /* Step the model for any subrate */
xSemaphoreGive(initialized_signal);
while (1) {
-
- /* Lock semaphore */
- if(xSemaphoreTake(step_signal, portMAX_DELAY)) {
- WORKING = TRUE;
+ if (xSemaphoreTake(step_signal, portMAX_DELAY)) {
+ working = TRUE;
%<LibCallModelStep(0)>\
steps_working++;
- WORKING = FALSE;
+ working = FALSE;
}
}
- /* In case of shutdown, delete this task */
- vTaskDelete(NULL);
+ %% /* In case of shutdown, delete this task */
+ %% vTaskDelete(NULL);
}
%if extMode == 1
%<SLibGenERTExtModeInit()>
xSemaphoreGive(ext_mode_ready);
- while(rtmGetErrorStatus(%<modelName>_M) == NULL && !rtmGetStopRequested(%<modelName>_M)) {
+ while (rtmGetErrorStatus(%<modelName>_M) == NULL && !rtmGetStopRequested(%<modelName>_M)) {
rtExtModeOneStep(rtmGetRTWExtModeInfo(%<modelName>_M), %<numSampleTimes>, (boolean_T *)&rtmGetStopRequested(%<modelName>_M));
}
rtExtModeShutdown(%<numSampleTimes>);
void main(void)
{
/* Initialize RPP board */
- rpp_init();
+ %if EXISTS(::rpp_ain_present)
+ rpp_adc_init();
+ %endif
+ %if EXISTS(::rpp_aout_present)
+ rpp_dac_init();
+ %endif
+ %if EXISTS(::rpp_din_present)
+ rpp_din_init();
+ %endif
+ %if EXISTS(::rpp_hbr_present)
+ rpp_hbr_init();
+ %endif
+ %if EXISTS(::rpp_irc_present)
+ rpp_irc_init();
+ %endif
+ %if EXISTS(::rpp_lout_present)
+ rpp_lout_init();
+ %endif
+ %if EXISTS(::rpp_mout_present)
+ rpp_mout_init();
+ %endif
+ %if EXISTS(::rpp_sdr_present)
+ rpp_sdr_init();
+ %endif
+ %if EXISTS(::rpp_gio_in_present) || EXISTS(::rpp_gio_out_present)
+ rpp_gio_init(RPP_GIO_PORT_ALL);
+ %endif
+ rpp_sci_init();
// Speed up the SCI
rpp_sci_setup(115200);
%if rppPrintMeta
%assign model_info = SPRINTF("'%s' - %s (TLC %s)\\r\\n", LibGetMdlPubHdrBaseName(), TLC_TIME, TLC_VERSION)
- rpp_sci_printf((const char*)
- "%<model_info>"
- );
+ rpp_sci_printk("%<model_info>");
%endif
/* Create and lock semaphore */
%endif
/* Create tasks to step model and model task */
- if(xTaskCreate(control_task, (const signed char*)"control_task",
+ if (xTaskCreate(control_task, "control_task",
configMINIMAL_STACK_SIZE, NULL, CONTROL_PRIORITY, NULL) != pdPASS) {
- #ifdef DEBUG
- rpp_sci_printf((const char*)
- "ERROR: Cannot spawn control task.\r\n"
- );
- #endif
- while(TRUE) {
- asm("nop");
- }
+ rpp_sci_printk("ERROR: Cannot spawn control task.\r\n");
+ return;
}
- if(xTaskCreate(working_task, (const signed char*)"working_task",
+ if (xTaskCreate(working_task, "working_task",
%<rppModelTaskStack>, NULL, WORKING_PRIORITY, NULL) != pdPASS) {
- #ifdef DEBUG
- rpp_sci_printf((const char*)
- "ERROR: Cannot spawn model task.\r\n"
+ rpp_sci_printk("ERROR: Cannot spawn model task.\r\n"
);
- #endif
- while(TRUE) {
- asm(" nop");
- }
+ return;
}
%if extMode == 1
/* External mode */
if (xTaskCreate(ext_mode_comm_task, "ext_mode_comm_task", 1024, NULL, EXTMODE_PRIORITY, NULL) != pdPASS) {
rpp_sci_printk("ERROR: Cannot spawn model task.\r\n");
- while (1);
+ return;
}
%endif
vTaskStartScheduler();
/* We should never get here */
- %<LibCallModelTerminate()>\
- #ifdef DEBUG
- rpp_sci_printf((const char*)
- "ERROR: Problem allocating memory for idle task.\r\n"
- );
- #endif
- while(TRUE) {
- asm(" nop");
- }
+ %<LibCallModelTerminate()>
+ rpp_sci_printk("ERROR: Problem allocating memory for idle task.\r\n");
}
/**
* FreeRTOS malloc() failed hook.
*/
- void vApplicationMallocFailedHook(void) {
- #ifdef DEBUG
- rpp_sci_printf((const char*)
- "ERROR: Memory allocation failed.\r\n"
- );
- #endif
- }
+ void vApplicationMallocFailedHook(void) {
+ rpp_sci_printk("ERROR: Memory allocation failed.\r\n");
+ }
#endif
/**
* FreeRTOS stack overflow hook.
*/
- void vApplicationStackOverflowHook(xTaskHandle xTask,
- signed portCHAR *pcTaskName) {
- #ifdef DEBUG
- rpp_sci_printf((const char*)
- "ERROR: Stack overflow : \"%s\".\r\n", pcTaskName
- );
- #endif
+ void vApplicationStackOverflowHook(xTaskHandle xTask, signed portCHAR *pcTaskName)
+ {
+ rpp_sci_printk("ERROR: Stack overflow : \"%s\".\r\n", pcTaskName);
}
#endif