计算CRC16出现两次计算结果不同的问题

传入CRC计算函数的原始数据和长度是一样的,但是前后两次计算的结果竟然不一样。

开发环境是KEIL5,mcu是一个2K/4K SRAM的M0内核的单片机。

找了半天原因,还计算了一下堆栈:

  1. 目前在优化等级为-O2时,程序占用flash大小=Code + RO Data + RW Data = 12924+808+128 = 13860B =  13.5KB   占用flash大小=RW Data + ZI Data=128+1088 = 1216B = 1.19KB
  2. 目前在优化等级为-O0时,程序占用flash大小=Code + RO Data + RW Data = 16920+808+128 = 16856B = 17.43KB    占用flash大小=RW Data + ZI Data=128+1088 = 1216B = 1.19KB
  3. 已知栈(stack)的大小是0x100 = 256B,且出现递归创建函数容易导致栈溢出
  4. 已知堆(heap)的大小是0x100 = 256B,且手动分配(malloc)后未进行释放(free)容易导致堆溢出
  5. 已知堆(stack)和栈(heap)存在于RAM中,占用256B*2 = 512B/1024 = 0.5KB
  6. 综合a\b\e,目前固定RAM占用空间为1.19KB + 0.5KB = 1.69KB,且所有系统运行中产生的数据存放位置全都在RAM区

如上,算了一下当前代码的内存情况,按说不应该优化等级为-O0的时候溢出啊,但实际好像就是栈溢出了,把优化等级改为-O2或者把栈改为512B的时候,CRC计算那部分程序就正常了。

参考修改编译优化选项后导致bug的原因分析_#include<>_半斗米的博客-CSDN博客这篇文章,提到了O0比O2使用的堆栈大的多,可能是这个原因吧。

另外高级单片机一般可以按下图这样,在仿真的时候观察堆栈的使用情况:

还可以在.map文件中查看相关的内存情况,如果没有,可以按下图这样勾选:

猜你喜欢

转载自blog.csdn.net/Fei_Yang_YF/article/details/132457773