痞子衡嵌入式:在i.MXRT1xxx系列上用NAND型啟動設備時可用兩級設計縮短啟動時間

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

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是在i.MXRT1xxx系列上用NAND型啟動設備時可用兩級設計縮短啟動時間。 去年痞子衡寫過一篇騷操作文章 《藉助i.MXRT10xx系列INIT_VTOR功能可以縮短程式熱重啟時間》,這對於 NAND 型啟動設備上程式熱重啟時間的縮短 ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是在i.MXRT1xxx系列上用NAND型啟動設備時可用兩級設計縮短啟動時間

  去年痞子衡寫過一篇騷操作文章 《藉助i.MXRT10xx系列INIT_VTOR功能可以縮短程式熱重啟時間》,這對於 NAND 型啟動設備上程式熱重啟時間的縮短非常有幫助。我們知道隨著項目進程的推進,代碼功能逐漸完善,程式體積也會變得越來越大,相應地啟動時間也會增大(每次複位 BootROM 都會搬移一次程式,搬移時間和程式長度成正比),痞子衡已經為大家解決了程式熱重啟時間問題,但是程式上電啟動(冷啟動)時間仍然過長怎麼辦?

  最近痞子衡在支持一個 RT1170 汽車電子客戶,他們使用了 eMMC 作為啟動設備,他們就對程式啟動時間比較擔心。鑒於此,痞子衡決定給他們做一個示例,這個方法其實痞子衡在 《測量RT1170 Raw NAND啟動時間》 一文 2.2 小節里簡單提及過,就是小 L2Boot + 大 App 兩級啟動設計(L2Boot儘量小,App可以很大,L2Boot起來之後去做一些用戶啟動任務,然後由L2Boot再去慢慢載入App)。那會痞子衡只是放個嘴炮,這次咱們就動個真格:

  • Note:本文以 eMMC 啟動設備為例,但思想方法同樣適用 Raw/Serial NAND, SD 等啟動設備。

一、RT1170從eMMC啟動

  RT1xxx 系列包含兩個 uSDHC 模塊,其中 uSDHC1 主要支持 1/4-bit 模式,而 uSDHC2 可以支持 1/4/8-bit 模式,因此大部分客戶都會將 8-bit eMMC 掛在 uSDHC2 上。這個汽車電子客戶選用了來自江波龍的相容 eMMC5.1 標準的 8GB 容量晶元 FEMDME008G-A8A39,硬體設計上記憶體介質供電 VCC 是 3.3V,主機介面供電 VCCQ 是 1.8V(高速):

VCCQ = 1.8V,低功耗模式,可支持 HS200/HS400
VCCQ = 3.3V,高功耗模式,可支持 52MHz CLK SDR/DDR

  要從 eMMC 啟動,首先需要準備一個 Non-XIP 程式,具體可參考 《RT上Non-App製作限制》。有了程式,然後將晶元 Boot Mode 設置為 2'b01 串列下載模式,再使用痞子衡 MCUBootUtility 工具做一鍵下載即可,軟體配置如下:

  程式下載完成之後,將晶元 Boot Mode 設置為 2'b10,此外 BOOT_CFG[1/5/7/8/9] 均設為1,即從 uSDHC2 8-bit 1.8V High-Speed 模式啟動,斷電覆位,你應該能看到程式從 eMMC 中被啟動了。

二、支持eMMC讀取的L2Boot設計

  確認基本的 eMMC 啟動過程沒問題了,現在開始設計 L2Boot。其實這個 L2Boot 也沒啥玄機,本質上也是一個 Non-XIP 程式,只不過程式功能包含:用戶啟動任務執行、eMMC 數據讀取驅動、用戶程式載入執行。痞子衡這裡的 L2Boot 設計主要涉及 eMMC 數據讀取以及用戶程式載入執行。

  目前官方 SDK_2_15_000_MIMXRT1170-EVKB 里沒有單純的 eMMC 常式,但是其它 RT 型號倒是有常式 \SDK_2_15_000_EVKB-IMXRT1050\boards\evkbimxrt1050\sdmmc_examples\mmccard_freertos,痞子衡其實就想要一個最簡單的裸機版本的 eMMC 讀寫測試。

  為了不重覆造輪子,痞子衡就在 \SDK_2_15_000_MIMXRT1170-EVKB\boards\evkbmimxrt1170\bootloader_examples\flashloader 基礎上做了刪減,僅保留 eMMC 讀寫以及程式跳轉功能,代碼倉庫如下:

https://github.com/JayHeng/RT-SDMMC/tree/dev_l2boot_emmc/boards/mcu/mmc_boot

  這個 L2Boot 工程里最核心的函數 bootloader_run() 如下,其中用戶程式拷貝過程目標地址和長度使用了 HARDCODE,這裡其實是可以改進的(可參考 RTxxx 系列啟動設計在用戶程式中斷向量表保留區域放置 APP_EXEC_START 和 APP_LENGTH)。此外 APP_EMMC_START 設 0x80000,是因為這款 eMMC 晶元擦除單元(erase group)為 512KB,第一個 group 我們放置了 L2Boot,用戶 App 可從第二個 Group 開始放。

#define APP_EMMC_START  (0x80000)  // 用戶程式數據在eMMC中起始位置
#define APP_EXEC_START  (0x2000)   // 用戶程式首地址(中斷向量表地址),這裡是 ITCM 偏移 0x2000 處(偏移不強制)
#define APP_LENGTH      (0x6000)   // 用戶程式體大小

  需要提醒的是,這個 L2Boot 務必要遵循 BootROM 對於 Non-XIP 程式載入的鏈接限制(空出前面位置給啟動頭),因為上電後其由 BootROM 載入執行。

三、L2Boot與App聯動

  為了測試 L2Boot 功能是否正常,痞子衡在倉庫里也放了一個示例用戶 App 工程(其實就是 SDK 里的 hello world 常式),這個 App 由於是被 L2Boot 載入執行,所以它也不存在 BootROM 關於 Non-XIP 程式的鏈接地址限制問題了,完全看 L2Boot 的代碼設計要求。

https://github.com/JayHeng/RT-SDMMC/tree/dev_l2boot_emmc/boards/mcu/mmc_app

  現在我們用 MCUBootUtility 工具依次將痞子衡倉庫里的 mmc_boot 程式(一鍵下載方式)和 mmc_app 程式(通用編程器下載方式,如下圖)下載進 eMMC 里。切換 Boot Mode 後斷電覆位,如果你看到 mmc_app 正在執行,恭喜你,兩級啟動設計完成了。

  至此,在i.MXRT1xxx系列上用NAND型啟動設備時可用兩級設計縮短啟動時間痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

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

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

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

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

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

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

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

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

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

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



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

-Advertisement-
Play Games
更多相關文章
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 題目:對順序表中的元素進行增加和刪除以及訪問 使用數組實現線性表的特性,需要知道三個條件:數組元素的容量、數組有效的最後一個元素的下標 /************************************************************************* * file ...
  • 順序表 題目一: 題目分析: 該題目需要先對順序表進行遍歷至元素x正確插入位置,再對順序表完成插入操作。因此涉及到for迴圈與if語句的使用 代碼實現 /******************************************************************** * * ...
  • 1:在離線的環境中導入鏡像 在無法訪問外網的情況下,通過將docker鏡像導出為一個包,然後導入到另外的一臺電腦上面,從而實現了不用訪問外網就能拉取鏡像了 #將鏡像輸出到這個tar包 [root@cleint ~]# docker save -o centos.tar centos #通過第三方的 ...
  • 2.1.1 命令提示符 在CentOS 7操作系統中,Linux命令提示符就像是你與電腦交流的一個小標誌,告訴你系統已經準備好接受你的指令了。 它通常會顯示在你打開的終端視窗或控制台的最前面。 讓我們來看一個示例: [root@node01 ~]$ 在這個示例中: root:是當前登錄的用戶名。 @ ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...