国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以縮短程序熱重啟時間。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


  大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是借助i.MXRT10xx系列INIT_VTOR功能可以縮短程序熱重啟時間。

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

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

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

一、INIT_VTOR功能簡介

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

  簡單來說,芯片上電啟動后內(nèi)核都是從 SCB->VTOR 指向的地址處獲取程序中斷向量表里的第二個向量即所謂的復位函數(shù) Reset_Handler。有了復位函數(shù),就找到了程序入口。

; 摘取自 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,我們知道芯片上電復位都是執(zhí)行 BootROM 代碼,BootROM 中斷向量表固定放在了 0x0020_0000 地址處。那么這個 0x0020_0000 地址是怎么被賦給 SCB->VTOR 寄存器的呢?這就引出了本文主角 IOMUXC_GPR->GPR16[32:7] - CM7_INIT_VTOR 位,這 25bits 的 CM7_INIT_VTOR 值每次復位都會被芯片系統(tǒng)自動加載進 SCB->VTOR[32:7] 中,其默認值即對應(yīng) BootROM 中斷向量表地址。

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

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

  有了上一節(jié)的理論基礎(chǔ),我們來做個實驗。痞子衡找了一塊 MIMXRT1050-EVK12(Rev.A)板卡,將其啟動設(shè)備換成串行 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() 函數(shù)里調(diào)用如下測試函數(shù),根據(jù)是否設(shè)置 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);
  // 根據(jù)是否設(shè)置 CM7_INIT_VTOR 分別編譯兩個不同鏡像文件
  // 設(shè)置 CM7_INIT_VTOR 指向地址 0x00002000,即用戶應(yīng)用程序中斷向量表
  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,并測試相應(yīng)啟動時間。這里 Flash 運行速度就選擇 60MHz:

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

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

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

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

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

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

歡迎訂閱

文章會同時發(fā)布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-633622.html

到了這里,關(guān)于痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以縮短程序熱重啟時間的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 痞子衡嵌入式:聊聊i.MXRT1xxx上第三級啟動保障 - SDMMC manufacture模式

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 i.MXRT1xxx上第三級啟動保障 - SDMMC manufacture模式 。 如果你在 i.MXRT1xxx 板卡上嘗試過從 SD/eMMC 卡啟動,你會發(fā)現(xiàn)一個奇怪的現(xiàn)象:如果把 SD/eMMC 卡還插著(并且里面保留正常的 App 程序),明明 BOOT_MODE[1:

    2024年02月02日
    瀏覽(21)
  • 痞子衡嵌入式:原來i.MXRT1170內(nèi)部RAM的ECC初始化工作可全部由ROM完成

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是 i.MXRT1170內(nèi)部RAM的ECC初始化工作可全部由ROM完成 。 痞子衡之前寫了三篇文章 《M7 FlexRAM ECC》、《M4 L-MEM ECC》、《MECC64》 分別介紹了 i.MXRT1170 片上 2MB RAM 的不同 ECC 控制器用法,尤其是第三篇文章最后介紹

    2024年02月04日
    瀏覽(17)
  • 痞子衡嵌入式:使能i.MXRT1050,1060 Hab簽名或加密啟動時App鏈接在片內(nèi)SRAM的限制

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 使能i.MXRT1050, 1060 Hab簽名或加密啟動時App鏈接在片內(nèi)SRAM的限制 。 最近有客戶反饋,在 RT1060 上測試 Non-XIP 程序啟動,如果程序體部分鏈接進 0x20280000 地址之后的片內(nèi) OCRAM 區(qū)域(這部分是由 FlexRAM 分配出

    2024年04月12日
    瀏覽(35)
  • 痞子衡嵌入式:在i.MXRT1170上快速點亮一款全新LCD屏的方法與步驟(MIPI DSI接口)

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是 在i.MXRT1170上快速點亮一款全新LCD屏的方法與步驟 。 我們知道 LCD 屏的接口有很多:DPI-RGB、MIPI DSI、DBI/MCU(I8080)、LVDS、SPI 等等,接口不同,對應(yīng)的軟件驅(qū)動也不同。RT1170 片內(nèi)外設(shè)對以上接口都能很好

    2024年02月03日
    瀏覽(22)
  • 痞子衡嵌入式:如果i.MXRT1xxx離線無法啟動,請先查看SRC_SBMRx寄存器

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 SRC_SBMRx寄存器對于定位i.MXRT1xxx離線無法啟動問題的意義 。 最近有一位開源社區(qū)大佬在使能 RT1050 BEE 加密過程中遇到無法啟動問題,折騰到一度崩潰,甚至想要棄坑。痞子衡哪能讓這位“老鄉(xiāng)”跑掉,連

    2024年02月19日
    瀏覽(19)
  • 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(10)- 從Serial NAND啟動

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 恩智浦i.MXRT1xxx系列MCU的Serial NAND啟動 。 最近越來越多的客戶在咨詢 i.MXRT1xxx 從 Serial NAND 啟動的事情,讓這個本來比較冷門的啟動設(shè)備突然火熱起來。據(jù)痞子衡的了解,其實客戶主要目的是在應(yīng)用里基于

    2024年02月17日
    瀏覽(18)
  • 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(10.A)- FlexSPI NAND啟動時間(RT1170)

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 恩智浦i.MX RT1170 FlexSPI NAND啟動時間 。 本篇是 i.MXRT1170 啟動時間評測第四彈,前三篇分別給大家評測了 Raw NAND 啟動時間(基于 MIMXRT1170-EVK_Rev.B)、Serial NOR 啟動時間(基于 MIMXRT1170-EVB_Rev.A2)、1bit SPI NO

    2024年02月15日
    瀏覽(61)
  • 痞子衡嵌入式:從功耗測試角度了解i.MXRTxxx系列片內(nèi)SRAM分區(qū)電源控制

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 從功耗測試角度了解i.MXRTxxx系列片內(nèi)SRAM分區(qū)電源控制 。 我們知道配合 MCU 一起工作的存儲器包含 ROM(Flash) 和 RAM 兩類,前者主要放 RO 代碼和數(shù)據(jù),后者放 RW 數(shù)據(jù)。MCU 可以沒有片內(nèi) ROM,但是一般都會包

    2024年02月12日
    瀏覽(13)
  • 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(12)- 從SD/eMMC啟動

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡啟動 。 最近在恩智浦官方社區(qū)上支持了一個關(guān)于 i.MXRT 從 SD 卡啟動的案例,這讓痞子衡想起了一年前寫過的一篇《i.MXRT600從SD/eMMC啟動》,那一篇重點介紹了基于 eMMC 設(shè)備

    2024年02月02日
    瀏覽(25)
  • 《痞子衡嵌入式半月刊》 第 81 期

    這里分享嵌入式領(lǐng)域有用有趣的項目/工具以及一些熱點新聞,農(nóng)歷年分二十四節(jié)氣,希望在每個交節(jié)之日準時發(fā)布一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 :《痞子衡嵌入式半月刊: 第 80 期》

    2024年02月08日
    瀏覽(90)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包