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

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

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

3天內不再提示

顛覆你對ARM Cortex-M斷點認知

痞子衡嵌入式 ? 來源: 大寧筆記不重名 ? 2023-08-17 09:31 ? 次閱讀

1. 問題描述:

最近好久沒做筆記了,期間收到的很多后臺問題留言以及新的粉絲關注,感覺花時間碼的這些文字還是有用戶在認真閱讀的,節省了不少重復勞動。似乎每個夏季到了,離譜撞腦門子的問題就會變多,尤其一些車上的偶發問題復現難度很大甚是令人上頭,盡管分析過程中很花時間和精力,但是深究下去感覺還是收獲頗多。最近在支持BLE KW客戶時就遇到一個很隱蔽的問題,讓我對ARM斷點又有了顛覆性的認識,此處聊作記錄,也為讀者分析問題提供一個思路。

客戶在同一批次的KW36板子上燒錄同樣的代碼,都可以正常運行,但有幾塊板子會莫名其妙Hard fault,而且這幾塊板出現Hard fault的地點各不相同,其中一塊KW36板子是在收到某個固定UDS診斷服務執行處理時出現Hard fault,而且一旦問題出現該板子一直能重復復現問題。借助之前的一篇舊文《KW36 MCU Hard Fault問題查找和破解方法》通過Attach方式在Ozone IDE(Segger 出品的一個Debug神器)中連接上去Debug,很快查到導致Hard fault問題現場(沒白瞎之前花時間研究,大有一番練就打狗棒法,終于遇到一條狗的喜出望外),發現每次出錯的位置都在同一行C代碼,仔細檢查該段代碼只是個平淡無奇的一個函數調用,檢查過stack空間也確認沒有溢出,那為何會出錯呢?同樣的代碼為何只有這幾個板子出錯呢?

2. 問題分析:

本著花里胡哨的問題都是隱藏在最樸實無華角落的真理,去對比了下兩者的匯編(實際上是真的沒啥思路),偶然發現在Attach到問題板分別執行全速運行到出錯代碼行和單步運行到出錯代碼行時,兩者匯編竟然差異。如下圖右側是正常執行Attach到芯片得到的匯編代碼,左邊是出錯時的匯編代碼,發現出問題時匯編竟然出現了DC16和CDP2。DC16對應常量聲明,顯然DC16不應該在此處出現,CDP2是協處理器數據處理指令,KW36作為一個單核芯片,肯定無協處理器,更談不上協處理器指令。

b7c9f576-3c40-11ee-ac96-dac502259ad0.png

考慮到上述的調試操作都是在Attach方式,不存在因為代碼下載導致Flash內容被修改的可能,那可能只有兩個:IDE解析錯誤以及代碼被意外修改,顯然前者是個死胡同,無從查起。于是順著第二條路Dump芯片內二進制(左側)和原始二進制文件(右側)對比發現兩者Flash確實有差異。如下圖所示,F000的值被修改成了BE00,同時處理CRC校驗值也被修改,So什么原因導致Flash被修改了呢?

b7ebc304-3c40-11ee-ac96-dac502259ad0.png

以前有概念說斷點會程序代碼做修改,但這個二進制碼的修改如何和斷點扯上關系呢?于是開始了漫長的Google/Bing/度娘/ARM各種文檔里面輪番挖呀挖呀挖,直到挖出Cortex-M3權威指南中提到如下一句"BKPT 指令的機器碼是 0xBE00",頓時豁然開朗,坐實了斷點導致Flash內容被修改。

b81b2ad6-3c40-11ee-ac96-dac502259ad0.png

可新的問題來了,斷點是如何修改到這段Flash內容的呢?什么類型的斷點會修改Flash?斷點改了Flash內容為何不會被還原?打斷點要注意什么才能保證修改后的Flash內容被正確還原?打軟件斷點是否會修改Flash內容?Flash斷點,硬件斷點以及程序斷點的區別?芯片明明寫著支持2個breakpoint,為何同一個IDE配合不同的調試工具實際上可以打出的斷點個數有差異?帶著一堆問號繼續探尋...

3. 斷點類型和實現原理分析

斷點的實現原理網上有很多介紹,大致意思都是說在程序運行的某個地方提前設置一個停止操作,CPU運行到該位置之后就會自動暫停,此時開發者就可以查看CPU寄存器的工作狀態。可這里的”設置一個停止操作“是如何實現的呢?又意味著什么呢?網上找到的都是基于X86的實現細節介紹,針對ARM的實現細節找了半天也都是語焉不詳。發揮絕知此事要躬行的精神(客戶需要復現現場),筆者使用JLINK/I-JET+IAR在KW38 demo板子上做了一番測試,得出幾個很有意思的結論,完全顛覆了以前對斷點的一些認識,此處先拋出結論。

根據IDE和調試器的不同,斷點類型也被分為很多種包括硬件斷點、軟件斷點、Flash斷點、數據斷點、程序斷點、條件斷點、代碼斷點以及Trace斷點等。從實現原理上來講,一共有四大類:硬件斷點、軟件斷點、數據斷點以及Flash斷點,因為程序斷點和代碼斷點從原理上講可以歸屬于硬件斷點或者Flash斷點(具體哪一種取決于控制器支持的硬件斷點個數),條件斷點屬于數據斷點,Trace斷點是結合Trace工具的程序斷點。下面分別深入介紹這四種斷點的實現機制:

3.1 硬件斷點:

硬件斷點需要MCU內部支持,其數量一般是有限的,具體取決于芯片廠商的實現,對應KW38、KW45、S32K1以及S32K3斷點支持個數統計如下表所示。從實現原理上講硬件斷點是通過FPB模塊來實現的,盡管這塊是芯片廠商自行實現的,但是ARM架構已為其分配固定的地址區域,如下圖紅色方框。所以不論哪個公司的cortex芯片,用戶都可以通過該地址查看已設置的硬件斷點所在地址。FPB提供了兩個功能:斷點功能和Flash地址重載, Flash地址重載是其一個高階功能,此處用到的是其斷點功能。當在程序中設置了硬件斷點后,該斷點處的地址就會被寫入到FPB的存儲區域,即E000_2000 – E000_3FFF區域,當CPU訪問該地址時,因為該地址在FPB中已經注冊過,硬件就會自動觸發一個斷點事件。

硬件斷點個數 2個 8個 6個 8個
芯片型號 KW38(M0+) KW45(M33) S32K1(M4) S32K3(M7)

3.2 Flash斷點:

Flash斷點也就是本次問題的罪魁禍首了,也是從原理上來講最最容易出現問題的斷點。其實現原理是在設置Flash斷點時,IDE和仿真器會配合修改控制器Flash上的內容,進一步說就是將斷點處的指令修改為斷點指令0xBE00,相應地就會牽涉到對Flash的擦除和編程操作。由于Flash內容是非易失的,所以有可能在調試器意外斷開后對Flash斷點處插入的斷點指令還保留著,在用戶復位直接運行程序可能就會導致程序無法正常運行。

目前市場上各種宣稱支持Unlimited Breakpoint無限斷點的仿真器采用的就是這個原理,如下截圖的JLINK工具。需要提出的是Flash斷點不是任意仿真器+IDE的組合都支持的,需要IDE和仿真器配合起來,譬如Ozone/Embeded Studio配合JLINK,IAR需要配合I-JET才能在斷點設置時指定使用Flash斷點,如果IAR配合JLINK只能選擇軟件斷點(實際使用的其實也是Flash斷點,只是標注上不帶F標記)。I-JET和JLINK在支持Flash斷點的差別主要是對Flash執行修改的策略,譬如一個Sector地址區域的多個Flash斷點是執行一次還是多次的Flash操作,以及Flash插入的斷點恢復策略等,需要使用時自行體會。

3.3 軟件斷點:

軟件斷點最開始主要用于RAM中設置斷點,它的實現機制是將RAM中原有的指令替換為一個斷點指令,當CPU執行到該指令之后就會自動暫停,這個時候調試器便會將原有的指令放回原來位置。這個過程都是調試器自動實現的,對RAM的更新速度很快,所以用戶一般覺察不到。但實際情況是現在很多MCU受限于RAM大小,程序都是存放在Flash區域的,所以當斷點大于硬件斷點數量后,即便新的斷點選成軟件斷點,很多時候也會被設置為Flash斷點,意味著Flash斷點有的問題在使用軟件斷點時也需要注意,這也是為何將軟件斷點的講解放在Flash斷點之后。

3.4 數據斷點:

數據斷點又稱為條件斷點,在ARM內核手冊上稱為watchpoint斷點,是在CPU對特定地址訪問時會觸發的一種斷點,在芯片內部實現上需要DWT和FPB共同配合完成,在設置斷點的時候可以設置觸發的條件,比如對特定地址的讀訪問還是寫訪問。這種斷點對于追蹤堆棧溢出相關的問題有奇效。數據斷點同樣需要硬件支持,數量一般也是有限的,如對應KW38、KW45、S32K1以及S32K3數據斷點支持個數統計如下表所示。

數據斷點個數 2個 4個 4個 4個
芯片型號 KW38(M0+) KW45(M33) S32K1(M4) S32K3(M7)

4. 斷點實驗證明:

為了證明以上觀點,筆者在KW38板子上做了一系列的測試如下:

4.1 IAR+I-JET 強制使用2個Flash斷點,無硬件斷點:

如下截圖可以看到,在匯編和memory窗口中的數據都是原始的binary文件,但是通過額外的JLINK同時去Attach上去讀取可以看到對應0x16996地址和0x169A0物理地址的數據已經被修改為了0xBE00;此處要特別鳴謝下IAR的Wen hao兄給的啟發,確實沒想到IARMemory窗口讀取的數據和匯編窗口的指令居然都是假數據。

Note: IAR需要配合IAR公司自己的I-JET才能選擇Flash斷點,如果選擇JLINK等其他工具只能設置軟件斷點;

b86cffd2-3c40-11ee-ac96-dac502259ad0.png

4.2 IAR+JLINK 使用2個硬件斷點+1個Flash斷點:

如下圖1 可以看到,兩個硬件斷點地址0x1FA2以及0x1FA6都被注冊到了FPB寄存器的0xE0002000地址了。要指出的是,此處提到的Flash斷點在IAR中顯示為軟件斷點,因為IAR中默認僅支持使用I-JET的工具去打Flash斷點,其標志就是會在紅點里面顯示一個F圖標。所以這也就是前文說到的,對于Flash運行的代碼軟件斷點在實現上本質也還是Flash斷點。

b891059e-3c40-11ee-ac96-dac502259ad0.png

下圖2 可以看到,強制設置為line 38和line40處為硬件斷點之后,因為KW38只支持2個硬件斷點,main處這個斷點就被強制設定為了Flash斷點,分別去讀取0x1F98, 0x1FA2以及0x1FA6地址的值,可以看到main處斷點所在的地址內容被修改為了0xBE00,0x1FA2以及0x1FA6地址是正常的原始數據,存儲在硬件斷點地址,完全符合預期。

b8c9c37a-3c40-11ee-ac96-dac502259ad0.png

4.3 IAR+JLINK使用2個硬件斷點+2個軟件斷點:

可以看到,line36,line40被強行設置為硬件斷點,line38被設置為軟件斷點,main斷點也自動被分配為了軟件斷點,對比0x1F98, 0x1F9A, 0x1FA2, 0x1FA6地址的內容,只有0x1F98,0x1FA2兩個軟件斷點地址處的內容被修改為了0xBE00,即插入BKPT指令。0x1F9A和0x1FA6兩個硬件地址的內容沒有被修改,再次證明軟件斷點對于在Flash調試的控制器,本質上就是Flash斷點。

b8fc4d72-3c40-11ee-ac96-dac502259ad0.png

4.4 IAR+JLINK 使用6個軟件斷點+1個硬件斷點:

因為IAR中默認優先使用硬件斷點,而當前debug中設置了6個軟件斷點,所以main出的斷點被自動分配為硬件斷點。可以看到,全部6個軟件斷點對應地址區域的值都被修改為了0xBE00,也就是前文提到的軟件斷點其實也變成了Flash斷點,main地址處內容沒有發生變化,符合預期。

b9676256-3c40-11ee-ac96-dac502259ad0.png

5. 如何預防Flash斷點帶來的潛在風險

對于硬件斷點和數據斷點來說,他們是基于寄存器的實現,脫離Debug狀態無法繼續生效,不會影響用戶代碼的脫機運行。但是Flash斷點因為牽涉到修改非易失的Flash數據,就有風險導致程序意外被修改無法運行,譬如說突然斷電,不合理退出debug狀態等。

而且對于該類問題,如果斷點斷在main函數的主任務上還容易觀察到,因為代碼很直觀的無法運行,而如果斷在了某個不常調用的但又會用到的子任務的某個switch case中,就容易埋下隱蔽的bug(本案例遇到的就是這個狀況)。還一種情況是實車現場分析過程中,常用的一種方式就是Attach觀察分析問題,如果使用到Flash斷點(尤其是Flash運行的軟件斷點),且退出時沒注意清除該類型斷點,可能會帶來新的潛在問題。

設置完Flash斷點,對于突然斷電這種方式,自然是無解的,只能重新下載代碼。而在debug狀態時如何退出才是最優雅的方式(還原原本Flash內容)呢?筆者使用IAR+JLINK在KW38 demo板上上做了一系列測試,結論如下;

1 使用6個軟件斷點+突然斷電+上電重啟: 無法運行
2 使用6個軟件斷點+IDE中正常stop debug后+上電重啟: 無法運行
3 使用6個軟件斷點+在breakpoint窗口中Disable 所有Flash斷點+上電重啟: 無法運行
4 使用6個軟件斷點+在breakpoint窗口中Disable 所有Flash斷點+執行一次SW reset+上電重啟: 正常運行
5 IAR+JLINK+KW38 使用6個軟件斷點+在breakpoint串口中Delete所有Flash斷點+上電重啟 正常運行
序號 測試條件(此處軟件斷點使用的是Flash斷點) 運行結果

總的來說,為了避免Flash斷點帶來的Flash修改后沒有恢復的問題,需要在退出Debug模式時,先delete掉所有斷點,再去stop debug,或者先在在breakpoint窗口中Disable 所有Flash斷點后,再debug狀態下執行一次SW reset,讓Flash恢復回來,前者的缺點是下次debug時原來的斷點都丟失了,需要重新設置,優點是更徹底。

6. 結論:

基于以上分析可以得出幾個結論:

Flash斷點是會修改到Flash內容的,而且IDE和匯編中是體現不出該變化的,比較隱蔽;

Flash斷點導致Flash內容修改后未恢復的問題需要尤其重視,需要在退出debug前按章節5的兩種辦法加以處理;

軟件斷點對于非RAM中調試來說,IAR配合Jlink使用時本質上也是Flash斷點;

不是所有的調試器都支持Flash斷點,當設置的斷點個數超過硬件斷點個數,就會提示無法設置新的斷點,例如CMSIS DAP; 硬件斷點的支持個數有限,會在調試時默認采用,超過硬件斷點個數后的斷點JLINK默認會采用Flash斷點, IJET提示超過上限,需要選擇Flash斷點,斷點小紅點標志帶有F標志;

IAR+JLINK中JLINK支持Flash斷點是JLINK仿真器和其驅動的支持,IAR+IJET支持Flash斷點是IAR工具+I-JET硬件的支持,和IAR+JLINK的區別是其可以直接設置Flash類型斷點;

如果是Flash斷點打在了主函數導致重啟后代碼無法運行倒容易排查,如果是不小心打在了某個不常調用的子函數分支上,而功能測試時覆蓋度如果不夠,就可能導致埋下一個潛在的隱患;

審核編輯:湯梓紅

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

    關注

    134

    文章

    9109

    瀏覽量

    368020
  • FlaSh
    +關注

    關注

    10

    文章

    1638

    瀏覽量

    148194
  • 程序
    +關注

    關注

    117

    文章

    3792

    瀏覽量

    81165
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29782
  • 燒錄
    +關注

    關注

    8

    文章

    261

    瀏覽量

    35632

原文標題:顛覆你對ARM Cortex-M斷點認知

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

