From 7ee96bc08d50e39e67e130aba5e1668703cde260 Mon Sep 17 00:00:00 2001 From: xiao Date: Mon, 30 Mar 2026 13:14:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BB=9F=E4=B8=80R8=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E5=B9=B6=E4=BF=AE=E5=A4=8DMDK=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E5=89=8D=E7=BD=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .mxproject | 2 +- App/config.c | 4 +- App/tcp_client.h | 4 +- App/tcp_server.h | 4 +- App/uart_trans.h | 4 +- Core/Inc/FreeRTOSConfig.h | 3 +- Core/Src/freertos.c | 10 +- Drivers/LwIP/port/sys_arch.c | 3 + Drivers/LwIP/src/include/arch/cc.h | 1 + Drivers/LwIP/src/include/arch/lwipopts.h | 5 +- Drivers/LwIP/src/include/arch/sys_arch.h | 30 +++ EWARM/TCP2UART.ewp | 6 +- EWARM/startup_stm32f103xb.s | 190 +++++++++++++++ EWARM/stm32f103xb_flash.icf | 27 +++ MDK-ARM/TCP2UART.uvprojx | 280 ++++++++++++++++++++++- MDK-ARM/startup_stm32f103xb.s | 4 +- MDK-ARM/startup_stm32f103xe.s | 4 +- 17 files changed, 555 insertions(+), 26 deletions(-) create mode 100644 EWARM/startup_stm32f103xb.s create mode 100644 EWARM/stm32f103xb_flash.icf diff --git a/.mxproject b/.mxproject index 35be394..150afdf 100644 --- a/.mxproject +++ b/.mxproject @@ -4,7 +4,7 @@ LibFiles=Drivers\STM32F1xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM3 [PreviousUsedIarFiles] SourceFiles=..\Core\Src\main.c;..\Core\Src\gpio.c;..\Core\Src\dma.c;..\Core\Src\iwdg.c;..\Core\Src\spi.c;..\Core\Src\usart.c;..\Core\Src\wwdg.c;..\Core\Src\stm32f1xx_it.c;..\Core\Src\stm32f1xx_hal_msp.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_iwdg.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_spi.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_wwdg.c;..\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;..\Core\Src\system_stm32f1xx.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_iwdg.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_spi.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_wwdg.c;..\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;..\Core\Src\system_stm32f1xx.c;;; HeaderPath=..\Drivers\STM32F1xx_HAL_Driver\Inc;..\Drivers\STM32F1xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F1xx\Include;..\Drivers\CMSIS\Include;..\Core\Inc; -CDefines=USE_HAL_DRIVER;STM32F103xE;USE_HAL_DRIVER;USE_HAL_DRIVER; +CDefines=USE_HAL_DRIVER;STM32F103xB;USE_HAL_DRIVER;USE_HAL_DRIVER; [PreviousUsedKeilFiles] SourceFiles=..\Core\Src\main.c;..\Core\Src\gpio.c;..\Core\Src\freertos.c;..\Core\Src\dma.c;..\Core\Src\iwdg.c;..\Core\Src\spi.c;..\Core\Src\usart.c;..\Core\Src\stm32f1xx_it.c;..\Core\Src\stm32f1xx_hal_msp.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_iwdg.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_spi.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c;..\Middlewares\Third_Party\FreeRTOS\Source\croutine.c;..\Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;..\Middlewares\Third_Party\FreeRTOS\Source\list.c;..\Middlewares\Third_Party\FreeRTOS\Source\queue.c;..\Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;..\Middlewares\Third_Party\FreeRTOS\Source\tasks.c;..\Middlewares\Third_Party\FreeRTOS\Source\timers.c;..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3\port.c;..\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;..\Core\Src\system_stm32f1xx.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_iwdg.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_spi.c;..\Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c;..\Middlewares\Third_Party\FreeRTOS\Source\croutine.c;..\Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;..\Middlewares\Third_Party\FreeRTOS\Source\list.c;..\Middlewares\Third_Party\FreeRTOS\Source\queue.c;..\Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;..\Middlewares\Third_Party\FreeRTOS\Source\tasks.c;..\Middlewares\Third_Party\FreeRTOS\Source\timers.c;..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3\port.c;..\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;..\Core\Src\system_stm32f1xx.c;;;..\Middlewares\Third_Party\FreeRTOS\Source\croutine.c;..\Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;..\Middlewares\Third_Party\FreeRTOS\Source\list.c;..\Middlewares\Third_Party\FreeRTOS\Source\queue.c;..\Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;..\Middlewares\Third_Party\FreeRTOS\Source\tasks.c;..\Middlewares\Third_Party\FreeRTOS\Source\timers.c;..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3\port.c; diff --git a/App/config.c b/App/config.c index e91d552..f30917b 100644 --- a/App/config.c +++ b/App/config.c @@ -19,8 +19,8 @@ * Private Definitions *---------------------------------------------------------------------------*/ -#define CONFIG_RX_BUFFER_SIZE 256 -#define CONFIG_TX_BUFFER_SIZE 512 +#define CONFIG_RX_BUFFER_SIZE 128 +#define CONFIG_TX_BUFFER_SIZE 256 #define CONFIG_CMD_MAX_LEN 128 /* AT command prefixes */ diff --git a/App/tcp_client.h b/App/tcp_client.h index 937015e..6c2cd05 100644 --- a/App/tcp_client.h +++ b/App/tcp_client.h @@ -22,8 +22,8 @@ extern "C" { #define TCP_CLIENT_MAX_RECONNECT_TRIES 0 /* 0 = infinite */ /* Buffer sizes */ -#define TCP_CLIENT_RX_BUFFER_SIZE 1024 -#define TCP_CLIENT_TX_BUFFER_SIZE 1024 +#define TCP_CLIENT_RX_BUFFER_SIZE 512 +#define TCP_CLIENT_TX_BUFFER_SIZE 512 /* TCP Client state */ typedef enum { diff --git a/App/tcp_server.h b/App/tcp_server.h index a8cc4f1..2d99ce2 100644 --- a/App/tcp_server.h +++ b/App/tcp_server.h @@ -20,8 +20,8 @@ extern "C" { #define TCP_SERVER_MAX_CONNECTIONS 1 /* Buffer sizes */ -#define TCP_SERVER_RX_BUFFER_SIZE 1024 -#define TCP_SERVER_TX_BUFFER_SIZE 1024 +#define TCP_SERVER_RX_BUFFER_SIZE 512 +#define TCP_SERVER_TX_BUFFER_SIZE 512 /* TCP Server state */ typedef enum { diff --git a/App/uart_trans.h b/App/uart_trans.h index f8ff8c6..fef4ecc 100644 --- a/App/uart_trans.h +++ b/App/uart_trans.h @@ -25,8 +25,8 @@ typedef enum { } uart_channel_t; /* DMA buffer sizes */ -#define UART_RX_DMA_BUFFER_SIZE 256 -#define UART_TX_DMA_BUFFER_SIZE 256 +#define UART_RX_DMA_BUFFER_SIZE 128 +#define UART_TX_DMA_BUFFER_SIZE 128 /* UART configuration */ typedef struct { diff --git a/Core/Inc/FreeRTOSConfig.h b/Core/Inc/FreeRTOSConfig.h index 72b0be7..ba6fd6e 100644 --- a/Core/Inc/FreeRTOSConfig.h +++ b/Core/Inc/FreeRTOSConfig.h @@ -65,7 +65,7 @@ #define configTICK_RATE_HZ ((TickType_t)1000) #define configMAX_PRIORITIES ( 56 ) #define configMINIMAL_STACK_SIZE ((uint16_t)128) -#define configTOTAL_HEAP_SIZE ((size_t)16384) /* 16KB for LwIP + application */ +#define configTOTAL_HEAP_SIZE ((size_t)8192) /* Fit R8 RAM budget with dynamic tasks */ #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_TRACE_FACILITY 1 #define configUSE_16_BIT_TICKS 0 @@ -75,6 +75,7 @@ #define configUSE_COUNTING_SEMAPHORES 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 #define configUSE_STREAM_BUFFERS 1 /* Enable StreamBuffer for UART data transfer */ +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 1 /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 0 diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 2cca56e..4c95f30 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -50,11 +50,11 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* Task stack sizes (words, not bytes) */ -#define LWIP_TASK_STACK_SIZE 512 -#define TCP_SERVER_TASK_STACK_SIZE 384 -#define TCP_CLIENT_TASK_STACK_SIZE 384 -#define UART_TRANS_TASK_STACK_SIZE 256 -#define CONFIG_TASK_STACK_SIZE 384 +#define LWIP_TASK_STACK_SIZE 384 +#define TCP_SERVER_TASK_STACK_SIZE 320 +#define TCP_CLIENT_TASK_STACK_SIZE 320 +#define UART_TRANS_TASK_STACK_SIZE 192 +#define CONFIG_TASK_STACK_SIZE 256 #define DEFAULT_TASK_STACK_SIZE 128 /* Task priorities */ diff --git a/Drivers/LwIP/port/sys_arch.c b/Drivers/LwIP/port/sys_arch.c index be5c0f3..eb4304e 100644 --- a/Drivers/LwIP/port/sys_arch.c +++ b/Drivers/LwIP/port/sys_arch.c @@ -4,6 +4,7 @@ */ #include "lwip/opt.h" +#include "lwip/mem.h" #include "lwip/sys.h" #include "lwip/stats.h" #include "arch/sys_arch.h" @@ -15,6 +16,8 @@ #include +int errno; + /* Timeout for infinite wait */ #define LWIP_ARCH_TICK_PER_MS (1000 / configTICK_RATE_HZ) diff --git a/Drivers/LwIP/src/include/arch/cc.h b/Drivers/LwIP/src/include/arch/cc.h index 55c9bde..2eb44de 100644 --- a/Drivers/LwIP/src/include/arch/cc.h +++ b/Drivers/LwIP/src/include/arch/cc.h @@ -9,6 +9,7 @@ #include #include #include +#include "lwip/errno.h" /* Use standard integer types from stdint.h */ #define LWIP_NO_STDINT_H 0 diff --git a/Drivers/LwIP/src/include/arch/lwipopts.h b/Drivers/LwIP/src/include/arch/lwipopts.h index d04f9da..3a9eb0c 100644 --- a/Drivers/LwIP/src/include/arch/lwipopts.h +++ b/Drivers/LwIP/src/include/arch/lwipopts.h @@ -31,6 +31,9 @@ #define MEM_LIBC_MALLOC 0 #define MEMP_MEM_MALLOC 0 +/* Let lwIP provide the errno values used by sockets/netconn. */ +#define LWIP_PROVIDE_ERRNO 1 + /*----------------------------------------------------------------------------- * Memory Configuration (optimized for STM32F103 with ~20KB RAM) *---------------------------------------------------------------------------*/ @@ -63,7 +66,7 @@ #define MEMP_NUM_TCP_PCB_LISTEN 2 /* Number of simultaneously queued TCP segments */ -#define MEMP_NUM_TCP_SEG 12 +#define MEMP_NUM_TCP_SEG 17 /* Number of simultaneously active timeouts */ #define MEMP_NUM_SYS_TIMEOUT 8 diff --git a/Drivers/LwIP/src/include/arch/sys_arch.h b/Drivers/LwIP/src/include/arch/sys_arch.h index 29689b3..6ce643a 100644 --- a/Drivers/LwIP/src/include/arch/sys_arch.h +++ b/Drivers/LwIP/src/include/arch/sys_arch.h @@ -37,6 +37,36 @@ typedef u32_t sys_prot_t; #define SYS_MBOX_NULL ((sys_mbox_t)NULL) #define SYS_MUTEX_NULL ((sys_mutex_t)NULL) +/* Use one per-thread semaphore for lwIP netconn/socket API calls. */ +#define LWIP_NETCONN_THREAD_SEM_TLS_INDEX 0 +#define LWIP_NETCONN_THREAD_SEM_GET() \ + ((sys_sem_t *)pvTaskGetThreadLocalStoragePointer(NULL, LWIP_NETCONN_THREAD_SEM_TLS_INDEX)) +#define LWIP_NETCONN_THREAD_SEM_ALLOC() \ + do { \ + sys_sem_t *sem = (sys_sem_t *)mem_malloc(sizeof(sys_sem_t)); \ + if (sem != NULL) { \ + *sem = SYS_SEM_NULL; \ + if (sys_sem_new(sem, 0) == ERR_OK) { \ + vTaskSetThreadLocalStoragePointer(NULL, \ + LWIP_NETCONN_THREAD_SEM_TLS_INDEX,\ + sem); \ + } else { \ + mem_free(sem); \ + } \ + } \ + } while (0) +#define LWIP_NETCONN_THREAD_SEM_FREE() \ + do { \ + sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET(); \ + if (sem != NULL) { \ + sys_sem_free(sem); \ + mem_free(sem); \ + vTaskSetThreadLocalStoragePointer(NULL, \ + LWIP_NETCONN_THREAD_SEM_TLS_INDEX, \ + NULL); \ + } \ + } while (0) + /* Check if semaphore/mbox is valid */ #define sys_sem_valid(sem) ((sem) != NULL && (*(sem)) != SYS_SEM_NULL) #define sys_sem_set_invalid(sem) do { if ((sem) != NULL) { *(sem) = SYS_SEM_NULL; } } while(0) diff --git a/EWARM/TCP2UART.ewp b/EWARM/TCP2UART.ewp index 9841a80..0181fde 100644 --- a/EWARM/TCP2UART.ewp +++ b/EWARM/TCP2UART.ewp @@ -225,7 +225,7 @@