來(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)問(wèn)題出在這條代碼中:
uint32_tcnt=*((uint32_t*)pinfo->pdma_cnt_rx);// 出錯(cuò)代碼 ..... pinfo->last_dma_cnt = cnt;
這條代碼最開始是這樣
uint16_tcnt=*((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 了,通過(guò)匯編分析發(fā)現(xiàn)是非四字節(jié)對(duì)齊訪問(wèn) dma 外設(shè),后面通過(guò)修改代碼,強(qiáng)制使用 32 bit 訪問(wèn),就再也沒出現(xiàn)問(wèn)題了。
uint32_t cnt = *(( uint32_t*)pinfo->pdma_cnt_rx);
但昨天修改完編譯優(yōu)化級(jí)別后,又一次出現(xiàn)了,匯編分析發(fā)現(xiàn)還是對(duì)齊問(wèn)題,因?yàn)?x4002005c 這個(gè)地址確實(shí)是 DMA 的計(jì)數(shù)器地址。
只是再優(yōu)化后,沒按我的要求 32bit 訪問(wèn),而是自作主張使用16bit訪問(wèn),因?yàn)樗l(fā)現(xiàn) cnt 這個(gè)變量操作的地方都是 16 bit,想當(dāng)然的給我在取值時(shí)也給我直接優(yōu)化成 16 bit 訪問(wèn)。
這樣一來(lái),由于 DMA 不支持 2 字節(jié)訪問(wèn)指令,因此直接 hardfault 了。為了解決這個(gè)優(yōu)化問(wèn)題,可以直接使用 volatile 關(guān)鍵字,保證編譯器在取值時(shí)按照 4 字節(jié)對(duì)齊訪問(wèn),如下:
uint32_t cnt = *((volatile uint32_t*)pinfo->pdma_cnt_rx); // must: volatile uint32_t 匯編代碼 0x0800BCA6 6800 LDR r0,[r0,#0x00]
完結(jié)撒花!
-
CAN通信
+關(guān)注
關(guān)注
5文章
94瀏覽量
17946 -
串口
+關(guān)注
關(guān)注
14文章
1559瀏覽量
77129 -
代碼
+關(guān)注
關(guān)注
30文章
4834瀏覽量
69115 -
編譯
+關(guān)注
關(guān)注
0文章
661瀏覽量
33065
原文標(biāo)題:遇見一個(gè)編譯優(yōu)化導(dǎo)致的 bug
文章出處:【微信號(hào):emOsprey,微信公眾號(hào):魚鷹談單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
IDF4.2.1的編譯器優(yōu)化bug導(dǎo)致panic怎么處理?
推薦一個(gè)時(shí)序優(yōu)化的軟件~~
編譯器優(yōu)化導(dǎo)致USART波特率配置錯(cuò)誤,請(qǐng)問(wèn)這是為什么?如何解決?
IAR編譯優(yōu)化等級(jí)設(shè)置介紹
IAR9202編譯優(yōu)化導(dǎo)致代碼流程出錯(cuò)
rt-studio bug導(dǎo)致編譯失敗如何解決
rt-studio bug導(dǎo)致編譯失敗如何處理?
編譯器_keil的優(yōu)化選項(xiàng)問(wèn)題
微軟又證實(shí)一新Bug Windows 10或導(dǎo)致無(wú)法訪問(wèn)互聯(lián)網(wǎng)
Android編譯優(yōu)化之混淆配置
![Android<b class='flag-5'>編譯</b><b class='flag-5'>優(yōu)化</b>之混淆配置](https://file1.elecfans.com/web2/M00/B8/4F/wKgZomWDk4aAeIswAAAOV0xQF7o758.png)
評(píng)論