吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

遇見一個編譯優化導致的bug

魚鷹談單片機 ? 來源:魚鷹談單片機 ? 2024-08-12 17:26 ? 次閱讀

來源:公眾號【魚鷹談單片機

作者:魚鷹Osprey

ID :emOsprey

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

圖片

進一步跟蹤發現問題出在這條代碼中:

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

這條代碼最開始是這樣

uint16_tcnt=*((uint16_t*)pinfo->pdma_cnt_rx);

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

uint16_t        last_dma_cnt;       // used in dma

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

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

但昨天修改完編譯優化級別后,又一次出現了,匯編分析發現還是對齊問題,因為0x4002005c 這個地址確實是 DMA 的計數器地址。

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

圖片

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

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

圖片

完結撒花!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • CAN通信
    +關注

    關注

    5

    文章

    94

    瀏覽量

    17943
  • 串口
    +關注

    關注

    14

    文章

    1558

    瀏覽量

    77064
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69058
  • 編譯
    +關注

    關注

    0

    文章

    661

    瀏覽量

    33047

原文標題:遇見一個編譯優化導致的 bug

文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【GCC編譯優化系列】前后編譯的兩版本固件bin大小不樣?

    【GCC編譯優化系列】前后編譯的兩版本固件bin大小不樣,怎么辦?
    的頭像 發表于 09-09 09:01 ?4871次閱讀
    【GCC<b class='flag-5'>編譯</b><b class='flag-5'>優化</b>系列】前后<b class='flag-5'>編譯</b>的兩版本固件bin大小不<b class='flag-5'>一</b>樣?

    RISC-V中優化導致的問題案例

    本文介紹優化導致的問題案例
    的頭像 發表于 06-08 10:02 ?834次閱讀
    RISC-V中<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>優化</b><b class='flag-5'>導致</b>的問題案例

    IDF4.2.1的編譯優化bug導致panic怎么處理?

    == 0) && (status.st_utx_out == 0));} 它是inline函數。我們都認為inline關鍵字,會告訴編譯器內聯此函數,于是它的代碼
    發表于 06-21 10:55

    推薦時序優化的軟件~~

    Hi,以前在學校的時候就經常遇見時序收斂的問題,尤其是改RTL好麻煩啊。工作以后和朋友們起做了時序優化的軟件,叫InTime,希望可以幫助有相同問題的朋友。^_^我們搞了免費試用的
    發表于 05-11 10:55

    編譯優化導致USART波特率配置錯誤,請問這是為什么?如何解決?

    菜鳥枚,遇到問題上網找不到答案,只好自己嘗試,請大神指教。 問題描述:配置USART的波特率為38400,結果無法成功接收數據,檢查后發現波特率配置寄存器BRR錯誤, 編譯優化導致
    發表于 07-06 03:05

    由于InnoDB MVCC導致的并發BUG介紹

    [原]記錄由于InnoDB MVCC導致的并發BUG
    發表于 07-17 09:46

    IAR編譯優化等級設置介紹

    有限時可選擇針對代碼大小進行優化,對應用實時響應要求較高的情形則應選擇針對代碼運行速度進行優化。且需注意在項目調試過程中不應將優化等級設置的過高,因高度優化
    發表于 11-21 17:36

    IAR9202編譯優化導致代碼流程出錯

    遇到IAR編譯優化的問題:本想在profile中write callback中做特征值的有效性檢查,卻發現編譯
    發表于 03-05 07:46

    rt-studio bug導致編譯失敗如何解決

    我使用rt-studio 編譯工程 , 使用左上角的構建功能 編譯成功,但是如果是由旁邊的重新構建,就會報錯,錯誤如下樣的文件,使用構建就可以,重新構建就不可以,而且在使用重新構建后,再使用構建
    發表于 11-08 10:19

    rt-studio bug導致編譯失敗如何處理?

    我使用rt-studio 編譯工程 , 使用左上角的構建功能編譯成功,但是如果是由旁邊的重新構建,就會報錯,錯誤如下 樣的文件,使用構建就可以,重新構建就不可以,而且在使用重新構建后,再使用構建
    發表于 04-27 10:54

    編譯器_keil的優化選項問題

    keil編譯器的優化選項針對ARM,對STM32編譯優化的問題
    發表于 02-25 14:18 ?3次下載

    微軟又證實Bug Windows 10或導致無法訪問互聯網

    據外媒報道稱,微軟證實了新的Bug,那就是Windows 10存在可能導致無法訪問互聯網
    的頭像 發表于 03-28 11:20 ?2296次閱讀

    冗余電路導致BUG

      昨天解了BUG低級錯誤導致BUG
    的頭像 發表于 05-14 15:28 ?947次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個</b>冗余電路<b class='flag-5'>導致</b>的<b class='flag-5'>BUG</b>

    Android編譯優化之混淆配置

    為了使用java8及后續java新版本的特性,Google增加了編譯過程—脫糖(desugaring),但這步會導致更長的編譯時間,這
    的頭像 發表于 12-21 09:21 ?2478次閱讀
    Android<b class='flag-5'>編譯</b><b class='flag-5'>優化</b>之混淆配置

    Triton編譯器的優化技巧

    在現代計算環境中,編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為先進的編譯器框架,提供了
    的頭像 發表于 12-25 09:09 ?340次閱讀
    赌博百家乐官网判断决策| 顶级赌场官方安卓版手机下载| 百家乐官网平台信誉排名| 百家乐等投注网改单| 百家乐官网技术交流群| 开心8百家乐游戏| 网上百家乐官网如何作假| 首席百家乐的玩法技巧和规则| 威尼斯人娱乐场五星| 百家乐官网出千的方法| 天马娱乐城| 澳门百家乐游戏| 长春百家乐官网的玩法技巧和规则| 十六蒲娱乐城| 怎样玩百家乐才能| 百家乐官网注码技术打法| 大发888 大发国际| 温州市百家乐ktv招聘| 百家乐官网怎么对冲打| 帝王娱乐城开户| 威尼斯人娱乐城网址| 百家乐官网游戏方法| 百家乐官网投注网中国体育| 五华县| 南非太阳城皇宫酒店| 真人百家乐官网好不好玩| 平潭县| 大发888 bet娱乐场下载| 天堂鸟百家乐的玩法技巧和规则 | 免费百家乐官网奥| 百家乐官网是如何出千的| 宁陵县| 齐河县| 百家乐官网最长的缆| 大发888大奖| 大发888官方zhuce| 永利百家乐娱乐网| 新世纪娱乐城信誉怎么样| 总统百家乐的玩法技巧和规则| 新濠百家乐现金网| 网上百家乐官网指|