成人免费无码不卡毛片,亚洲AⅤ无码精品一区二区三区,国产尤物精品视频,久久精品日本亚洲,欧美成人一区三区无码乱码A片,中文字日产幕码一区二区色哟哟,亞洲日韓中文字幕網AV

  • 正文
  • 推薦器件
  • 相關推薦
申請入駐 產業(yè)圖譜

遇見一個編譯優(yōu)化導致的 bug

2024/06/12
714
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

來源:公眾號【魚鷹談單片機】,作者:魚鷹Osprey,ID ??:emOsprey

最近在調試 can 通信,因為 c8t6 flash 很小,而魚鷹培訓工程完成的驅動越來越多,導致 flash 不足,因此把 bsp 的優(yōu)化級別設置成?-O2,誰知道在串口輸入數(shù)據時直接 hardfault 了:

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

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

這條代碼最開始是這樣

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

因為我的last_dma_cnt 變量是 16 bit,我想節(jié)省一下 ram 空間,因為實際上 DMA計數(shù)器也只使用了 16 bit。

uint16_t        last_dma_cnt;       // used in dma

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

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

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

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

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

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

完結撒花!

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據手冊 ECAD模型 風險等級 參考價格 更多信息
AT25256B-SSHL-B 1 Microchip Technology Inc IC EEPROM 256KBIT 20MHZ 8SOIC

ECAD模型

下載ECAD模型
$1.25 查看
SC32S-7PF20PPM 1 ABLIC Inc Parallel - Fundamental Quartz Crystal, 0.032768MHz Nom, LEAD FREE, SMD, 2 PIN
$0.61 查看
DP83869HMRGZT 1 Texas Instruments Extended temperature, high-immunity gigabit Ethernet PHY transceiver with copper & fiber interface 48-VQFN -40 to 125

ECAD模型

下載ECAD模型
$13.8 查看

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄
青铜峡市| 横山县| 政和县| 成武县| 广灵县| 乌鲁木齐县| 开化县| 静安区| 乐安县| 平舆县| 临城县| 无为县| 女性| 西畴县| 六安市| 都昌县| 镇坪县| 宿松县| 阜康市| 宜兴市| 华安县| 康乐县| 报价| 汕尾市| 林芝县| 建阳市| 高唐县| 庆阳市| 巴中市| 灵宝市| 冀州市| 调兵山市| 兴宁市| 灵璧县| 普兰县| 全椒县| 广饶县| 冀州市| 开江县| 玛纳斯县| 永泰县|