From f6f0cf9cd3874c1feaf931e427a62b14fa0e8c67 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 2 Sep 2020 23:12:05 -0400 Subject: [PATCH 1/5] Compile with -flto --- .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c | 4 +++- Firmware/Tupfile.lua | 6 +++--- Firmware/communication/communication.cpp | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c index d5feca9e..cc8bbe09 100644 --- a/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c +++ b/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c @@ -302,6 +302,7 @@ static void prvPortStartFirstTask( void ) " isb \n" " svc 0 \n" /* System call to start first task. */ " nop \n" + " .ltorg \n" ); } /*-----------------------------------------------------------*/ @@ -695,7 +696,8 @@ static void vPortEnableVFP( void ) " \n" " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ " str r1, [r0] \n" - " bx r14 " + " bx r14 \n" + " .ltorg " ); } /*-----------------------------------------------------------*/ diff --git a/Firmware/Tupfile.lua b/Firmware/Tupfile.lua index 040db512..77ce8389 100644 --- a/Firmware/Tupfile.lua +++ b/Firmware/Tupfile.lua @@ -136,16 +136,16 @@ FLAGS += { '-Wall', '-Wdouble-promotion', '-Wfloat-conversion', '-fdata-sections -- linker flags LDFLAGS += board.ldflags -LDFLAGS += '-lc -lm -lnosys' -- libs +LDFLAGS += '-flto -lc -lm -lnosys' -- libs LDFLAGS += '-mthumb -mfloat-abi=hard -specs=nosys.specs -specs=nano.specs -u _printf_float -u _scanf_float -Wl,--cref -Wl,--gc-sections' -LDFLAGS += '-Wl,--undefined=uxTopUsedPriority' +LDFLAGS += '-Wl,--undefined=uxTopUsedPriority ' -- debug build if tup.getconfig("DEBUG") == "true" then FLAGS += '-g -gdwarf-2' OPT += '-Og' else - OPT += '-O2' + OPT += '-O2 -flto' end -- common flags for ASM, C and C++ diff --git a/Firmware/communication/communication.cpp b/Firmware/communication/communication.cpp index faac6f59..7845fd6f 100644 --- a/Firmware/communication/communication.cpp +++ b/Firmware/communication/communication.cpp @@ -57,7 +57,7 @@ void init_communication(void) { } extern "C" { -int _write(int file, const char* data, int len); +int _write(int file, const char* data, int len) __attribute__((used)); } // @brief This is what printf calls internally From 72f7d51b0740ec31e179872587c0b4b48bc1d399 Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 3 Sep 2020 00:11:00 -0400 Subject: [PATCH 2/5] Responding on USB --- .../Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c | 3 ++- Firmware/Board/v3/Src/stm32f4xx_it.c | 1 + Firmware/Tupfile.lua | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c b/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c index 5c68c6a2..32c83890 100644 --- a/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c +++ b/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c @@ -369,7 +369,7 @@ typedef tskTCB TCB_t; /*lint -e956 A manual analysis and inspection has been used to determine which static variables must be declared volatile. */ -PRIVILEGED_INITIALIZED_DATA TCB_t * volatile pxCurrentTCB = NULL; +PRIVILEGED_INITIALIZED_DATA TCB_t * volatile pxCurrentTCB __attribute__((used)) = NULL; /* Lists for ready and blocked tasks. --------------------*/ PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */ @@ -2758,6 +2758,7 @@ BaseType_t xSwitchRequired = pdFALSE; #endif /* configUSE_APPLICATION_TASK_TAG */ /*-----------------------------------------------------------*/ +__attribute__((used)) void vTaskSwitchContext( void ) { if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) diff --git a/Firmware/Board/v3/Src/stm32f4xx_it.c b/Firmware/Board/v3/Src/stm32f4xx_it.c index 1e69bcb9..032a25a0 100644 --- a/Firmware/Board/v3/Src/stm32f4xx_it.c +++ b/Firmware/Board/v3/Src/stm32f4xx_it.c @@ -74,6 +74,7 @@ void NMI_Handler(void) /* USER CODE END NonMaskableInt_IRQn 1 */ } +__attribute__((used)) void get_regs(void** stack_ptr) { void* volatile r0 __attribute__((unused)) = stack_ptr[0]; void* volatile r1 __attribute__((unused)) = stack_ptr[1]; diff --git a/Firmware/Tupfile.lua b/Firmware/Tupfile.lua index 77ce8389..ff0cf41e 100644 --- a/Firmware/Tupfile.lua +++ b/Firmware/Tupfile.lua @@ -158,7 +158,7 @@ toolchain = GCCToolchain('arm-none-eabi-', 'build', FLAGS, LDFLAGS) -- Load list of source files Makefile that was autogenerated by CubeMX vars = parse_makefile_vars(board.dir..'/Makefile') -all_stm_sources = (vars['C_SOURCES'] or '')..' '..(vars['CPP_SOURCES'] or '')..' '..(vars['ASM_SOURCES'] or '') +all_stm_sources = (vars['ASM_SOURCES'] or '')..' '..(vars['CPP_SOURCES'] or '')..' '..(vars['C_SOURCES'] or '') for src in string.gmatch(all_stm_sources, "%S+") do stm_sources += board.dir..'/'..src end From d628fdb35caf810073b2bf6f57ab79b08090d1dd Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 3 Sep 2020 00:18:26 -0400 Subject: [PATCH 3/5] Minor cleanup, add comment to tupfile --- .../Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c | 2 +- Firmware/Tupfile.lua | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c b/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c index 32c83890..220b867b 100644 --- a/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c +++ b/Firmware/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/tasks.c @@ -369,7 +369,7 @@ typedef tskTCB TCB_t; /*lint -e956 A manual analysis and inspection has been used to determine which static variables must be declared volatile. */ -PRIVILEGED_INITIALIZED_DATA TCB_t * volatile pxCurrentTCB __attribute__((used)) = NULL; +__attribute__((used)) PRIVILEGED_INITIALIZED_DATA TCB_t * volatile pxCurrentTCB = NULL; /* Lists for ready and blocked tasks. --------------------*/ PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */ diff --git a/Firmware/Tupfile.lua b/Firmware/Tupfile.lua index ff0cf41e..bd59d526 100644 --- a/Firmware/Tupfile.lua +++ b/Firmware/Tupfile.lua @@ -158,6 +158,9 @@ toolchain = GCCToolchain('arm-none-eabi-', 'build', FLAGS, LDFLAGS) -- Load list of source files Makefile that was autogenerated by CubeMX vars = parse_makefile_vars(board.dir..'/Makefile') + +-- ASM sources must precede C sources due to LTO removing weak symbols which appear after strong symbols +-- in the call to the linker: https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966 all_stm_sources = (vars['ASM_SOURCES'] or '')..' '..(vars['CPP_SOURCES'] or '')..' '..(vars['C_SOURCES'] or '') for src in string.gmatch(all_stm_sources, "%S+") do stm_sources += board.dir..'/'..src From a530de4fa9c4ea52257e41ab4c5665553fb00f75 Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 3 Sep 2020 01:15:07 -0400 Subject: [PATCH 4/5] Add tup.config var for LTO and enable by default --- Firmware/Tupfile.lua | 9 +++++++-- Firmware/tup.config.default | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Firmware/Tupfile.lua b/Firmware/Tupfile.lua index bd59d526..cd959137 100644 --- a/Firmware/Tupfile.lua +++ b/Firmware/Tupfile.lua @@ -138,14 +138,19 @@ FLAGS += { '-Wall', '-Wdouble-promotion', '-Wfloat-conversion', '-fdata-sections LDFLAGS += board.ldflags LDFLAGS += '-flto -lc -lm -lnosys' -- libs LDFLAGS += '-mthumb -mfloat-abi=hard -specs=nosys.specs -specs=nano.specs -u _printf_float -u _scanf_float -Wl,--cref -Wl,--gc-sections' -LDFLAGS += '-Wl,--undefined=uxTopUsedPriority ' +LDFLAGS += '-Wl,--undefined=uxTopUsedPriority' -- debug build if tup.getconfig("DEBUG") == "true" then FLAGS += '-g -gdwarf-2' OPT += '-Og' else - OPT += '-O2 -flto' + OPT += '-O2' +end + +if tup.getconfig("USE_LTO") == "true" then + OPT += '-flto' + LDFLAGS += '-flto' end -- common flags for ASM, C and C++ diff --git a/Firmware/tup.config.default b/Firmware/tup.config.default index b2d49106..e348cedb 100644 --- a/Firmware/tup.config.default +++ b/Firmware/tup.config.default @@ -5,6 +5,7 @@ CONFIG_USB_PROTOCOL=native CONFIG_UART_PROTOCOL=ascii CONFIG_DEBUG=false CONFIG_DOCTEST=false +CONFIG_USE_LTO=true # Uncomment this to error on compilation warnings #CONFIG_STRICT=true From 7851d20e2ba3e1558c1dff1f851c78aff38e59e8 Mon Sep 17 00:00:00 2001 From: PAJohnson Date: Sat, 26 Sep 2020 23:17:30 -0400 Subject: [PATCH 5/5] Update top level gitignore for gui artifacts --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 66a8990f..c94fc787 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,8 @@ ODrive\.files ODrive\.includes Firmware/Tests/bin/ + +# GUI +GUI/dist_electron +GUI/node_modules +GUI/build \ No newline at end of file