传入CRC计算函数的原始数据和长度是一样的,但是前后两次计算的结果竟然不一样。
开发环境是KEIL5,mcu是一个2K/4K SRAM的M0内核的单片机。
找了半天原因,还计算了一下堆栈:
- 目前在优化等级为-O2时,程序占用flash大小=Code + RO Data + RW Data = 12924+808+128 = 13860B = 13.5KB 占用flash大小=RW Data + ZI Data=128+1088 = 1216B = 1.19KB
- 目前在优化等级为-O0时,程序占用flash大小=Code + RO Data + RW Data = 16920+808+128 = 16856B = 17.43KB 占用flash大小=RW Data + ZI Data=128+1088 = 1216B = 1.19KB
- 已知栈(stack)的大小是0x100 = 256B,且出现递归创建函数容易导致栈溢出
- 已知堆(heap)的大小是0x100 = 256B,且手动分配(malloc)后未进行释放(free)容易导致堆溢出
- 已知堆(stack)和栈(heap)存在于RAM中,占用256B*2 = 512B/1024 = 0.5KB
- 综合a\b\e,目前固定RAM占用空间为1.19KB + 0.5KB = 1.69KB,且所有系统运行中产生的数据存放位置全都在RAM区
如上,算了一下当前代码的内存情况,按说不应该优化等级为-O0的时候溢出啊,但实际好像就是栈溢出了,把优化等级改为-O2或者把栈改为512B的时候,CRC计算那部分程序就正常了。
参考修改编译优化选项后导致bug的原因分析_#include<>_半斗米的博客-CSDN博客这篇文章,提到了O0比O2使用的堆栈大的多,可能是这个原因吧。
另外高级单片机一般可以按下图这样,在仿真的时候观察堆栈的使用情况:
还可以在.map文件中查看相关的内存情况,如果没有,可以按下图这样勾选: