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

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

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

3天內不再提示

stm32一個強制類型轉換死機bug解讀

嵌入式情報局 ? 來源:最后一個bug ? 2023-11-30 09:31 ? 次閱讀

1情景

售后 : X工,現場出大事了,今天升級的程序跑著跑著就掛了!現在整個產線都等著這個設備恢復,能安排個人過來支援下嗎?

bug菌 : my god !別慌,我問一下負責的A工。

bug菌 : 喂,A工,昨天升級的程序有問題,程序卡死,售后在現場你聯系一下,支援他一波,順便把程序發送給我一份,一起看看!

A工 : 啊,還有這種事,程序沒改什么呀,行,我跟售后聯系一下。

經過一番折騰,發現由于程序測試不到位,導致了一個強制類型轉化引發的進入異常,這里就分享給大家。

2bug演示

這是一個老項目,采用stm32F4芯片為主控,由于硬件限制而客戶又不愿意花大價錢改造,所以程序架構等等都沒有再大動作,由于通信上的傳輸和解析都是字節流,一些小的需求都只是在原來的通信架構上把4個字節拆成2個字節來用,然而這一次實在沒辦法沒改接收數據類型,然后把一個double類型拆成了4個uint16來使用,沒想到出問題了。

所以這里簡單的模擬演示了一下:

wKgZomVn56OAAs5LAADmeanYIhM305.png

wKgZomVn56OADaDMAACfMRZs60g097.png

A工用一個double類型取地址,然后把地址強制轉為uint64_t類型,以此類型指針取內容,當這段代碼執行完程序就跳到了異常中斷,導致死機。

其實這段代碼對于經驗豐富的人來說,一看就覺得很變扭,但是無論如何也不至于死機呀,畢竟強制類型轉化大部分人拿來都是隨便用。

3bug解讀

當看到A工寫的這一套代碼,bug菌其實隱隱約約就感覺這塊有些問題,但是沒敢確定,畢竟整套代碼也是前人留下的,全是邏輯沒什么精華也沒有過細研究,最后看這段代碼的匯編才知道問題所在。

在之前bug菌也曾比較詳細的出過一篇分析此類問題的文章,可能這一塊并沒有吸引到你,不過還是一句話:"出來混都是要還的!"。

