关于stm32 HardFault_Handler 异常的处理死机

在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果 有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。
一般来说运行操作系统   是以下几个问题
1.开始的时候给ucos分配的堆栈太小了,随着项目做多了,这类问题一般很容易解决
#define TASK_IO_SIZE   300
#define TASK_IO_PRIO 6
OS_STK   TASK_IO_STK[TASK_IO_SIZE];
比如修改300到 1000,做开发的时候 如果ram允许,尽量大些,免的麻烦

2.数组溢出
这类问题一般在通信中,接受数据的时候,特别是长度不定的时候
比如协议为       :开始   功能码   长度   数据1   数据2 。。结束
长度决定了后面的数据多少,在分配接受缓冲的时候    ,突然来了个错误的长度比如255
但是我们分配buffer[100],只定义了100,这样数组就溢出了 
所有在放数据之前要对长度进行判断是否合理,以后 如果有长度 或者索引就要想到溢出。。

3.使用了非法的指针 ,比如空指针 ,编译对的 但是运行就错了
u8 *p = null;
*p = 1;            把0地址的数据强制设置为1,   不错才怪

4.使用 OS_ENTER_CRITICAL();
使用了 OS_ENTER_CRITICAL(); 却忘了OS_EXIT_CRITICAL(); 退出临界区
特别是在这个函数OS_ENTER_CRITICAL();   调用了子函数 也有的这类情况,很容易忘记关闭的这样就造成了“死机现象”
因此如果调用的话   建议在函数中加入OS_CPU_SR   cpu_sr = 0u;局部变量 在管理临界区    os的内核程序也是这么用的   ,而且要注意,临界区一般用于全局变量的写操作,时间要非常快的,任务中的变量可以不用添加 。

常见的就上面几种了,说说硬件异常了 怎么来发现,这个才是主要的
举个例子:
a.仿真,运行程序的时候点红色X进入异常
关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

b.调出堆栈窗口,也就是黑匣子
关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

c.查找问题
关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

d.找出出错的函数
关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

e.解决问题
关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

f   一些思考
很久之前在研究stm32 库源码的时候   发现基本上   每个函数进入之前都做了参数的检测,当初还觉得检查不检查貌似没什么大的作用,自己使用的时候注意就好了,现在是不是改变看法了吗?编程的时候很多问题,在参数检查的时候被过滤掉了,这样在开发大型项目的时候,可以给您免去很多不必要的麻烦,反而会提供开发效率哦

当然网上也有很多,检查寄存器LR SP等地址 来反推出最后运行的汇编函数调用地址的,但是肯定没有上面的直观。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32hardfault_handler是一个用于处理硬件故障的函数。当STM32芯片发生硬件故障时,系统会自动调用这个函数来处理故障。这个函数可以帮助我们快速定位和解决硬件故障问题,提高系统的稳定性和可靠性。 ### 回答2: STM32是一款由STMicroelectronics公司设计的微控制器系列,具有高效、高速、灵活等特点,广泛应用于嵌入式系统中。在使用STM32时,程序出现错误时,也会出现hardfault_handler异常hardfault_handlerSTM32芯片处理器的一种错误状态,指处理器在执行运算时出现错误,无法处理的情况。例如,操作码错误,内存读写错误,栈溢出等都会导致hardfault_handler异常。当程序出现hardfault_handler异常时,CPU会进入fault状态,系统将停止响应。 为了解决该问题,开发者需要了解和处理hardfault_handler异常。事实上,解决该问题并不难,一般以以下几个步骤为主。 1.理解hardfault_handler:首先,需要了解hardfault_handler的产生原因。这有助于开发者更快地发现和解决问题。 2.分析异常产生的原因:通过芯片提供的日志或调试工具,确定异常发生的地点、原因等相关信息,手动分析栈的状态以及内存读写等情况,以便发现问题。 3.修改代码:一旦发现异常的原因,就需要修改、调整程序代码以消除异常状态。 4.测试和验证:在修复程序后,需要进行测试和验证,确保系统正常运行,不再出现异常状态。 总之,hardfault_handler异常STM32芯片处理器中的错误状态,它可能由各种原因引发。解决该问题需要通过深入分析、代码调试和测试验证来实现。只有掌握了hardfault_handler的产生和处理方法,才能更好地利用STM32的优势特点。 ### 回答3: STM32是一种微控制器,其可以用于嵌入式应用程序的开发。在STM32处理器中,可能会发生一些硬件错误,这些硬件错误也称为硬故障。当STM32处理器发生硬故障时,程序将停止运行,并且必须通过硬故障处理器进行诊断和修复。硬故障处理器的功能是监视STM32处理器中的硬件错误,并生成相关的调试信息。 当一个STM32处理器发生硬故障时,硬故障处理器会从存储器中读取硬故障向量表,并跳转到硬故障向量表中指定的硬故障处理程序。这个程序称为hardfault_handlerhardfault_handler的主要作用是记录发生硬故障时的错误原因,并生成一个硬故障日志文件,以便开发人员进行故障分析和修复。 硬故障处理器可以根据集成硬件中硬故障发生的情况识别出硬故障的类型,并将其记录在日志文件中。日志文件包括硬故障类型、触发原因、处理程序的代码位置等信息。这些信息可帮助开发人员快速定位导致硬故障的问题,并进行修复。 在进行STM32处理器的开发时,应该考虑到可能出现硬故障的情况,并编写硬故障处理程序的代码。硬故障处理程序应该能够识别硬故障的类型,并在发生硬故障时生成相应的调试信息。这样可以保证在硬故障发生时,能够及时进行故障诊断和修复,提高应用程序的稳定性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值