欢迎光临散文网 会员登陆 & 注册

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

2023-08-23 20:07 作者:大饼酱人  | 我要投稿

传入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. 综合1\2\5,目前固定RAM占用空间为1.19KB + 0.5KB = 1.69KB,且 所有系统运行中产生的数据存放位置全都在RAM区

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

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

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

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


计算CRC16出现两次计算结果不同的问题的评论 (共 条)

分享到微博请遵守国家法律