其實問題就出在LDRD這個ARM匯編指令上,LDRD指令表示從指定內存地址取double word,上面圖片代碼中的LDRD R0,R1,[R2,#0x2EC],可以分解為下面兩個ldr步驟 :

wKgaomVn56OAUv0xAAApXkusAO4757.png

在ARM匯編指令集中LDRD和STRD是一對加載和提取指令,一般都需要使用__align(8)修飾來保證數據對象進行8直接對齊,而使用#pragma pack(8)是來指定結構體成員變量相對于第一個變量的地址的偏移量的對齊方式。

__align指示編譯器在 n 字節邊界上對齊變量,是一個存儲類修飾符,當然也可以以讓2字節的對象進行4字節對齊其與8字節對齊是等價的,一定要記得是存儲的起始地址為8的整數倍。

對齊可以在一定程度上提高數據提取的效率,一旦起始地址沒有對齊會導致對齊錯誤,所以上面的double浮點類型的結構體變量沒有8字節地址對齊,當進行強制類型轉化并使用LDRD指令就導致未對齊故障。

3更專業點

當然對于跳轉到硬件異常的故障是非常好排查的,下面這篇文章教你如何迅速的定位故障位置和故障信息 :

對于非對齊指令的執行會導致指令用法上的故障,那么Cortex芯片中相應的故障寄存器標志位會置位。

wKgZomVn56OAXsjIAAD6gtbDfa0001.png

wKgaomVn56OAFxOyAAEE4KKaqeA008.png

以上來自于Cortex技術文檔,文檔中也寫得非常的詳細。

CPU嘗試做一個未對齊的內存訪問,然后就會發生此錯誤。特別是對于未對齊的LDM/STM/LDRD/STRD指令,所以進入異常中斷以后查詢芯片內部故障寄存器也是可以找到問題所在的,對于使用仿真器排查是再簡單不過了,如果是離線排查就需要進行上篇文章那樣打印相關日志來定位問題。

本文來源:公眾號:最后一個bug


審核編輯:湯梓紅

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

    關注

    2272

    文章

    10925

    瀏覽量

    357654
  • 代碼
    +關注

    關注

    30

    文章

    4829

    瀏覽量

    69074
  • BUG
    BUG
    +關注

    關注

    0

    文章

    155

    瀏覽量

    15725

原文標題:stm32一個強制類型轉換死機,讓我付出了慘痛的代價~

文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言中強制類型轉化

    可以使用強制類型轉換來將段內存轉換為需要的數據類型,例如下面有
    的頭像 發表于 09-09 08:58 ?2358次閱讀
    C語言中<b class='flag-5'>強制</b><b class='flag-5'>類型</b>轉化

    TCP中強制類型轉換

    這是完整程序第一個和第二強制類型轉換都有什么用啊我加了顯示控件,但是顯示亂碼求指點~~~
    發表于 04-15 19:42

    laview中強制類型轉換控件使用的些心得

    Labview中有控件叫“強制類型轉換”,以前直沒弄明白怎么使用它,今天仔細研究了下,發現
    發表于 01-19 20:26

    強制類型轉換問題

    本帖最后由 applevs 于 2017-5-24 23:03 編輯 char*強制轉換為short*后,每兩個字節組成新的short類型
    發表于 05-24 22:44

    奇怪的現象,增加結構節點后,影響強制類型轉換的速度

    今天做了實驗,發現了很奇怪的現象,圖中的程序運行非常的快,圖二中顯示了程序運行10秒時的循環次數。然后在強制類型轉換外面加了
    發表于 06-08 16:07

    請問使用強制數據類型轉換函數的時候,數據類型type端該如何設置,才能使數據成功轉換類型

    本帖最后由 只耳朵怪 于 2018-6-26 08:51 編輯 使用強制數據類型轉換函數的時候,數據類型type端該如何設置,才能使
    發表于 06-25 20:33

    這算是STM32BUG嗎?

    死機后串口就直發送同一個數據,從仿真看是死在中斷函數里面。 猜想:STM32的其他外設也有同樣問題。未測試。
    發表于 08-27 10:30

    基礎:stateflow中變量的強制類型轉換

    使用:例:我定義了變量speed作為輸出,某時刻指定speed=0,當我把speed改為uint8類型,就報錯誤,找了陣沒找到方法,就放棄了。今天在看別的帖子是發現了
    發表于 10-29 10:42

    清除labview的強制類型轉換的緩存

    請問如何將labview的強制類型轉換的緩存如何清除?我在使用Picture to IMAQ image 官方vi時,如果運行時間過久,視頻流中的圖片過多,還原像素圖.vi就會造成內存不足,
    發表于 02-15 20:36

    iOS 10-iOS 10.2.1驚現大BUG!按下這兩鍵立刻死機

    近日,有用戶在 iPhone 的系統控制中心中發現了「詭異」BUG,只要上劃屏幕呼出控制中心,并同時按下 AirDrop 與拍照鍵,就會造成手機死機,并且重啟。有網友表示,“再牛x
    發表于 02-08 22:55 ?1.5w次閱讀

    蘋果iOS10.2出現死機Bug,只需按下兩鍵,輕松解決

    蘋果的IOS系統,堪稱完美的用戶體驗,但是,面對目前的競爭,IOS的更新越來越快,頻次越來越高。所以,很多BUG的出現,也很奇怪。最近蘋果iOS 10.2出現死機Bug,如何解決呢。
    發表于 02-10 00:35 ?5218次閱讀

    強制類型轉換是把變量從一種類型轉換為另一種數據類型

    類型轉換可以是隱式的,由編譯器自動執行,也可以是顯式的,通過使用強制類型轉換運算符來指定。在編程時,有需要
    的頭像 發表于 11-12 14:59 ?9703次閱讀

    C++之類型轉換函數詳解

    轉換構造函數的學習:1、回憶數據類型轉換:在平時寫代碼的時候,最怕的就是那種隱式數據類型轉換
    的頭像 發表于 12-24 15:31 ?890次閱讀

    STM32復位死機(無法啟動)

    STM32使用IWDG死機嗯,不知道怎么說,stm32的看門狗死機了,下面是仿真時報錯信息:The processor has escalated a configurable-pri
    發表于 12-09 09:06 ?9次下載
    <b class='flag-5'>STM32</b>復位<b class='flag-5'>死機</b>(無法啟動)

    C語言如何掌握強制類型轉換的精髓

    強制類型轉換是把變量從一種類型轉換為另一種數據類型。例如,如果您想存儲
    的頭像 發表于 02-26 11:00 ?569次閱讀
    C語言如何掌握<b class='flag-5'>強制</b><b class='flag-5'>類型</b><b class='flag-5'>轉換</b>的精髓
    主站蜘蛛池模板: 色www永久免费 | 欧美色视频在线 | 第一页综合| 久热国产精品视频 | 日韩黄色网址 | 亚洲第一视频 | 97se亚洲综合| 色噜噜成人综合网站 | 欧亚激情偷乱人伦小说视频 | 亚洲最大成人在线 | 亚洲成人三级电影 | 四虎影院在线免费观看视频 | 四虎网站网址 | 天天插在线视频 | 婷婷综合色 | 亚洲色图27p | 亚洲1区2区3区4区 | 男女交性视频免费视频 | 日韩精品在线第一页 | 欧美作爱福利免费观看视频 | 又黄又视频 | 亚洲小视频 | 中文字幕一区二区三区 精品 | 成人三级视频 | 噜噜噜久久 | 五月天婷婷基地 | www.婷婷.com| 91亚洲国产成人久久精品网站 | ww欧洲ww在线视频免费观看 | 久久99操| 特级a毛片| 天天看天天操 | 日韩午夜大片 | 美女屁屁免费视频网站 | 天天操狠狠操夜夜操 | 曰韩毛片| 97av在线| 嘿嘿嘿视频在线观看 | 久久性妇女精品免费 | 成人夜色香网站在线观看 | www国产永久免费视频看看 |