首先,提出2个问题:
创建 STM32 工程并写了一段测试代码
char test_char = 0;
char i = 0;
int main(void) {
char test_data[1648];
test_char = 1;
test_data[0] = 100;
while (1) {
i++;
}
}
调试过程:
明明是给 test_data 的第一个元素赋值,结果 test_char 的值被修改了,并且 test_data 和 test_char 明明是两个完全不同的变量,再者,出现了这种错误程序也是正常运行的(i 正常计数),没有跑飞也没有进 hardfault!
Total RO Size (Code + RO Data) 780 ( 0.76kB)
Total RW Size (RW Data + ZI Data) 1648 ( 1.61kB)
Total ROM Size (Code + RO Data + RW Data) 796 ( 0.78kB)
可以看到,程序编译完成后 RW 的大小正好是1648!而这个 RW 区域到底包含了哪些东西?这里需要了解一个知识点,即此处的 RW(RW Data + ZI Data) 实际上在运行过程中处于我们的 RAM 区域。
在测试程序中定义的临时变量 test_data 为1648 个字节的大小,与整个 RAM 区的大小相等,也就是说,其会冲破栈区的大小限制,并且侵占整个 RAM 区: