进入hardfault的原因

进入hardfault的原因
一. 问题现象代码定义了几个常量/变量会导致进入hardfault由于初始化就有时候加上static就能够解决问题有时候加上static也依然出现hardfault。有时候更改变量/常量的命名也可以解决hardfault问题。二. 为什么会进入hardfault?1. 内存溢出。2. 访问越界关键区域内存被改写。3. 堆栈溢出。heap堆malloc分配。stack栈自动分配如果代码过多嵌套、递归、返回和传递参数多都会消耗大量stack还有函数内有大型结构体、大量局部变量。4. 数据类型错误当程序强制类型转换时强制转换后类型内存可能未对齐将导致错误。x86、M3、M4支持非对齐的访问。5. 时钟配置、时钟不稳定。6. 参数类型不匹配使用与定义类型不同的参数可能导致程序跳转到HardFault_Handler且这种情况下的问题通常是不固定的。7. 写内部Flash存储误操作到代码区域。8.整数除0运行。可能引发hardfault。9. 总线错误。访问冲突、非法访问内存、通信干扰引发故障等。10. 中断处理错误。中断服务函数不能正常执行导致。11.其他对齐问题。如DMA、MPU、RTOS任务栈、硬件浮点、终端服务函数栈。三. 排查问题1. 通过在线调试利用debug的call stack来排查。大家可以百度一下网络上有很多教程。2. 通过打印分析出问题的执行位置。3. 这是很多人忽略的一点。通过List或者Map文件看看是否有内存地址异常的情况同时结合第一点和第二点做分析。如果你能够通过改部分代码使hardfault不再出现。那么改之前和改之前的map或List文件的差异信息对你分析dardfault将有非常大帮助。我的问题则是通过这个方法找到了根本原因是内存对齐导致差异性的地方再Map文件中发现了部分内存没有对齐。M0中最常见的就是对齐问题。4. 可以通过类似arm coresight这样专业的调试来排查问题但是这需要芯片本身支持这个特性才行。关于coresight我后面的文章会有讲述。参考资料1. 【转载】STM32H7烧脑技术贴无法回避的字节对齐问题--from三叶-电子产品世界论坛2. 技术分享 | HardFault问题分析 | 技术文章 | 汇顶科技开发者社区3. Cortex-M0/M0 MCU 硬故障的常见原因 - SoC4. 3. Analyzing Hard-Fault — DA145XX Tutorial SDK Getting started5. Debugging a Cortex-M0 Hard Fault - Embedded and Microcontrollers forum - Support forums - Arm Community6. Common Causes of Hard Faults on Cortex-M0/M0 MCUs - SoCDisclaimer / 免责声明:本文仅代表作者在撰写和修改时的个人观点不代表当前或未来立场。文中观点和内容未经学术机构或标准组织验证作者不对其准确性、完整性或可靠性作任何保证。请读者仅供参考并自行核实相关信息。本文旨在探索与经验分享因篇幅及作者水平所限难免存在疏漏欢迎批评指正。如有问题或交流建议请联系flourishinggardenoutlook.com。copyright / 版权声明:本文为作者原创。引用或转载需注明“转自或引用自 flourishinggardenoutlook.com”。 未经注明来源的擅自使用、抄袭或传播行为均被禁止。

最新新闻

日新闻

周新闻

月新闻