痞子衡嵌入式:如果i.MXRT離線無法啟動,試著分析ROM啟動日誌

来源:https://www.cnblogs.com/henjay724/p/18423483
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MXRT系列MCU的ROM啟動日誌。 關於 i.MX RT 啟動問題解決的文章,痞子衡寫過非常多,其中大部分都是具體到某一類啟動設備下的具體問題分析,比較依賴經驗,這些經驗當然是非常有用的。此外也有一篇 《啟動失敗先查看SRC ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MXRT系列MCU的ROM啟動日誌

  關於 i.MX RT 啟動問題解決的文章,痞子衡寫過非常多,其中大部分都是具體到某一類啟動設備下的具體問題分析,比較依賴經驗,這些經驗當然是非常有用的。此外也有一篇 《啟動失敗先查看SRC_SBMRx寄存器》,這篇內容通用於全部啟動設備,算是葵花寶典系列了。一直以來我們都當晶元啟動 ROM 程式運行狀態完全是個黑盒子,如果遇到異常,我們通常是去猜其可能遇到的問題,那麼能不能不全靠猜呢?答案是可以的!這便是痞子衡今天要聊 ROM 啟動日誌:

一、ROM啟動日誌原理

  我們知道 i.MX RT 系列上電都是片內固化的 ROM 程式代碼先運行,由 ROM 來載入啟動設備里的用戶程式去執行,所以如果用戶程式不能正常啟動,一定是 ROM 程式執行過程中遇到了異常。

  i.MX RT 初始 ROM 代碼來源於它的老大哥 i.MX 處理器,翻看 i.MX 參考手冊其中有關於 ROM Log Event 功能的描述,所謂 ROM Log Event 就是 ROM 程式在執行過程中將其重要節點事件(狀態)按時間軸記錄到一個日誌緩衝區里(日誌緩衝區通常在片內 RAM 固定地址處),這個日誌內容顯然對於分析 ROM 執行過程非常有用,那麼 i.MX RT 系列 ROM 代碼里有沒有保留這個功能呢?很高興,它還在!

  下表記錄了 i.MX RT 全系列型號的 ROM 啟動日誌緩衝區地址:

晶元 啟動LOG地址 最大啟動LOG長度(Bytes)
i.MXRT118x 0x3048a000 264
i.MXRT117x 0x2024ad78 264
i.MXRT116x 0x2024ad78 264
i.MXRT106x 0x2020523c 256
i.MXRT105x 0x202051c8 256
i.MXRT104x 0x2020523c 256
i.MXRT102x 0x2020515c 256
i.MXRT1015 0x2020515c 256
i.MXRT1011 0x20203d38 256
i.MXRT6xx 0x10017f00 264
i.MXRT5xx 0x10017ef8 264

二、獲取ROM啟動日誌數據

  上一節我們知道了 ROM 啟動日誌緩衝區存儲地址,獲取其數據的方法就簡單了,可以直接連接上模擬器去讀取。不過這裡有需要註意的地方:如果是在 ROM 跳轉用戶程式之前發生的異常(日誌體現為啟動失敗),那麼內核 PC 應該還停留在 ROM 空間,這時候 RAM 區數據是完整的,無人破壞。如果是在 ROM 跳轉到用戶程式之後發生的異常(日誌體現為啟動成功),這時候用戶程式已經開始執行了,這可能會破壞 RAM 區數據(如果用戶程式鏈接文件里用到了存儲啟動日誌的 RAM 區域),這時候啟動日誌內容就不一定有效了。

  以 i.MXRT1170 為例,痞子衡找了一塊開發板,上電後掛上 J-Link 調試器,使用 J-Link 命令行工具里的 SaveBin 命令從 0x2024ad78 地址處讀取最大的日誌數據存儲到 bootlog.bin 文件中。這裡需要註意在用 J-Link 連接目標設備時儘量不要選 MCU 型號,而用內核 CORTEX-M7 代替,這樣可以防止選了 MCU 型號而自動載入執行相應配套初始化腳本(萬一腳本里有片內 RAM 相關操作破壞日誌數據)。

命令格式:SaveBin <filename>, <addr>, <NumBytes>
命令解釋:Save target memory range into binary file.

  除了藉助調試器,我們也可以藉助晶元串列下載模式下配套的 MCUBoot 工具鏈(Flashloader+blhost)來獲取 ROM 日誌數據,具體可見 《MCUBootUtility v6.3發佈,支持獲取與解析啟動日誌》 一文 2.3 小節里的途徑二。

三、解析ROM啟動日誌

  i.MXRT 全系列 ROM 啟動日誌緩衝區數據結構並不是完全一樣的,主要分為兩個版本。其中 i.MXRT10xx 系列的日誌結構如下,跟 i.MX 處理器差不多,每條日誌內容壓縮存儲在一個 uint32_t 型變數里,最大支持 64 條日誌(當實際日誌超出 64 條時,後面的日誌直接被忽略不記)。

