From 393ed5b73afa9ecf6af3631ba4dc597c05290347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mi=C5=A1i=C4=87?= Date: Sun, 15 Jun 2025 15:23:41 +0200 Subject: [PATCH 1/4] Add files syscall.c and sysmem.c This files solve building warnings for newer compilers, for example, arm-none-eabi-gcc v13.3.1 or newer Warnings: warning: _close is not implemented and will always fail warning: _lseek is not implemented and will always fail warning: _read is not implemented and will always fail warning: _write is not implemented and will always fail --- LedBlink/STM32/Src/syscalls.c | 172 ++++++++++++++++++++++++++++++++++ LedBlink/STM32/Src/sysmem.c | 77 +++++++++++++++ Makefile | 4 +- 3 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 LedBlink/STM32/Src/syscalls.c create mode 100644 LedBlink/STM32/Src/sysmem.c diff --git a/LedBlink/STM32/Src/syscalls.c b/LedBlink/STM32/Src/syscalls.c new file mode 100644 index 0000000..1afe1af --- /dev/null +++ b/LedBlink/STM32/Src/syscalls.c @@ -0,0 +1,172 @@ +/** + ****************************************************************************** + * @file syscalls.c + * @author Auto-generated by STM32CubeMX + * @brief Minimal System calls file + * + * For more information about which c-functions + * need which of these lowlevel functions + * please consult the Newlib libc-manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2020-2024 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Variables */ +extern int __io_putchar(int ch) __attribute__((weak)); +extern int __io_getchar(void) __attribute__((weak)); + + +char* __env[1] = { 0 }; +char** environ = __env; + + +/* Functions */ +void +initialise_monitor_handles() { +} + +int +_getpid(void) { + return 1; +} + +int +_kill(int pid, int sig) { + (void)pid; + (void)sig; + errno = EINVAL; + return -1; +} + +void +_exit (int status) { + _kill(status, -1); + while (1) {} /* Make sure we hang here */ +} + +__attribute__((weak)) int _read(int file, char* ptr, int len) { + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) { + *ptr++ = __io_getchar(); + } + + return len; +} + +__attribute__((weak)) int _write(int file, char* ptr, int len) { + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) { + __io_putchar(*ptr++); + } + return len; +} + +int +_close(int file) { + (void)file; + return -1; +} + + +int +_fstat(int file, struct stat* st) { + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int +_isatty(int file) { + (void)file; + return 1; +} + +int +_lseek(int file, int ptr, int dir) { + (void)file; + (void)ptr; + (void)dir; + return 0; +} + +int +_open(char* path, int flags, ...) { + (void)path; + (void)flags; + /* Pretend like we always fail */ + return -1; +} + +int +_wait(int* status) { + (void)status; + errno = ECHILD; + return -1; +} + +int +_unlink(char* name) { + (void)name; + errno = ENOENT; + return -1; +} + +int +_times(struct tms* buf) { + (void)buf; + return -1; +} + +int +_stat(char* file, struct stat* st) { + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int +_link(char* old, char* new) { + (void)old; + (void)new; + errno = EMLINK; + return -1; +} + +int +_fork(void) { + errno = EAGAIN; + return -1; +} + +int +_execve(char* name, char** argv, char** env) { + (void)name; + (void)argv; + (void)env; + errno = ENOMEM; + return -1; +} diff --git a/LedBlink/STM32/Src/sysmem.c b/LedBlink/STM32/Src/sysmem.c new file mode 100644 index 0000000..3630277 --- /dev/null +++ b/LedBlink/STM32/Src/sysmem.c @@ -0,0 +1,77 @@ +/** + ****************************************************************************** + * @file sysmem.c + * @author Generated by STM32CubeMX + * @brief System Memory calls file + * + * For more information about which C functions + * need which of these lowlevel functions + * please consult the newlib libc manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include + +/** + * Pointer to the current high watermark of the heap usage + */ +static uint8_t* __sbrk_heap_end = NULL; + +/** + * @brief _sbrk() allocates memory to the newlib heap and is used by malloc + * and others from the C library + * + * @verbatim + * ############################################################################ + * # .data # .bss # newlib heap # MSP stack # + * # # # # Reserved by _Min_Stack_Size # + * ############################################################################ + * ^-- RAM start ^-- _end _estack, RAM end --^ + * @endverbatim + * + * This implementation starts allocating at the '_end' linker symbol + * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack + * The implementation considers '_estack' linker symbol to be RAM end + * NOTE: If the MSP stack, at any point during execution, grows larger than the + * reserved size, please increase the '_Min_Stack_Size'. + * + * @param incr Memory size + * @return Pointer to allocated memory + */ +void* +_sbrk(ptrdiff_t incr) { + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t* max_heap = (uint8_t*)stack_limit; + uint8_t* prev_heap_end; + + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) { + __sbrk_heap_end = &_end; + } + + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) { + errno = ENOMEM; + return (void*) -1; + } + + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; + + return (void*)prev_heap_end; +} diff --git a/Makefile b/Makefile index 6c7bcc7..70d6fcd 100644 --- a/Makefile +++ b/Makefile @@ -26,10 +26,12 @@ export COMMON_SRCS = \ LedBlink/Src/main.c \ LedBlink/Src/bootloader.c \ LedBlink/Library/Src/software_info.c \ +LedBlink/STM32/Src/syscalls.c \ +LedBlink/STM32/Src/sysmem.c \ +LedBlink/STM32/Src/system_clock.c \ LedBlink/Utility/Src/crc32.c \ LedBlink/Utility/Src/json.c \ LedBlink/Utility/Src/utils.c \ -LedBlink/STM32/Src/system_clock.c \ Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c \ Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c \ Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c \ From 8e115b329ea138d2a57dcd90aed2daa574a78672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mi=C5=A1i=C4=87?= Date: Sun, 15 Jun 2025 15:28:24 +0200 Subject: [PATCH 2/4] Update linker scripts for GCC11 or later. --- Linker/STM32F7xx.ld | 12 +++++++----- Linker/STM32F7xx_SIGNATURE.ld | 12 +++++++----- Linker/STM32H7xx.ld | 17 +++++++++++------ Linker/STM32H7xx_SIGNATURE.ld | 15 ++++++++++----- Linker/STM32L4xx.ld | 14 ++++++++------ Linker/STM32L4xx_SIGNATURE.ld | 15 +++++++++------ 6 files changed, 52 insertions(+), 33 deletions(-) diff --git a/Linker/STM32F7xx.ld b/Linker/STM32F7xx.ld index 69d6700..bdbe28e 100644 --- a/Linker/STM32F7xx.ld +++ b/Linker/STM32F7xx.ld @@ -88,13 +88,15 @@ SECTIONS . = ALIGN(4); } >FLASH - .ARM.extab : { + .ARM.extab (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { . = ALIGN(4); *(.ARM.extab* .gnu.linkonce.armextab.*) . = ALIGN(4); } >FLASH - .ARM : { + .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { . = ALIGN(4); __exidx_start = .; *(.ARM.exidx*) @@ -102,7 +104,7 @@ SECTIONS . = ALIGN(4); } >FLASH - .preinit_array : + .preinit_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(4); PROVIDE_HIDDEN (__preinit_array_start = .); @@ -111,7 +113,7 @@ SECTIONS . = ALIGN(4); } >FLASH - .init_array : + .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(4); PROVIDE_HIDDEN (__init_array_start = .); @@ -121,7 +123,7 @@ SECTIONS . = ALIGN(4); } >FLASH - .fini_array : + .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(4); PROVIDE_HIDDEN (__fini_array_start = .); diff --git a/Linker/STM32F7xx_SIGNATURE.ld b/Linker/STM32F7xx_SIGNATURE.ld index 5474125..8ed9f63 100644 --- a/Linker/STM32F7xx_SIGNATURE.ld +++ b/Linker/STM32F7xx_SIGNATURE.ld @@ -96,13 +96,15 @@ SECTIONS . = ALIGN(4); } >FLASH - .ARM.extab : { + .ARM.extab (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { . = ALIGN(4); *(.ARM.extab* .gnu.linkonce.armextab.*) . = ALIGN(4); } >FLASH - .ARM : { + .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { . = ALIGN(4); __exidx_start = .; *(.ARM.exidx*) @@ -110,7 +112,7 @@ SECTIONS . = ALIGN(4); } >FLASH - .preinit_array : + .preinit_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(4); PROVIDE_HIDDEN (__preinit_array_start = .); @@ -119,7 +121,7 @@ SECTIONS . = ALIGN(4); } >FLASH - .init_array : + .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(4); PROVIDE_HIDDEN (__init_array_start = .); @@ -129,7 +131,7 @@ SECTIONS . = ALIGN(4); } >FLASH - .fini_array : + .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(4); PROVIDE_HIDDEN (__fini_array_start = .); diff --git a/Linker/STM32H7xx.ld b/Linker/STM32H7xx.ld index 56a7761..e093072 100644 --- a/Linker/STM32H7xx.ld +++ b/Linker/STM32H7xx.ld @@ -53,7 +53,7 @@ ENTRY(Reset_Handler) /* Highest address of the user mode stack */ -_estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM); /* end of RAM */ +_estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM); /* end of RAM */ /* Generate a link error if heap and stack don't fit into RAM */ _Min_Heap_Size = 0x200; /* required amount of heap */ _Min_Stack_Size = 0x400; /* required amount of stack */ @@ -117,27 +117,32 @@ SECTIONS . = ALIGN(4); } >FLASH - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { + .ARM.extab (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } >FLASH + + .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } >FLASH - .preinit_array : + .preinit_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } >FLASH - .init_array : + .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } >FLASH - .fini_array : + .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) diff --git a/Linker/STM32H7xx_SIGNATURE.ld b/Linker/STM32H7xx_SIGNATURE.ld index 61d52d1..1a639cb 100644 --- a/Linker/STM32H7xx_SIGNATURE.ld +++ b/Linker/STM32H7xx_SIGNATURE.ld @@ -125,27 +125,32 @@ SECTIONS . = ALIGN(4); } >FLASH - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { + .ARM.extab (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } >FLASH + + .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } >FLASH - .preinit_array : + .preinit_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } >FLASH - .init_array : + .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } >FLASH - .fini_array : + .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) diff --git a/Linker/STM32L4xx.ld b/Linker/STM32L4xx.ld index 9142e0d..2152df1 100644 --- a/Linker/STM32L4xx.ld +++ b/Linker/STM32L4xx.ld @@ -102,21 +102,23 @@ SECTIONS . = ALIGN(8); } >FLASH - .ARM.extab : + .ARM.extab (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(8); *(.ARM.extab* .gnu.linkonce.armextab.*) . = ALIGN(8); } >FLASH - .ARM : { - . = ALIGN(8); + + .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { + . = ALIGN(8); __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; . = ALIGN(8); } >FLASH - .preinit_array : + .preinit_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(8); PROVIDE_HIDDEN (__preinit_array_start = .); @@ -125,7 +127,7 @@ SECTIONS . = ALIGN(8); } >FLASH - .init_array : + .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(8); PROVIDE_HIDDEN (__init_array_start = .); @@ -134,7 +136,7 @@ SECTIONS PROVIDE_HIDDEN (__init_array_end = .); . = ALIGN(8); } >FLASH - .fini_array : + .fini_array (READONLY) : { . = ALIGN(8); PROVIDE_HIDDEN (__fini_array_start = .); diff --git a/Linker/STM32L4xx_SIGNATURE.ld b/Linker/STM32L4xx_SIGNATURE.ld index cdae6e4..dc583ee 100644 --- a/Linker/STM32L4xx_SIGNATURE.ld +++ b/Linker/STM32L4xx_SIGNATURE.ld @@ -112,13 +112,15 @@ SECTIONS . = ALIGN(8); } >FLASH - .ARM.extab : + .ARM.extab (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(8); *(.ARM.extab* .gnu.linkonce.armextab.*) . = ALIGN(8); } >FLASH - .ARM : { + + .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { . = ALIGN(8); __exidx_start = .; *(.ARM.exidx*) @@ -126,7 +128,7 @@ SECTIONS . = ALIGN(8); } >FLASH - .preinit_array : + .preinit_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(8); PROVIDE_HIDDEN (__preinit_array_start = .); @@ -134,8 +136,8 @@ SECTIONS PROVIDE_HIDDEN (__preinit_array_end = .); . = ALIGN(8); } >FLASH - - .init_array : + + .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(8); PROVIDE_HIDDEN (__init_array_start = .); @@ -144,7 +146,8 @@ SECTIONS PROVIDE_HIDDEN (__init_array_end = .); . = ALIGN(8); } >FLASH - .fini_array : + + .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ { . = ALIGN(8); PROVIDE_HIDDEN (__fini_array_start = .); From 923af283251b13a341af0966968143197f18af29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mi=C5=A1i=C4=87?= Date: Sun, 15 Jun 2025 15:29:06 +0200 Subject: [PATCH 3/4] makefile: print GCC version at the end of build --- Makefile.common | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.common b/Makefile.common index 90f3e73..646733f 100644 --- a/Makefile.common +++ b/Makefile.common @@ -63,7 +63,8 @@ LDFLAGS = $(MCU) -specs=nano.specs -TLinker/$(LD_NAME)$(LD_SUFFIX) $(LIBDIR) $(L LDFLAGS_SIGNATURE = $(MCU) -specs=nano.specs -TLinker/$(LD_NAME)_SIGNATURE$(LD_SUFFIX) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections # default action: build all -all: debug signed +all: debug signed + arm-none-eabi-gcc -v debug: $(TARGET_DIR)/$(TARGET).elf $(TARGET_DIR)/$(TARGET).hex $(TARGET_DIR)/$(TARGET).bin From 1666a05e3fb4330349be3171dda9029fd0fd9041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mi=C5=A1i=C4=87?= Date: Sun, 15 Jun 2025 15:32:11 +0200 Subject: [PATCH 4/4] Add github action for building all variants --- .github/workflows/compile.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/compile.yml diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml new file mode 100644 index 0000000..e1fb8ba --- /dev/null +++ b/.github/workflows/compile.yml @@ -0,0 +1,32 @@ +name: Compile targets + +on: + push: + branches: + - 'master' + pull_request: + branches: + - '*' + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + config: [ + all + ] + + container: + image: igormisic/improject:v1.0.2 + options: --privileged --ulimit core=-1 --security-opt seccomp=unconfined + steps: + - uses: actions/checkout@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + submodules: 'true' + + - name: make ${{matrix.config}} + run: make ${{matrix.config}}