在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

來源:公眾號【魚鷹談單片機(jī)

作者:魚鷹Osprey

ID :emOsprey

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

圖片

進(jìn)一步跟蹤發(fā)現(xià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

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

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

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

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

圖片

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

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

圖片

完結(jié)撒花!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • CAN通信
    +關(guān)注

    關(guān)注

    5

    文章

    97

    瀏覽量

    18330
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1586

    瀏覽量

    78939
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70306
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    676

    瀏覽量

    33788

原文標(biāo)題:遇見一個(gè)編譯優(yōu)化導(dǎo)致的 bug

文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    RISC-V中個(gè)優(yōu)化導(dǎo)致的問題案例

    本文介紹個(gè)優(yōu)化導(dǎo)致的問題案例
    的頭像 發(fā)表于 06-08 10:02 ?1271次閱讀
    RISC-V中<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>導(dǎo)致</b>的問題案例

    IDF4.2.1的編譯優(yōu)化bug導(dǎo)致panic怎么處理?

    == 0) && (status.st_utx_out == 0));} 它是個(gè)inline函數(shù)。我們都認(rèn)為inline關(guān)鍵字,會(huì)告訴編譯器內(nèi)聯(lián)此函數(shù),于是它的代碼
    發(fā)表于 06-21 10:55

    推薦個(gè)時(shí)序優(yōu)化的軟件~~

    Hi,以前在學(xué)校的時(shí)候就經(jīng)常遇見時(shí)序收斂的問題,尤其是改RTL好麻煩啊。工作以后和朋友們起做了個(gè)時(shí)序優(yōu)化的軟件,叫InTime,希望可以幫助有相同問題的朋友。^_^我們搞了免費(fèi)試用的
    發(fā)表于 05-11 10:55

    編譯優(yōu)化導(dǎo)致USART波特率配置錯(cuò)誤,請問這是為什么?如何解決?

    菜鳥枚,遇到問題上網(wǎng)找不到答案,只好自己嘗試,請大神指教。 問題描述:配置USART的波特率為38400,結(jié)果無法成功接收數(shù)據(jù),檢查后發(fā)現(xiàn)波特率配置寄存器BRR錯(cuò)誤, 編譯優(yōu)化導(dǎo)致
    發(fā)表于 07-06 03:05

    由于InnoDB MVCC導(dǎo)致的并發(fā)BUG介紹

    [原]記錄個(gè)由于InnoDB MVCC導(dǎo)致的并發(fā)BUG
    發(fā)表于 07-17 09:46

    IAR編譯優(yōu)化等級設(shè)置介紹

    有限時(shí)可選擇針對代碼大小進(jìn)行優(yōu)化,對應(yīng)用實(shí)時(shí)響應(yīng)要求較高的情形則應(yīng)選擇針對代碼運(yùn)行速度進(jìn)行優(yōu)化。且需注意在項(xiàng)目調(diào)試過程中不應(yīng)將優(yōu)化等級設(shè)置的過高,因高度優(yōu)化會(huì)
    發(fā)表于 11-21 17:36

    IAR9202編譯優(yōu)化導(dǎo)致代碼流程出錯(cuò)

    遇到個(gè)IAR編譯優(yōu)化的問題:本想在profile中write callback中做特征值的有效性檢查,卻發(fā)現(xiàn)編譯
    發(fā)表于 03-05 07:46

    rt-studio bug導(dǎo)致編譯失敗如何解決

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

    rt-studio bug導(dǎo)致編譯失敗如何處理?

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

    編譯器_keil的優(yōu)化選項(xiàng)問題

    keil編譯器的優(yōu)化選項(xiàng)針對ARM,對STM32編譯優(yōu)化的問題
    發(fā)表于 02-25 14:18 ?3次下載

    微軟又證實(shí)Bug Windows 10或導(dǎo)致無法訪問互聯(lián)網(wǎng)

    據(jù)外媒報(bào)道稱,微軟證實(shí)了個(gè)新的Bug,那就是Windows 10存在個(gè)可能導(dǎo)致無法訪問互聯(lián)網(wǎng)
    的頭像 發(fā)表于 03-28 11:20 ?2391次閱讀

    個(gè)冗余電路導(dǎo)致BUG

      昨天解了個(gè)BUG個(gè)低級錯(cuò)誤導(dǎo)致BUG
    的頭像 發(fā)表于 05-14 15:28 ?1160次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>冗余電路<b class='flag-5'>導(dǎo)致</b>的<b class='flag-5'>BUG</b>

    Android編譯優(yōu)化之混淆配置

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

    Triton編譯器的優(yōu)化技巧

    在現(xiàn)代計(jì)算環(huán)境中,編譯器的性能對于軟件的運(yùn)行效率至關(guān)重要。Triton 編譯器作為個(gè)先進(jìn)的編譯器框架,提供了
    的頭像 發(fā)表于 12-25 09:09 ?834次閱讀
    主站蜘蛛池模板: 4hu影院最新地址www | 久久综合一 | 一级做a爰片久久毛片免费看 | a免费网站 | 2018天天操夜夜操 | 白嫩少妇激情无码 | 伊人久久大香线蕉综合影 | 久久精品国产精品亚洲人人 | 色六月婷婷 | 久久伊人男人的天堂网站 | 狠狠做深爱婷婷久久一区 | 国产久爱青草视频在线观看 | 成人狠狠色综合 | 午夜人成 | 女人色网 | 天堂bt资源新版在线 | 日韩一级精品视频在线观看 | 国产香蕉98碰碰久久人人 | 免费看曰批女人爽的视频网址 | a欧美视频 | 国产精品天天看天天爽 | 欧美日本一区二区三区 | 亚洲视屏一区 | 夜夜橹橹网站夜夜橹橹 | 成年人看的毛片 | 一级特黄牲大片免费视频 | 99久久999久久久综合精品涩 | 性欧美大战久久久久久久 | 丁香综合在线 | www你懂的| 天天干在线观看 | 亚洲一区二区三区影院 | 成年美女黄网站色大免费视频 | 尤物久久99热国产综合 | 色网站在线 | 免费一级特黄 欧美大片 | 快播久久 | 狠狠色噜噜狠狠色综合久 | 69日本xxxxxxxxx96| 国产在线黄 | 免费被视频网站在线观看 |