如题,如果因为一些偶然的因素,导致开始思考这样的问题,那一定会使人迷惑,如果进而对STM32启动流程、编译链接原理、内存管理、Flash编程、Keil V5的魔术棒设置项等再研究一遍,最终纠缠无果的时候,真是令人烦恼万千……
实际上,此二者没有直接关系!
最后原因真的很大众,就是数组越界操作。
我要说的是,之所以会复杂化这个问题,是因为不是所有的数组越界操作都会导致运行时报错,原因在于如果这个指针指向的值是有效值,程序就会正常运行。
所以就出现了以下两种代码,一个报错一个正常:
1. char VER_ST111R[30] = "V1.0.0.190614fwegsdfasf_DEV"; 运行出现HardFault_Handler错误
2. const char VER_ST111R[30] = "V1.0.0.190614fwegsdfasf_DEV"; 正常运行
以上表面现象让人联想到RAM空间的分配,这就容易产生很大的误导。
加了const之后,RW-data中的数据就被剔除了一部分,数组越界访问的数值就会出现变化,偶然中规避了错误的发生。
参考:
1. 硬件错误的解决