From 2bb11888d528d177cbaf9f6de70b6ff43b2ecf67 Mon Sep 17 00:00:00 2001 From: cpq Date: Thu, 13 May 2021 22:03:46 +0100 Subject: [PATCH] Build w/semihosting support --- .../stm32-freertos-tcp/FreeRTOSIPConfig.h | 12 +- examples/stm32-freertos-tcp/Makefile | 25 +++- examples/stm32-freertos-tcp/main.c | 58 ++++----- .../stm32f7/FreeRTOSConfig.h | 6 +- examples/stm32-freertos-tcp/stm32f7/device.h | 4 +- examples/stm32-freertos-tcp/stm32f7/link.ld | 6 +- .../stm32f7/system_stm32f7xx.h | 122 ++++++++++++++++++ 7 files changed, 179 insertions(+), 54 deletions(-) diff --git a/examples/stm32-freertos-tcp/FreeRTOSIPConfig.h b/examples/stm32-freertos-tcp/FreeRTOSIPConfig.h index f83b08b7..b180374b 100644 --- a/examples/stm32-freertos-tcp/FreeRTOSIPConfig.h +++ b/examples/stm32-freertos-tcp/FreeRTOSIPConfig.h @@ -1,6 +1,13 @@ #pragma once #define FREERTOS_IP_CONFIG_H +#define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES 1 +#define ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM 1 +#define ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM 1 +#define ipconfigZERO_COPY_RX_DRIVER 1 +#define ipconfigZERO_COPY_TX_DRIVER 1 +#define ipconfigUSE_LINKED_RX_MESSAGES 1 + extern void vLoggingPrintf(const char *pcFormatString, ...); #define ipconfigHAS_DEBUG_PRINTF 0 #if (ipconfigHAS_DEBUG_PRINTF == 1) @@ -13,7 +20,6 @@ extern void vLoggingPrintf(const char *pcFormatString, ...); #endif #define ipconfigBYTE_ORDER pdFREERTOS_LITTLE_ENDIAN -#define ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM 1 #define ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME (2000) #define ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME (5000) #define ipconfigUSE_LLMNR (0) @@ -24,9 +30,8 @@ extern void vLoggingPrintf(const char *pcFormatString, ...); #define ipconfigDNS_REQUEST_ATTEMPTS (2) #define ipconfigIP_TASK_PRIORITY (configMAX_PRIORITIES - 2) #define ipconfigIP_TASK_STACK_SIZE_WORDS (configMINIMAL_STACK_SIZE * 5) -extern UBaseType_t uxRand(); #define ipconfigRAND32() uxRand() -#define ipconfigUSE_NETWORK_EVENT_HOOK 1 +#define ipconfigUSE_NETWORK_EVENT_HOOK 0 #define ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS (5000 / portTICK_PERIOD_MS) #define ipconfigUSE_DHCP 0 #define ipconfigMAXIMUM_DISCOVER_TX_PERIOD (120000 / portTICK_PERIOD_MS) @@ -48,7 +53,6 @@ extern UBaseType_t uxRand(); #define ipconfigSUPPORT_OUTGOING_PINGS 0 #define ipconfigSUPPORT_SELECT_FUNCTION 1 #define ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES 1 -#define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES 1 #define configWINDOWS_MAC_INTERRUPT_SIMULATOR_DELAY (20 / portTICK_PERIOD_MS) #define ipconfigPACKET_FILLER_SIZE 2 #define ipconfigTCP_WIN_SEG_COUNT 240 diff --git a/examples/stm32-freertos-tcp/Makefile b/examples/stm32-freertos-tcp/Makefile index 43ae6fa5..6509bd03 100644 --- a/examples/stm32-freertos-tcp/Makefile +++ b/examples/stm32-freertos-tcp/Makefile @@ -3,13 +3,19 @@ PROG = firmware ARCH = stm32f7 ROOT = $(realpath $(CURDIR)/../..) DOCKER ?= docker run -it --rm -v $(ROOT):$(ROOT) -w $(CURDIR) mdashnet/armgcc -MONGOOSE_OPTS = -DMG_ENABLE_LINES=1 -DMG_ENABLE_LOG=0 -DMG_ARCH=MG_ARCH_FREERTOS_TCP -DMG_ENABLE_FS=0 +MONGOOSE_OPTS = -DMG_ARCH=MG_ARCH_FREERTOS_TCP -DMG_ENABLE_FS=0 -DMG_ENABLE_LINES=1 MCU = -mcpu=cortex-m7 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -INCS = -I. -I$(ROOT) -I$(ARCH) -I$(ROOT)/test/freertos-kernel/include -I$(ROOT)/test/freertos-tcp/include -I$(ROOT)/test/freertos-tcp/portable/Compiler/GCC -CFLAGS = -W -Wall -Werror -Wno-format -Wno-address-of-packed-member -Os -g $(MCU) -fdata-sections -ffunction-sections $(INCS) $(MONGOOSE_OPTS) $(EXTRA) -LDFLAGS = $(MCU) -specs=nano.specs -T$(ARCH)/link.ld -nostartfiles -lgcc #-Wl,-Map=obj/$(PROG).map,--cref -Wl,--gc-sections +INCS = -I. -I$(ROOT) -I$(ARCH) -I$(ROOT)/test/freertos-kernel/include -I$(ROOT)/test/freertos-tcp/include -I$(ROOT)/test/freertos-tcp/portable/Compiler/GCC -I$(ROOT)/test/freertos-tcp/portable/NetworkInterface/include -IHAL +NETFLAGS = -DSEMIHOSTING -DSTM32F7xx -DSTM32F746xx -Wno-sign-compare -Wno-unused-function -Wno-cpp +CFLAGS = -W -Wall -Werror -Wno-format -Wno-address-of-packed-member -Os -g $(MCU) -fdata-sections -ffunction-sections $(INCS) $(MONGOOSE_OPTS) $(NETFLAGS) $(EXTRA) +#LFLAGS = $(MCU) --static -Wl,-Map=$(TARGET).map -Wl,--gc-sections -lc -lgcc -T$(ARCH)/link.ld #-nostartfiles -lgcc #-Wl,-Map=obj/$(PROG).map,--cref -Wl,--gc-sections +LFLAGS = $(MCU) --static -Wl,-Map=$(TARGET).map -Wl,--gc-sections -specs rdimon.specs -lrdimon -lc -lgcc -T$(ARCH)/link.ld #-nostartfiles -lgcc #-Wl,-Map=obj/$(PROG).map,--cref -Wl,--gc-sections SRCS = main.c $(wildcard $(ROOT)/test/freertos-kernel/*.c) $(wildcard $(ROOT)/test/freertos-tcp/*.c) SRCS += $(ROOT)/test/freertos-kernel/portable/MemMang/heap_4.c $(ARCH)/port.c +SRCS += $(ROOT)/test/freertos-tcp/portable/BufferManagement/BufferAllocation_2.c +SRCS += $(wildcard $(ROOT)/test/freertos-tcp/portable/NetworkInterface/STM32Fxx/*.c) +SRCS += $(wildcard $(ROOT)/test/freertos-tcp/portable/NetworkInterface/Common/*.c) +SRCS += $(wildcard HAL/*.c) OBJS = obj/boot.o $(SRCS:%.c=obj/%.o) obj/mongoose.o # ORDER MATTERS - boot (vector table) first! all: $(PROG).hex @@ -21,7 +27,7 @@ $(PROG).hex: $(PROG).bin $(DOCKER) arm-none-eabi-objcopy -I binary -O ihex --change-address 0x8000000 $< $@ $(PROG).elf: $(OBJS) - $(DOCKER) arm-none-eabi-gcc $(OBJS) $(LDFLAGS) -o $@ + $(DOCKER) arm-none-eabi-gcc $(OBJS) $(LFLAGS) -o $@ obj/%.o: %.c @mkdir -p $(dir $@) @@ -37,13 +43,18 @@ obj/mongoose.o: flash: $(PROG).bin st-flash --reset write $< 0x8000000 +openocd: + openocd -f openocd.cfg + gdb: $(PROG).elf arm-none-eabi-gdb \ -ex 'set confirm off' \ - -ex 'target extended-remote :4242' \ + -ex 'target extended-remote :3333' \ + -ex 'monitor arm semihosting enable' \ -ex 'monitor reset halt' \ - -ex 'load firmware.elf' \ + -ex 'load' \ -ex 'monitor reset init' \ + -ex 'r' \ $< clean: diff --git a/examples/stm32-freertos-tcp/main.c b/examples/stm32-freertos-tcp/main.c index f3399255..e1100f3a 100644 --- a/examples/stm32-freertos-tcp/main.c +++ b/examples/stm32-freertos-tcp/main.c @@ -27,54 +27,40 @@ static void server(void *args) { static void blinker(void *args) { uint16_t pin = ((char *) args)[0] == '1' ? LED2 : LED3; - int ms = pin == LED2 ? 750 : 1500; + int ms = pin == LED2 ? 750 : 1130; for (;;) { gpio_toggle(pin); vTaskDelay(pdMS_TO_TICKS(ms)); + LOG(LL_INFO, ("blink %s", (char *) args)); } } int main(void) { init_hardware(); +#ifdef SEMIHOSTING + extern void initialise_monitor_handles(void); + initialise_monitor_handles(); +#endif xTaskCreate(server, "server", 4096, NULL, configMAX_PRIORITIES - 1, NULL); - xTaskCreate(blinker, "blinker", 128, "1", configMAX_PRIORITIES - 1, NULL); - xTaskCreate(blinker, "blinker", 128, "2", configMAX_PRIORITIES - 1, NULL); + xTaskCreate(blinker, "blinker", 256, "1", configMAX_PRIORITIES - 1, NULL); + xTaskCreate(blinker, "blinker", 256, "2", configMAX_PRIORITIES - 1, NULL); vTaskStartScheduler(); // This blocks return 0; // Unreachable } -// clang-format off // Stubs for FreeRTOS-TCP network interface -BaseType_t xNetworkInterfaceInitialise(void) { return 0; } -BaseType_t xNetworkInterfaceOutput(NetworkBufferDescriptor_t *const pxNetworkBuffer, BaseType_t xReleaseAfterSend) { (void)pxNetworkBuffer; (void) xReleaseAfterSend; return 0; } -void vNetworkInterfaceAllocateRAMToBuffers(NetworkBufferDescriptor_t pxNetworkBuffers[ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS]) { (void) pxNetworkBuffers; } -BaseType_t xGetPhyLinkStatus(void) { return 0; } -void pxGetNetworkBufferWithDescriptor(void){} -void vReleaseNetworkBufferAndDescriptor(void){} -void xNetworkBuffersInitialise(void) {} -void vApplicationIPNetworkEventHook(eIPCallbackEvent_t ev){(void) ev;} -BaseType_t xApplicationGetRandomNumber( uint32_t * p){ *p = 0; return 1;} -uint32_t ulApplicationGetNextSequenceNumber(uint32_t a, uint16_t b, uint32_t c, uint16_t d){return a^b^c^d;} -void xBufferAllocFixedSize(void){} - -// Libc stubs -extern uint32_t _data_end; -void *_sbrk(int incr) { - static unsigned char *heap = NULL; - unsigned char *prev_heap; - if (heap == NULL) heap = (unsigned char *) &_data_end; - prev_heap = heap; - heap += incr; - return prev_heap; +uint32_t ulApplicationGetNextSequenceNumber(uint32_t a, uint16_t b, uint32_t c, + uint16_t d) { + return a ^ b ^ c ^ d; +} +BaseType_t xApplicationGetRandomNumber(uint32_t *p) { + *p = 0; + return 1; +} +uint32_t SystemCoreClock = 216000000; +uint32_t HAL_GetTick(void) { + return 250; +} +uint32_t HAL_RCC_GetHCLKFreq(void) { + return SystemCoreClock; } -int _close(int fd) { (void) fd; return -1; } -int _fstat(int fd, struct stat *st) { (void) fd; st->st_mode = S_IFCHR; return 0; } -int _isatty(int fd) { (void) fd; return 0; } -int _lseek(int fd, int ptr, int dir) { (void) fd; (void) ptr; (void) dir; return 0; } -void _exit(int status) { (void) status; __asm("BKPT #0"); for(;;); } -void _kill(int pid, int sig) { (void) pid; (void) sig; } -int _getpid(void) { return -1; } -int _write(int fd, char *ptr, int len) { (void) fd; (void) ptr; (void) len; return -1; } -int _read(int fd, char *ptr, int len) { (void) fd; (void) ptr; (void) len; return -1; } -int _gettimeofday(struct timeval *tv, void *tz) { (void) tz; unsigned long ms = mg_millis(); tv->tv_sec = ms / 1000; tv->tv_usec = ms % 1000; return 0;}; -// clang-format on diff --git a/examples/stm32-freertos-tcp/stm32f7/FreeRTOSConfig.h b/examples/stm32-freertos-tcp/stm32f7/FreeRTOSConfig.h index 83b88215..0c0cfd51 100644 --- a/examples/stm32-freertos-tcp/stm32f7/FreeRTOSConfig.h +++ b/examples/stm32-freertos-tcp/stm32f7/FreeRTOSConfig.h @@ -14,9 +14,9 @@ #define configUSE_TASK_NOTIFICATIONS 1 #define configUSE_MUTEXES 0 #define configUSE_RECURSIVE_MUTEXES 0 -#define configUSE_COUNTING_SEMAPHORES 0 +#define configUSE_COUNTING_SEMAPHORES 1 #define configQUEUE_REGISTRY_SIZE 10 -#define configUSE_QUEUE_SETS 0 +#define configUSE_QUEUE_SETS 1 #define configUSE_TIME_SLICING 0 #define configUSE_NEWLIB_REENTRANT 0 #define configENABLE_BACKWARD_COMPATIBILITY 0 @@ -79,4 +79,4 @@ #define vPortSVCHandler SVC_handler #define xPortPendSVHandler pending_SV_handler -#define xPortSysTickHandler SysTick_handler \ No newline at end of file +#define xPortSysTickHandler SysTick_handler diff --git a/examples/stm32-freertos-tcp/stm32f7/device.h b/examples/stm32-freertos-tcp/stm32f7/device.h index 8fc250ac..83ef939f 100644 --- a/examples/stm32-freertos-tcp/stm32f7/device.h +++ b/examples/stm32-freertos-tcp/stm32f7/device.h @@ -51,9 +51,9 @@ static inline void gpio_init(uint16_t pin, uint8_t state) { } static inline void init_ram(void) { - extern uint32_t _bss_start, _bss_end; + extern uint32_t __bss_start__, __bss_end__; extern uint32_t _data_start, _data_end, _data_flash_start; - memset(&_bss_start, 0, ((char *) &_bss_end - (char *) &_bss_start)); + memset(&__bss_start__, 0, ((char *) &__bss_end__ - (char *) &__bss_start__)); memcpy(&_data_start, &_data_flash_start, ((char *) &_data_end - (char *) &_data_start)); } diff --git a/examples/stm32-freertos-tcp/stm32f7/link.ld b/examples/stm32-freertos-tcp/stm32f7/link.ld index 4ca6918a..36672c67 100644 --- a/examples/stm32-freertos-tcp/stm32f7/link.ld +++ b/examples/stm32-freertos-tcp/stm32f7/link.ld @@ -9,9 +9,9 @@ SECTIONS { .rodata : { *(.rodata*) } > rom .bss : { - _bss_start = .; + __bss_start__ = .; *(.bss SORT(.bss.*) COMMON) - _bss_end = .; + __bss_end__ = .; } > ram .data : { @@ -21,3 +21,5 @@ SECTIONS { } > ram AT > rom _data_flash_start = LOADADDR(.data); } +__end__ = _data_end; +end = _data_end; diff --git a/examples/stm32-freertos-tcp/stm32f7/system_stm32f7xx.h b/examples/stm32-freertos-tcp/stm32f7/system_stm32f7xx.h index e69de29b..03b44eda 100644 --- a/examples/stm32-freertos-tcp/stm32f7/system_stm32f7xx.h +++ b/examples/stm32-freertos-tcp/stm32f7/system_stm32f7xx.h @@ -0,0 +1,122 @@ +/** + ****************************************************************************** + * @file system_stm32f7xx.h + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device System Source File for STM32F7xx devices. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without + *modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *notice, this list of conditions and the following disclaimer in the + *documentation and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** + * @brief Define to prevent recursive inclusion + */ +#ifndef __SYSTEM_STM32F7XX_H +#define __SYSTEM_STM32F7XX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup STM32F7xx_System_Includes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Exported_Variables + * @{ + */ +/* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetSysClockFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock + frequency Note: If you use this function to configure the system clock; then + there is no need to call the 2 first functions listed above, since + SystemCoreClock variable is updated automatically. + */ +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +extern const uint8_t AHBPrescTable[16]; /*!< AHB prescalers table values */ +extern const uint8_t APBPrescTable[8]; /*!< APB prescalers table values */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Exported_Functions + * @{ + */ + +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_STM32F7XX_H */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/