女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

stm32一個強(qiáng)制類型轉(zhuǎn)換死機(jī)bug解讀

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

1情景

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

bug菌 : my god !別慌,我問一下負(fù)責(zé)的A工。

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

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

經(jīng)過一番折騰,發(fā)現(xiàn)由于程序測試不到位,導(dǎo)致了一個強(qiáng)制類型轉(zhuǎn)化引發(fā)的進(jìn)入異常,這里就分享給大家。

2bug演示

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

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

wKgZomVn56OAAs5LAADmeanYIhM305.png

wKgZomVn56OADaDMAACfMRZs60g097.png

A工用一個double類型取地址,然后把地址強(qiáng)制轉(zhuǎn)為uint64_t類型,以此類型指針取內(nèi)容,當(dāng)這段代碼執(zhí)行完程序就跳到了異常中斷,導(dǎo)致死機(jī)。

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

3bug解讀

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

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

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

wKgaomVn56OAUv0xAAApXkusAO4757.png

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

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

對齊可以在一定程度上提高數(shù)據(jù)提取的效率,一旦起始地址沒有對齊會導(dǎo)致對齊錯誤,所以上面的double浮點類型的結(jié)構(gòu)體變量沒有8字節(jié)地址對齊,當(dāng)進(jìn)行強(qiáng)制類型轉(zhuǎn)化并使用LDRD指令就導(dǎo)致未對齊故障。

3更專業(yè)點

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

對于非對齊指令的執(zhí)行會導(dǎo)致指令用法上的故障,那么Cortex芯片中相應(yīng)的故障寄存器標(biāo)志位會置位。

wKgZomVn56OAXsjIAAD6gtbDfa0001.png

wKgaomVn56OAFxOyAAEE4KKaqeA008.png

以上來自于Cortex技術(shù)文檔,文檔中也寫得非常的詳細(xì)。

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

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


審核編輯:湯梓紅

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

    關(guān)注

    2290

    文章

    11017

    瀏覽量

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

    關(guān)注

    30

    文章

    4887

    瀏覽量

    70271
  • BUG
    BUG
    +關(guān)注

    關(guān)注

    0

    文章

    156

    瀏覽量

    15962

原文標(biāo)題:stm32一個強(qiáng)制類型轉(zhuǎn)換死機(jī),讓我付出了慘痛的代價~

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

收藏 人收藏

    評論

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

    C語言中強(qiáng)制類型轉(zhuǎn)化

    可以使用強(qiáng)制類型轉(zhuǎn)換來將段內(nèi)存轉(zhuǎn)換為需要的數(shù)據(jù)類型,例如下面有
    的頭像 發(fā)表于 09-09 08:58 ?2490次閱讀
    C語言中<b class='flag-5'>強(qiáng)制</b><b class='flag-5'>類型</b>轉(zhuǎn)化

    TCP中強(qiáng)制類型轉(zhuǎn)換

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

    laview中強(qiáng)制類型轉(zhuǎn)換控件使用的些心得

    Labview中有控件叫“強(qiáng)制類型轉(zhuǎn)換”,以前直沒弄明白怎么使用它,今天仔細(xì)研究了下,發(fā)現(xiàn)
    發(fā)表于 01-19 20:26

    強(qiáng)制類型轉(zhuǎn)換問題

    本帖最后由 applevs 于 2017-5-24 23:03 編輯 char*強(qiáng)制轉(zhuǎn)換為short*后,每兩個字節(jié)組成新的short類型
    發(fā)表于 05-24 22:44

    奇怪的現(xiàn)象,增加結(jié)構(gòu)節(jié)點后,影響強(qiáng)制類型轉(zhuǎn)換的速度

    今天做了實驗,發(fā)現(xiàn)了很奇怪的現(xiàn)象,圖中的程序運(yùn)行非常的快,圖二中顯示了程序運(yùn)行10秒時的循環(huán)次數(shù)。然后在強(qiáng)制類型轉(zhuǎn)換外面加了
    發(fā)表于 06-08 16:07

    請問使用強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換函數(shù)的時候,數(shù)據(jù)類型type端該如何設(shè)置,才能使數(shù)據(jù)成功轉(zhuǎn)換類型

    本帖最后由 只耳朵怪 于 2018-6-26 08:51 編輯 使用強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換函數(shù)的時候,數(shù)據(jù)類型type端該如何設(shè)置,才能使
    發(fā)表于 06-25 20:33

    這算是STM32BUG嗎?

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

    基礎(chǔ):stateflow中變量的強(qiáng)制類型轉(zhuǎn)換

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

    清除labview的強(qiáng)制類型轉(zhuǎn)換的緩存

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

    iOS 10-iOS 10.2.1驚現(xiàn)大BUG!按下這兩鍵立刻死機(jī)

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

    蘋果iOS10.2出現(xiàn)死機(jī)Bug,只需按下兩鍵,輕松解決

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

    強(qiáng)制類型轉(zhuǎn)換是把變量從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型

    類型轉(zhuǎn)換可以是隱式的,由編譯器自動執(zhí)行,也可以是顯式的,通過使用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符來指定。在編程時,有需要
    的頭像 發(fā)表于 11-12 14:59 ?9857次閱讀

    C++之類型轉(zhuǎn)換函數(shù)詳解

    轉(zhuǎn)換構(gòu)造函數(shù)的學(xué)習(xí):1、回憶數(shù)據(jù)類型轉(zhuǎn)換:在平時寫代碼的時候,最怕的就是那種隱式數(shù)據(jù)類型轉(zhuǎn)換
    的頭像 發(fā)表于 12-24 15:31 ?1004次閱讀

    STM32復(fù)位死機(jī)(無法啟動)

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

    C語言如何掌握強(qiáng)制類型轉(zhuǎn)換的精髓

    強(qiáng)制類型轉(zhuǎn)換是把變量從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。例如,如果您想存儲
    的頭像 發(fā)表于 02-26 11:00 ?738次閱讀
    C語言如何掌握<b class='flag-5'>強(qiáng)制</b><b class='flag-5'>類型</b><b class='flag-5'>轉(zhuǎn)換</b>的精髓