收藏 人收藏

    評論

    相關推薦

    ARM Cortex-M的音頻性能解析

    ARM Cortex-M3和Cortex-M4處理器內核的功能和能力可以實現高效的音頻處理。由于低功耗、高性能,Cortex-M處理器非常適合音頻應用。這些處理器超強的音頻能力可用于低
    發表于 08-09 18:07 ?5534次閱讀
    <b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b>的音頻性能解析

    總得知道為什么要用Cortex-M

    總得知道為什么要用Cortex-M無論您是資深嵌入式工程師,還是懷著滿滿好奇的嵌入式小白,總會有這樣的一些疑惑:Cortx-A、R、M到底什么區別呢?
    發表于 06-09 16:50

    ARM Cortex-M處理器詳解 精選資料分享

    ARM Cortex-M處理器家族現在有8款處理器成員。在本文中,我們會比較Cortex-M系列處理器之間的產品特性,重點講述如何根據產品應用選擇正確的Cortex-M處理器。本文中會
    發表于 07-16 07:57

    ARM Cortex-M堆棧機制介紹

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是ARM Cortex-M堆棧機制。  今天給大家分享的這篇依舊是2016年之前痞子衡寫的技術文檔,花了點時間重新編排了一下
    發表于 12-16 06:26

    ARM Cortex-M內核的相關資料推薦

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是ARM Cortex-M功能模塊,不過側重點是三款安全特性處理器。  ARM Cortex-M處理器家族發展至今(2
    發表于 12-27 07:21

    Arm Cortex-M處理器—Cortex-M85介紹

    Arm發布了新一代的Cortex-M處理器,Cortex-M85。簡單粗暴的打個比方:Cortex-M85 ≈ Cortex-M7Trust
    發表于 07-15 14:59

    ARM Cortex-M 系列微控制器(ST)

    ARM Cortex-M 系列微控制器(ST) 意法半導體(ST)宣布在基于ARM Cortex-M系列處理器內核的微控制器研發項目上取得突破,推出全球業內首款采用90nm技術嵌入式
    發表于 11-02 09:29 ?958次閱讀

    ARM白皮書】ARM Cortex-M處理器入門

    ARM Cortex-M處理器家族現在有8款處理器成員。在本文中,會比較Cortex-M系列處理器之間的產品特性,重點講述如何根據產品應用選擇正確的Cortex-M處理器。本文中會詳細
    發表于 04-20 15:34 ?39次下載

    spmt284 Tiva C Series ARM Cortex-M Microcontrollers 新舊型號對應

    spmt284 Tiva C Series ARM Cortex-M Microcontrollers 新舊型號對應
    發表于 10-09 11:13 ?8次下載

    傳統的單片機和ARM較量 助推MCU踏上高端Cortex-M市場

    據有關市場調研機構稱,基于ARM Cortex-M內核的MCU在2010年創紀錄地實現了100%的出貨量增長。而整個MCU市場才增長了37%。MCU市場的增長也幾乎是來自于ARM Cortex
    發表于 04-28 10:00 ?1626次閱讀

    Atmel Studio 6軟件中如何調試ARM Cortex-M

    Atmel Studio 6軟件中如何調試ARM Cortex-M
    的頭像 發表于 07-04 10:49 ?4257次閱讀

    米爾科技Cortex-M Prototyping System +介紹

    ARM? Cortex?-M原型系統 MPS2+,為Cortex-M 系列微處理器設計的原型驗證評估系統,包含最新的Cortex-M7 及
    的頭像 發表于 11-14 10:45 ?1955次閱讀
    米爾科技<b class='flag-5'>Cortex-M</b> Prototyping System +介紹

    Cortex-MCortex-A認識ARM處理器

    Cortex-MCortex-A認識ARM處理器
    的頭像 發表于 03-08 11:34 ?3487次閱讀

    mcookie與單片機的關系_使用ARM Cortex-M MCU拓展單片機教學

    mcookie與單片機的關系_使用ARM Cortex-M MCU拓展單片機教學
    發表于 11-30 19:36 ?9次下載
    mcookie與單片機的關系_使用<b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b> MCU拓展單片機教學

    分析ARM Cortex-M內核復位啟動過程

    ARM Cortex-M內核的復位啟動過程也被稱為復位序列(Reset sequence),下面就來簡要總結分析下這一過程。
    的頭像 發表于 03-20 09:58 ?2442次閱讀
    主站蜘蛛池模板: 欧美天堂视频| 久久中出| 91久久另类重口变态| 免费一级视频在线播放| 天堂资源在线官网| 国产美女久久| 日本高清加勒比| 午夜欧美精品久久久久久久久| 福利色播| 韩国成人毛片aaa黄| 美女黄色在线| 欧美激情综合| 欧美色视频网| 狠狠婷婷| 国内精品久久久久久久久蜜桃| 国产精品亚洲一区二区三区在线播放| 久久夜色tv网站| 久久综合九色综合97婷婷群聊 | 午夜视频观看| 九九热在线精品| 加勒比视频一区| 黄色网址日本| h在线视频| 91日本在线观看亚洲精品| 特黄特a级特别特级特毛片| 香蕉视频久久久| 亚洲最大色网| 五月香婷婷| 色在线免费| 日本x色视频| 免费人成网站| 4hc44四虎www亚洲| 国产成人午夜精品影院游乐网 | 国产精品久久久久久久久kt| 午夜免费视频| 91极品女神嫩模在线播放| 在线免费看影视网站| 亚洲qingse中文在线| 免费啪啪网站| 亚洲男人的天堂在线播放| 日本不卡一区二区三区视频|