1、数组越界(对数组赋值)
正常情况,数组越界会进入 HardFault_Hander 中断函数的无线循环。
避免数组越界的一个方法是:每次使用数组前,检查要放入数据的数据长度是否大于数组长度,大于则进入while(1),方便定位,如果可以打印信息更好。
2、定义的局部数组过大,超过 IAR 设置的栈大小(未使用FreeRTOS)
单步运行时,刚执行完定义数组的语句不会立马进入 HardFault_Hander 中断函数,一般是再执行几个语句后进入
3、使用FreeRTOS,定义的局部数组过大,超过分配给数组所在的 task 的栈空间
单步运行时,刚执行完定义数组的语句不会立马进入 HardFault_Hander 中断函数,一般是再执行几个语句后进入
4、使用FreeRTOS,动态申请内存超过分配给FreeRTOS 可用 heap(总heap为configTOTAL_HEAP_SIZE)
单步运行时,刚执行完动态申请的语句不会立马进入 HardFault_Hander 中断函数,一般是再执行几个语句后进入
printf用的也是FreeRTOS中 heap 资源
5、使用STM32CubeMX生成的stm32f407xx_flash.icf
如果使用IAR自带的stm32f407xE.icf没有问题
6、数组越界(读取数组中的值)
比如下面函数,没有注释的那几条语句限制,会出现硬件异常
u8 *my_strstr(u8 *buf, u16 length, char *str) { u8 *p; u16 i,j; for(i=0,j=0; j<strlen(str);) { if(str[j] == buf[i]) { i++; j++; if(i >= length) { break; } }else { i++; j = 0; // if(i >= length) // { // break; // } } } if(j == strlen(str)) { p = buf+(i-strlen(str)); }else { p = NULL; } return p; }
7、读不能读的地址的数据,和6类似
比如读STM32 unique ID,读的地址写错了,违法读数据