計(jì)算CRC16出現(xiàn)兩次計(jì)算結(jié)果不同的問(wèn)題
傳入CRC計(jì)算函數(shù)的原始數(shù)據(jù)和長(zhǎng)度是一樣的,但是前后兩次計(jì)算的結(jié)果竟然不一樣。
開(kāi)發(fā)環(huán)境是KEIL5,mcu是一個(gè)2K/4K SRAM的M0內(nèi)核的單片機(jī)。
找了半天原因,還計(jì)算了一下堆棧:
目前在優(yōu)化等級(jí)為-O2時(shí),程序占用flash大小=Code + RO Data + RW Data = 12924+808+128 = 13860B = 13.5KB 占用flash大小=RW Data + ZI Data=128+1088 = 1216B = 1.19KB
目前在優(yōu)化等級(jí)為-O0時(shí),程序占用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,且出現(xiàn)遞歸創(chuàng)建函數(shù)容易導(dǎo)致棧溢出
已知堆(heap)的大小是0x100 = 256B,且手動(dòng)分配(malloc)后未進(jìn)行釋放(free)容易導(dǎo)致堆溢出
已知堆(stack)和棧(heap)存在于RAM中,占用256B*2 = 512B/1024 = 0.5KB
綜合1\2\5,目前固定RAM占用空間為1.19KB + 0.5KB = 1.69KB,且 所有系統(tǒng)運(yùn)行中產(chǎn)生的數(shù)據(jù)存放位置全都在RAM區(qū)
如上,算了一下當(dāng)前代碼的內(nèi)存情況,按說(shuō)不應(yīng)該優(yōu)化等級(jí)為-O0的時(shí)候溢出啊,但實(shí)際好像就是棧溢出了,把優(yōu)化等級(jí)改為-O2或者把棧改為512B的時(shí)候,CRC計(jì)算那部分程序就正常了。
參考 修改編譯優(yōu)化選項(xiàng)后導(dǎo)致bug的原因分析_#include<>_半斗米的博客-CSDN博客 這篇文章,提到了O0比O2使用的堆棧大的多,可能是這個(gè)原因吧。
另外高級(jí)單片機(jī)一般可以按下圖這樣,在仿真的時(shí)候觀察堆棧的使用情況:

還可以在.map文件中查看相關(guān)的內(nèi)存情況,如果沒(méi)有,可以按下圖這樣勾選:
