痞子衡嵌入式:如果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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...