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


程序初始化后,用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中断执行不了,

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
串口发送数据时出现HardFault_Handler是因为发生了硬件错误或者软件错误导致的异常中断。HardFault_Handler是ARM Cortex-M处理器的一个默认异常处理函数,用于处理发生在执行期间的严重错误。 出现HardFault_Handler可能有多种原因,包括但不限于以下几点: 1. 内存访问错误:例如访问了未初始化的指针或者越界访问了数组。 2. 栈溢出:当函数调用层级过深或者局部变量占用过多栈空间时,可能导致栈溢出。 3. 中断优先级错误:如果中断优先级设置不正确,可能导致中断嵌套或者中断冲突。 4. 资源竞争:例如多个任务同时访问共享资源,没有正确进行同步操作,可能导致数据错误或者死锁。 5. 硬件故障:例如串口硬件故障、时钟频率错误等。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查代码逻辑:仔细检查串口发送数据的代码,确保没有内存访问错误、栈溢出等问题。 2. 检查中断优先级:确保中断优先级设置正确,避免中断嵌套或者冲突。 3. 检查资源竞争:如果有多个任务同时访问串口资源,确保进行正确的同步操作,避免数据错误或者死锁。 4. 检查硬件连接:检查串口硬件连接是否正确,确保没有硬件故障。 5. 调试工具:使用调试工具(如JTAG/SWD调试器)进行调试,查看硬件状态、寄存器值等信息,以便更好地定位问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值