在串口数据轰炸后,程序HardFault_Handler()了

博客讲述了在连续高速通过串口向设备发送数据时,系统频繁进入HardFault_Handler异常的情况。作者发现问题是由于USART1接收中断不断触发,占用所有CPU资源,导致PendSV_Handler无法执行任务切换。通过改进中断处理函数,读取USART_SR和USART_DR来清除错误状态位,从而解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


程序初始化后,用SSCOM32串口调试助手以1ms为间隔向设备发送数据。结果没有隔半分钟,系统就进入了HardFault异常了。

我很明确这个异常100%是由于访问了非法地址引起。多半是由于内存溢出或者访问越界所致。但我就很难明白到底是怎么个内存访问非法。

HardFault_Hander()定义如下:

void HardFault_Handler(void)
{
  uint32_t r_sp ;

  r_sp = __get_PSP(); //获取SP的值
  PERROR(ERROR,Memory Access Error!);
  Panic(r_sp);
 
  while (1);
}

如果存在内存溢出,就会打印部分系统信息,并进入while(1)死循环。

当我将PendSV_Handle()的优先级改为最低后,很少出现这个问题了。

 

但还是会有系统死掉的情况。

在系统中,我开启了USART1、USART2、USART3的接收中断RXE,其它中断都没有开。系统在运行中,能触发的中断有:

SysClock_handler
PendSV_handler
USART1_handler
USART2_handler
USART3_handler
如果只往USART1发送数据,那么只剩SysClock,PendSV,USART1,三个中断源。

我现在往USART1狂发数据。持续了5min左右,系统死了。

单步调试时,发现在没有往USART1发数据时候,USART1中断还是不断触发,完全占用了所有的CPU资源。导致PendSV_Handler中断执行不了,故无法进行任务切换。

而在USART1中断中看,只有USART1->SR中的TXE置位。另我不解的是,USART1->TXEIE=0,按道理这不应该会有中断触发的。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值