diff --git a/meson.build b/meson.build
index 7b27c380..318abd5b 100644
--- a/meson.build
+++ b/meson.build
@@ -79,6 +79,7 @@ endif
## TYT MD380
md380_src = src + ['openrtx/src/main.c',
+ 'openrtx/src/bootstrap.c',
'platform/mcu/STM32F4xx/boot/startup.c',
'platform/mcu/STM32F4xx/boot/libc_integration.c',
'platform/mcu/STM32F4xx/drivers/usb/usb_bsp.c',
diff --git a/openrtx/src/bootstrap.c b/openrtx/src/bootstrap.c
new file mode 100644
index 00000000..83b48581
--- /dev/null
+++ b/openrtx/src/bootstrap.c
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * Copyright (C) 2020 by Federico Izzo IU2NUO, Niccolò Izzo IU2KIN and *
+ * Silvano Seva IU2KWO *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, see *
+ ***************************************************************************/
+
+#include
+#include
+#include
+#include
+#include "stm32f4xx.h"
+#include "platform.h"
+#include "gpio.h"
+
+/*
+ * Entry point for application code, not in this translation unit.
+ */
+int main(int argc, char *argv[]);
+
+/*
+ * OS startup task, will call main() when all initialisations are done.
+ */
+static OS_TCB startTCB;
+static CPU_STK_SIZE startStk[APP_CFG_TASK_START_STK_SIZE];
+static void startTask(void *arg);
+
+void systemBootstrap()
+{
+ OS_ERR err;
+
+ OSInit(&err);
+
+ OSTaskCreate((OS_TCB *)&startTCB,
+ (CPU_CHAR *)" ",
+ (OS_TASK_PTR ) startTask,
+ (void *) 0,
+ (OS_PRIO ) APP_CFG_TASK_START_PRIO,
+ (CPU_STK *)&startStk[0],
+ (CPU_STK )startStk[APP_CFG_TASK_START_STK_SIZE / 10u],
+ (CPU_STK_SIZE) APP_CFG_TASK_START_STK_SIZE,
+ (OS_MSG_QTY ) 0,
+ (OS_TICK ) 0,
+ (void *) 0,
+ (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
+ (OS_ERR *)&err);
+
+ OSStart(&err);
+
+ for(;;) ;
+}
+
+static void startTask(void* arg)
+{
+ (void) arg;
+
+ CPU_Init();
+
+ /* SysTick is available only for ARM-based targets */
+ #ifdef __arm__
+ OS_CPU_SysTickInitFreq(SystemCoreClock);
+ #endif
+
+ /* Initialise platform drivers */
+ platform_init();
+
+ /* Jump to application code */
+ main(0, NULL);
+
+ /* If main returns loop indefinitely */
+ for(;;) ;
+}
diff --git a/openrtx/src/main.c b/openrtx/src/main.c
index f4bddf87..c1e2b22d 100644
--- a/openrtx/src/main.c
+++ b/openrtx/src/main.c
@@ -19,93 +19,29 @@
#include
#include
#include
-#include
#include
-#include
-#include
#include "gpio.h"
-#include "delays.h"
-#include "display.h"
#include "graphics.h"
-
-static OS_TCB startTCB;
-static CPU_STK_SIZE startStk[APP_CFG_TASK_START_STK_SIZE];
-static void startTask(void *arg);
-
-static OS_TCB uiTaskTCB;
-static CPU_STK_SIZE uiTaskStk[128];
-static void uiTask(void *arg);
+#include "hwconfig.h"
+#include "platform.h"
int main(void)
{
- OS_ERR err;
-
- OSInit(&err);
-
- OSTaskCreate((OS_TCB *)&startTCB,
- (CPU_CHAR *)" ",
- (OS_TASK_PTR ) startTask,
- (void *) 0,
- (OS_PRIO ) APP_CFG_TASK_START_PRIO,
- (CPU_STK *)&startStk[0],
- (CPU_STK )startStk[APP_CFG_TASK_START_STK_SIZE / 10u],
- (CPU_STK_SIZE) APP_CFG_TASK_START_STK_SIZE,
- (OS_MSG_QTY ) 0,
- (OS_TICK ) 0,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- OSStart(&err);
-
- for(;;) ;
- return 0;
-}
-
-static void startTask(void* arg)
-{
-
- (void) arg;
- OS_ERR err;
-
gpio_setMode(GPIOE, 0, OUTPUT);
gpio_setMode(GPIOE, 1, OUTPUT);
- CPU_Init();
- OS_CPU_SysTickInitFreq(SystemCoreClock);
-
- OSTaskCreate((OS_TCB *)&uiTaskTCB,
- (CPU_CHAR *)" ",
- (OS_TASK_PTR ) uiTask,
- (void *) 0,
- (OS_PRIO ) 5,
- (CPU_STK *)&uiTaskStk[0],
- (CPU_STK ) 0,
- (CPU_STK_SIZE) 128,
- (OS_MSG_QTY ) 0,
- (OS_TICK ) 0,
- (void *) 0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- while(1) ;
-}
-
-static void uiTask(void *arg)
-{
- (void) arg;
- OS_ERR os_err;
-
// Init the graphic stack
gfx_init();
- gfx_setBacklightLevel(255);
+ platform_setBacklightLevel(255);
point_t origin = {0, SCREEN_HEIGHT / 2};
color_t color_yellow = {250, 180, 19};
char *buffer = "OpenRTX";
+ OS_ERR os_err;
+
// Task infinite loop
- while(DEF_ON)
+ while(1)
{
gfx_clearScreen();
gfx_print(origin, buffer, FONT_SIZE_4, TEXT_ALIGN_CENTER, color_yellow);
diff --git a/platform/mcu/STM32F4xx/boot/startup.c b/platform/mcu/STM32F4xx/boot/startup.c
index c03cdffa..801b4bd9 100644
--- a/platform/mcu/STM32F4xx/boot/startup.c
+++ b/platform/mcu/STM32F4xx/boot/startup.c
@@ -22,8 +22,8 @@
#include "stm32f4xx.h"
#include "../drivers/usb_vcom.h"
-///< Entry point for application code
-int main(int argc, char *argv[]);
+///< Entry point for system bootstrap after initial configurations.
+void systemBootstrap();
void Reset_Handler() __attribute__((__interrupt__, noreturn));
void Reset_Handler()
@@ -84,11 +84,11 @@ void Reset_Handler()
// correctly
setvbuf(stdin, NULL, _IONBF, 0);
-
// Jump to application code
- main(0, NULL);
+ systemBootstrap();
- // If main returns loop indefinitely
+ // Execution flow should never reach this point but, in any case, loop
+ // indefinitely it this happens
for(;;) ;
}