痞子衡嵌入式:藉助i.MXRT10xx系列INIT_VTOR功能可以縮短程式熱重啟時間

来源:https://www.cnblogs.com/henjay724/archive/2023/08/08/17615666.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是**藉助i.MXRT10xx系列INIT_VTOR功能可以縮短程式熱重啟時間**。 最近痞子衡寫了篇文章 [《i.MXRT從Serial NAND啟動時間測量》](https://www.cnblogs.com/henjay724/p/ ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是藉助i.MXRT10xx系列INIT_VTOR功能可以縮短程式熱重啟時間

  最近痞子衡寫了篇文章 《i.MXRT從Serial NAND啟動時間測量》,這篇文章詳細測試了不同長度的 Non-XIP 程式在不同 NAND 訪問速度下由 BootROM 載入啟動所需要的時間,比如 240KB 的程式在 60MHz NAND 的訪問速度下啟動時間接近 30ms,這個啟動時間對於有些響應時間敏感的應用(比如汽車電子)來說還是比較長的。

  對於 Non-XIP 程式,經過冷啟動後,其程式體本身已經被載入進晶元內部 SRAM 了,除非發生 POR,否則 SRAM 中的程式會一直保持著。假設程式在惡劣的電磁環境中運行,代碼里雖然包含異常複位的處理,但是每次程式複位啟動時間還是和冷啟動時間一樣長(每次都需要 BootROM 搬移載入),有點難以接受。那麼對於這種熱啟動的情況,程式啟動時間能夠縮短嗎?答案是可以的,今天痞子衡就介紹下 i.MXRT 上的 INIT_VTOR 特性:

  • 備註1:本文主角是i.MXRT1050,但內容也基本適用其它i.MXRT10xx系列。
  • 備註2:同樣的測試在i.MXRT1160/1170下無效,因為CM7_INIT_VTOR所在的IOMUXC_LPSR_GPR->GPR26在軟複位下不能保持。

一、INIT_VTOR功能簡介

  在介紹 INIT_VTOR 功能之前,大家首先要對 ARM Cortex-M 內核的中斷向量表偏移寄存器 SCB->VTOR 功能有所瞭解,具體可以看痞子衡的舊文 《Cortex-M中斷向量表原理及其重定向方法》

  簡單來說,晶元上電啟動後內核都是從 SCB->VTOR 指向的地址處獲取程式中斷向量表裡的第二個向量即所謂的複位函數 Reset_Handler。有了複位函數,就找到了程式入口。

; 摘取自 startup_MIMXRT1052.s

__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler

        DCD     NMI_Handler
        DCD     HardFault_Handler
        DCD     MemManage_Handler
        DCD     BusFault_Handler
        DCD     UsageFault_Handler
        ...

  對於 i.MXRT1050,我們知道晶元上電覆位都是執行 BootROM 代碼,BootROM 中斷向量表固定放在了 0x0020_0000 地址處。那麼這個 0x0020_0000 地址是怎麼被賦給 SCB->VTOR 寄存器的呢?這就引出了本文主角 IOMUXC_GPR->GPR16[32:7] - CM7_INIT_VTOR 位,這 25bits 的 CM7_INIT_VTOR 值每次複位都會被晶元系統自動載入進 SCB->VTOR[32:7] 中,其預設值即對應 BootROM 中斷向量表地址。

  正如痞子衡舊文 《妙用i.MXRT1xxx里SystemReset不複位的GPR寄存器》 提及的那樣,IOMUXC_GPR 寄存器僅在 POR 複位或者整體重新上電時才會被置位,這就意味著我們在應用程式中只需要設置一次 CM7_INIT_VTOR 值,其後不管發生多少次類似 NVIC_SystemReset() 的複位,CM7_INIT_VTOR 值都不會改變。

二、使用INIT_VTOR加速程式熱重啟

  有了上一節的理論基礎,我們來做個實驗。痞子衡找了一塊 MIMXRT1050-EVK12(Rev.A)板卡,將其啟動設備換成串列 NAND 啟動(電阻切換到使能 U33,並將 U33 替換成華邦 W25N01GV)。

  然後按照串列 NAND 啟動時間測試方法那樣修改 \SDK_2_13_0_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\led_blinky\iar 常式(debug build,即代碼在 ITCM 運行,註意修改鏈接文件中的 m_interrupts_start = 0x00002000),併在 SystemInit() 函數里調用如下測試函數,根據是否設置 IOMUXC_GPR->GPR16 寄存器編譯出兩個不同鏡像文件(直接編輯 bin 文件將其均填充至 120KB)。

