[STM32F4] 使用较大UART环形缓冲区时出现卡顿问题

[复制链接]
536|9
地瓜patch 发表于 2025-9-18 22:42 | 显示全部楼层 |阅读模式
我通过UART接收数据并存入环形缓冲区。当缓冲区小于256字节时运行正常,但当缓冲区更大时,程序会在代码的第一个for循环处卡住。

以下是我的环形缓冲区实现代码。
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
  if(huart->Instance == USART1){
          static uint8_t old_pos1 = 0;
          uint8_t *ptemp1;
          uint8_t i;
          if (Size != old_pos1){
                if (Size > old_pos1){
                  ReceivedChars1 = Size - old_pos1;
                  for (i = 0; i < ReceivedChars1; i++){
                        pBufferReadyForUser1[i] = RXBufferUser1[old_pos1 + i];
                  }
                }else{
                  ReceivedChars1 = RX_BUFFER_SIZE - old_pos1;
                  for (i = 0; i < ReceivedChars1; i++){
                        pBufferReadyForUser1[i] = RXBufferUser1[old_pos1 + i];
                  }
                  if (Size > 0){
                        for (i = 0; i < Size; i++){
                          pBufferReadyForUser1[ReceivedChars1 + i] = RXBufferUser1[i];
                        }
                        ReceivedChars1 += Size;
                  }
                }
                UserDataTreatment(huart, pBufferReadyForUser1, ReceivedChars1);
                ptemp1 = pBufferReadyForUser1;
                pBufferReadyForUser1 = pBufferReadyForReception1;
                pBufferReadyForReception1 = ptemp1;
          }
          old_pos1 = Size;
  }
}
以下是缓冲区的声明
#define RX_BUFFER_SIZE 200
#define USB_BUFFER_SIZE 200
#define BAUDRATE 57600

// Buffer y contadores de USART1
uint8_t RXBufferUser1[RX_BUFFER_SIZE];
uint8_t RXBufferA1[RX_BUFFER_SIZE];
uint8_t RXBufferB1[RX_BUFFER_SIZE];
uint8_t *pBufferReadyForUser1;
uint8_t *pBufferReadyForReception1;
__IO uint32_t ReceivedChars1;

将RX_BUFFER_SIZE和USB_BUFFER_SIZE增加到超过255就让我的代码崩溃

我使用的是STM32F407VET6,STMCubeIDE的构建分析器显示我使用的CCMRAM、RAM和FLASH都不到15%。所以我认为这不是内存不足的问题。

flycamelaaa 发表于 2025-9-23 10:20 | 显示全部楼层
指针运算可能错了。
jcky001 发表于 2025-9-23 13:22 | 显示全部楼层
如果 HAL_UARTEx_RxEventCallback 被多次快速触发,而 UserDataTreatment 或指针交换未完成,可能导致数据竞争。
onlycook 发表于 2025-9-23 16:22 | 显示全部楼层
检查缓冲区边界,在指针运算前显式检查边界,避免溢出。
powerantone 发表于 2025-9-23 19:23 | 显示全部楼层
在关键位置添加调试输出,检查 Size、old_pos1 和 ReceivedChars1 的值。
probedog 发表于 2025-9-23 18:24 | 显示全部楼层
启用编译器的警告,检查潜在的溢出或类型不匹配。
stormwind123 发表于 2025-9-23 22:25 | 显示全部楼层
可能是由于uint8_t 的循环索引在缓冲区大小超过 255 时溢出,导致无限循环。
七毛钱 发表于 2025-9-23 12:26 | 显示全部楼层
将循环索引 i 改为 uint16_t。
内政奇才 发表于 2025-9-23 14:56 | 显示全部楼层
用memcpy替代手动循环,提高效率并减少错误。
海滨消消 发表于 2025-9-23 15:27 | 显示全部楼层
检查缓冲区边界和指针初始化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1932

主题

15221

帖子

31

粉丝
快速回复 在线客服 返回列表 返回顶部