加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

遇見一個(gè)編譯優(yōu)化導(dǎo)致的 bug

06/12 10:00
796
閱讀需 3 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

來(lái)源:公眾號(hào)【魚鷹談單片機(jī)】,作者:魚鷹Osprey,ID ??:emOsprey

最近在調(diào)試 can 通信,因?yàn)?c8t6 flash 很小,而魚鷹培訓(xùn)工程完成的驅(qū)動(dòng)越來(lái)越多,導(dǎo)致 flash 不足,因此把 bsp 的優(yōu)化級(jí)別設(shè)置成?-O2,誰(shuí)知道在串口輸入數(shù)據(jù)時(shí)直接 hardfault 了:

進(jìn)一步跟蹤發(fā)現(xiàn)問題出在這條代碼中:

uint32_t?cnt?=?*((?uint32_t*)pinfo->pdma_cnt_rx);?// 出錯(cuò)代碼.....pinfo->last_dma_cnt = cnt;

這條代碼最開始是這樣

uint16_t?cnt?=?*((?uint16_t*)pinfo->pdma_cnt_rx);

因?yàn)槲业膌ast_dma_cnt 變量是 16 bit,我想節(jié)省一下 ram 空間,因?yàn)閷?shí)際上 DMA計(jì)數(shù)器也只使用了 16 bit。

uint16_t        last_dma_cnt;       // used in dma

但是測(cè)試時(shí)發(fā)現(xiàn)出現(xiàn) hardfault 了,通過匯編分析發(fā)現(xiàn)是非四字節(jié)對(duì)齊訪問 dma 外設(shè),后面通過修改代碼,強(qiáng)制使用 32 bit 訪問,就再也沒出現(xiàn)問題了。

uint32_t cnt = *(( uint32_t*)pinfo->pdma_cnt_rx);

但昨天修改完編譯優(yōu)化級(jí)別后,又一次出現(xiàn)了,匯編分析發(fā)現(xiàn)還是對(duì)齊問題,因?yàn)?0x4002005c 這個(gè)地址確實(shí)是 DMA 的計(jì)數(shù)器地址。

只是再優(yōu)化后,沒按我的要求 32?bit 訪問,而是自作主張使用?16?bit?訪問,因?yàn)樗l(fā)現(xiàn) cnt 這個(gè)變量操作的地方都是 16 bit,想當(dāng)然的給我在取值時(shí)也給我直接優(yōu)化成 16 bit 訪問。

這樣一來(lái),由于 DMA 不支持 2 字節(jié)訪問指令,因此直接 hardfault 了。為了解決這個(gè)優(yōu)化問題,可以直接使用 volatile 關(guān)鍵字,保證編譯器在取值時(shí)按照 4 字節(jié)對(duì)齊訪問,如下:

uint32_t cnt = *((volatile uint32_t*)pinfo->pdma_cnt_rx);  // must: volatile uint32_t匯編代碼0x0800BCA6 6800      LDR      r0,[r0,#0x00]

完結(jié)撒花!

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
EPCS16SI8N 1 Intel Corporation Configuration Memory, 16MX1, Serial, CMOS, PDSO8, LEAD FREE, PLASTIC, SOIC-8

ECAD模型

下載ECAD模型
$17.33 查看
NC7WZ14EP6X 1 onsemi TinyLogic UHS Dual Inverter with Schmitt Trigger Inputs, 3000-REEL

ECAD模型

下載ECAD模型
$0.42 查看
TORX1952A(F) 1 Toshiba America Electronic Components FIBER OPTIC RECEIVER
$8.35 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

六年開發(fā)經(jīng)驗(yàn),豐富的KEIL調(diào)試經(jīng)驗(yàn),STM32使用經(jīng)驗(yàn),C語(yǔ)言運(yùn)用經(jīng)驗(yàn)。