void set_led_gpio(void)
{
  CLOCK_EnableClock(kCLOCK_Iomuxc);
  gpio_pin_config_t USER_LED_config = {
      .direction = kGPIO_DigitalOutput,
      .outputLogic = 0U,
      .interruptMode = kGPIO_NoIntmode
  };
  GPIO_PinInit(GPIO1, 9U, &USER_LED_config);
  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0U); 
  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0x10B0U); 

  SystemCoreClockUpdate();
  GPIO_PinWrite(GPIO1, 9U, 0U);
  SDK_DelayAtLeastUs(5000, SystemCoreClock);
  // 根據是否設置 CM7_INIT_VTOR 分別編譯兩個不同鏡像文件
  // 設置 CM7_INIT_VTOR 指向地址 0x00002000,即用戶應用程式中斷向量表
  IOMUXC_GPR->GPR16 = (IOMUXC_GPR->GPR16 & (~IOMUXC_GPR_GPR16_CM7_INIT_VTOR_MASK)) | IOMUXC_GPR_GPR16_CM7_INIT_VTOR(0x2000 >> 7);
  NVIC_SystemReset();
  while (1);
}

  然後藉助 MCUBootUtility 工具將這兩個不同鏡像文件下載進串列 NAND flash,並測試相應啟動時間。這裡 Flash 運行速度就選擇 60MHz:

  下麵是不設置 IOMUXC_GPR->GPR16 的程式啟動時間測試結果,無論是一開始的 POR 冷啟動還是後面 NVIC_SystemReset() 引起的熱啟動,啟動時間都需要約 18.66ms:

  下麵是設置了 IOMUXC_GPR->GPR16 指向 0x2000 之後的程式啟動時間測試結果,只有一開始的 POR 冷啟動時間是 18.66ms,後面 NVIC_SystemReset() 引起的熱啟動時間僅需要約 5.26ms。

  上述實驗結果證明,設置 IOMUXC_GPR->GPR16 指嚮應用程式中斷向量表之後確實能縮短程式熱啟動時間。有朋友可能會疑問,設置了從 ITCM 直接熱啟動後為何還是有 5.26ms 的啟動時間?這其實主要是從進入應用程式 Reset_Handler 到執行到測試 GPIO 拉低時的代碼所消耗的時間,並且需要註意的是由 BootROM 載入執行的程式預設是在 ROM 配置後的 396MHz 主頻下執行的(主頻夠快,測試代碼消耗時間可以忽略不計),而直接複位從 ITCM 里執行的程式是在預設主頻 12MHz 下執行的(主頻較慢,測試代碼消耗時間不得不計)。

  最後再提一下,除了直接在應用程式里設置 IOMUXC_GPR->GPR16 之外,也可以藉助 BootROM 的 DCD 功能來設置,同樣可以藉助 MCUBootUtility 直接完成(詳細步驟可參考 《利用i.MXRT1xxx系列ROM集成的DCD功能可輕鬆配置指定外設》),痞子衡實測是有效的。

  翻看 RT1050 參考手冊 System Boot 章節,IOMUXC_GPR 寄存器地址空間也確實在有效的 DCD 設置範圍。

  至此,藉助i.MXRT10xx系列INIT_VTOR功能可以縮短程式熱重啟時間痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

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

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

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

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

  衡傑(痞子衡),目前就職於某知名外企半導體公司MCU系統部門,擔任嵌入式系統應用工程師。

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

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

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

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

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



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

-Advertisement-
Play Games
更多相關文章
  • 來源:https://blog.csdn.net/qq_14999375/article/details/123309636 ## **前言** K8s + Spring Boot實現零宕機發佈:健康檢查+滾動更新+優雅停機+彈性伸縮+Prometheus監控+配置分離(鏡像復用) ## **配置* ...
  • 在實際應用中,數據集中經常會存在缺失值,也就是某些數據項的值並未填充或者填充不完整。缺失值的存在可能會對後續的數據分析和建模產生影響,因此需要進行處理。 `pandas`提供了多種方法來處理缺失值,例如刪除缺失值、填充缺失值等。刪除缺失值可能會導致數據量減少,填充缺失值則能夠儘量保留原始數據集的完整 ...
  • 實踐過不同前端框架的朋友應該都知道,對於同一個樣式,在不同框架上的表現都會有不同,時時需要做“適配”,在 Blazor 上也不例外。 ...
  • # Unity IPreprocessComputeShaders Unity IPreprocessComputeShaders是Unity引擎中的一個非常有用的功能,它可以讓開發者編譯Compute Shader時自定義哪些操作需要被執行。這個可以幫助開發者更好地控制Compute Shader ...
  • 前言 大家好,我是wacky,最近在工作中遇到一個有趣的問題,同事反饋說WPF中有一個樹形結構的集合,在載入時會直接報堆棧溢出,一直沒時間(懶得)看,導致很久了也沒人解決掉。於是,組長就把這個"艱巨"的任務交給了我。作為新人中的"高手",必然要義不容辭地接受挑戰嘍,廢話不多說,走起。 分析 由於同事 ...
  • LINQ是C#3.0引入的特性,讓處理對象就像執行SQL語句一樣簡單,對於提高C#開發效率有革命性的作用。 對於每個.NET開發者來說,掌握C#的LINQ知識點是非常重要的。LINQ是C#的一個強大的特性,它為數據查詢和操作提供了簡潔、統一的語法,使得數據處理變得更加直觀和靈活。 以下是.NET開發 ...
  • # Unity IUnityLinkerProcessor Unity IUnityLinkerProcessor是Unity引擎中的一個介面,它允許開發者在Unity項目構建時對代碼進行鏈接處理。這個介面可以用來優化項目構建大小,減少不必要的代碼和資源,提高項目的性能和載入速度。 ## 介面定義 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...