uint32_t pu_irom_log_buffer[64];

  而 i.MXRT11xx 系列以及 i.MXRTxxx 系列的日誌結構相比前一代有一些改進,其結構如下,首先增加了 entryIndex 用於記錄有效的日誌個數,同時也增加了 checkSum 用於校驗全部日誌的完整性(但實際意義並不大,ROM 異常運行時計算 checkSum 時機難以確定)。

typedef struct _log_context
{
    uint32_t entryIndex;
    uint32_t logEntries[64];
    uint32_t checkSum;
} log_context_t;

  此時最大日誌個數依舊是 64(當實際日誌超出 64 條時,會找到日誌緩存區里排在最後的狀態為 Fail 或者 Fatal 的日誌,然後只保存其後面的正常日誌並繼續向下記錄)。

舉例說明:當前記錄到了第 65 條日誌
 - 如果 logEntries[63:0] 里沒有 Fail 或者 Fatal 狀態的日誌,那麼清空數組,entryIndex 從 0 開始記錄。  
 - 如果 logEntries[31] 是排在最後的 Fail 或者 Fatal 狀態的日誌,那麼將 logEntries[63:32] 拷貝到 logEntries[31:0],entryIndex 重置為 32 再開始記錄。

  除了以上啟動日誌緩衝區數據結構差別之外,i.MXRT10xx 與 i.MXRT11xx/i.MXRTxxx 在單條日誌值定義上也是完全不同的,不過具體如何解析每條日誌內容,用戶無需過多關註,這在痞子衡開發的 MCUBootUtility v6.3 軟體里已經全部搞定了,用戶可以直接查看解析後的日誌結果。

  還是繼續以 i.MXRT1170 為例查看解析後的日誌結果,我們在 FlexSPI1 連接的串列 NOR Flash 里下載一個能正常啟動的 XIP 裸用戶程式(非簽名非加密),將晶元啟動模式設為 2'b10,當看到程式正常執行後,掛上調試器讀出啟動日誌數據(確保日誌存儲空間未被用戶程式破壞),並用 MCUBootUtility 軟體解析如下,還是能夠清晰地看到 ROM 執行過程信息的。

  至此,恩智浦i.MXRT系列MCU的ROM啟動日誌痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時發佈到我的 博客園主頁CSDN主頁微信公眾號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下麵二維碼,就可以在手機上第一時間看了哦。

  最後歡迎關註痞子衡個人微信公眾號【痞子衡嵌入式】,一個專註嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。

痞子衡嵌入式-微信二維碼 痞子衡嵌入式-微信收款二維碼 痞子衡嵌入式-支付寶收款二維碼

  衡傑(痞子衡),目前就職於某全球頂級半導體原廠MCU系統部門,擔任高級嵌入式系統應用工程師。

  專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關註痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關於專欄文章有任何疑問請直接在博客下麵留言,痞子衡會及時回覆免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • 徒弟不懂git怎麼用, 於是寫了篇文章, 把本地git操作從頭寫了一遍, 自己去看吧! 0、基本概念 •Git是一個免費、開源的、分散式版本控制系統 •它使用一個特殊的叫做倉庫的資料庫來記錄文件的變化 •倉庫中的每個文件都有一個完整的版本歷史記錄 1)安裝 sudo apt-update sudo ...
  • 想著做個輪腿的機器人玩玩,但是如果光用PID做演算法,對於輪子加腿的結構似乎效果並不好,為了實現輪腿本身能夠飛坡在一定高度下能夠跳躍,我想著上個模擬模型來調試和學習LQR演算法 機器人模擬的軟體似乎挺多,我查到比較常用的有ROS套件的一個,還有就是webots 本著界面簡單,開源(還有校園網方便下載)的 ...
  • 1.在開機過程中,快速按下鍵盤上的方向鍵↑和↓。目的是告知引導程式,我們需要在引導頁面選擇不同的操作,以便讓引導程式暫停。 使用↑和↓將選擇行設置為第一行(背景高亮即為選中),按下鍵盤上的e,進入編輯模式 2.將游標一直移動到 rhgb quiet 後面,將其(rhgb quiet) 替換成 ini ...
  • 下載 nvm 點擊進入 nvm git 倉庫下載 nvm windows 用戶點擊 exe 文件進行下載。 下載完畢之後點擊安裝包進行安裝 檢查是否安裝成功 打開windows 控制欄輸入 nvm -v 檢查是否安裝成功 使用 nvm 下載 node.js 打開控制欄輸入 nvm install l ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...