一、HardFault产生原因
常见产生HardFault产生的原因大概有如下几类:
- 数组越界操作;
- 内存溢出,访问越界;
- 堆栈溢出,程序跑飞;
- 中断处理错误。
CmBackTrace库可支持以上错误。
二、在工程中添加CmBacktrace库
1.在keil中添加分组并添加相应文件如下:
实际需要添加的文件是两个(cm_backtrace.c,cmb_fault.s)
2.添加头文件路径,并且勾选上C99编译
3.添加头文件和软硬件版本号
4.在main函数中调用初始化cm_backtrace函数
5.将编译所得输出文件命名为MasterBoard(具体命名看个人)
如下图:
6.注释HardFault_Handler文件
如下,注释掉stm32h7xx_it.c文件内的硬件错误中断处理函数。
7.更改头文件内的宏定义为当前平台,即CMB_CPU_ARM_CORTEX_M7
我当前使用的是FreeRTOS操作系统,故平台一栏我写的是CMB_OS_PLATFORM_FREERTOS
语言可选择中文、英文都可以,看个人需求。
8.添加一个除零错误的函数,在程序中调用,查看串口输出内容
void fault_test_by_div0(void) {
volatile int * SCB_CCR = (volatile int *) 0xE000ED14; // SCB->CCR
int x, y, z;*SCB_CCR |= (1 << 4); /* bit4: DIV_0_TRP. */
x = 10;
y = 0;
z = x / y;
printf("z:%d\n", z);
}
在函数中调用,可通过串口输出到PC机端,直观看到导致hardFault错误的原因。通过下载addr2line 工具,还可直接定位发生错误的函数所在的文件行数。addr2line的安装可自行百度。
CmBacktrace 库参考地址:https://download.csdn.net/download/m0_68510271/88560832?spm=1001.2014.3001.5503