痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间

这篇具有很好参考价值的文章主要介绍了痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是借助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主页、知乎主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。文章来源地址https://www.toymoban.com/news/detail-633622.html

到了这里,关于痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 痞子衡嵌入式:原来i.MXRT1170内部RAM的ECC初始化工作可全部由ROM完成

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是 i.MXRT1170内部RAM的ECC初始化工作可全部由ROM完成 。 痞子衡之前写了三篇文章 《M7 FlexRAM ECC》、《M4 L-MEM ECC》、《MECC64》 分别介绍了 i.MXRT1170 片上 2MB RAM 的不同 ECC 控制器用法,尤其是第三篇文章最后介绍

    2024年02月04日
    浏览(28)
  • 痞子衡嵌入式:聊聊i.MXRT1xxx上第三级启动保障 - SDMMC manufacture模式

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 i.MXRT1xxx上第三级启动保障 - SDMMC manufacture模式 。 如果你在 i.MXRT1xxx 板卡上尝试过从 SD/eMMC 卡启动,你会发现一个奇怪的现象:如果把 SD/eMMC 卡还插着(并且里面保留正常的 App 程序),明明 BOOT_MODE[1:

    2024年02月02日
    浏览(29)
  • 痞子衡嵌入式:使能i.MXRT1050,1060 Hab签名或加密启动时App链接在片内SRAM的限制

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 使能i.MXRT1050, 1060 Hab签名或加密启动时App链接在片内SRAM的限制 。 最近有客户反馈,在 RT1060 上测试 Non-XIP 程序启动,如果程序体部分链接进 0x20280000 地址之后的片内 OCRAM 区域(这部分是由 FlexRAM 分配出

    2024年04月12日
    浏览(28)
  • 痞子衡嵌入式:在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤(MIPI DSI接口)

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是 在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤 。 我们知道 LCD 屏的接口有很多:DPI-RGB、MIPI DSI、DBI/MCU(I8080)、LVDS、SPI 等等,接口不同,对应的软件驱动也不同。RT1170 片内外设对以上接口都能很好

    2024年02月03日
    浏览(41)
  • 痞子衡嵌入式:如果i.MXRT1xxx离线无法启动,请先查看SRC_SBMRx寄存器

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 SRC_SBMRx寄存器对于定位i.MXRT1xxx离线无法启动问题的意义 。 最近有一位开源社区大佬在使能 RT1050 BEE 加密过程中遇到无法启动问题,折腾到一度崩溃,甚至想要弃坑。痞子衡哪能让这位“老乡”跑掉,连

    2024年02月19日
    浏览(29)
  • 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(10)- 从Serial NAND启动

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 恩智浦i.MXRT1xxx系列MCU的Serial NAND启动 。 最近越来越多的客户在咨询 i.MXRT1xxx 从 Serial NAND 启动的事情,让这个本来比较冷门的启动设备突然火热起来。据痞子衡的了解,其实客户主要目的是在应用里基于

    2024年02月17日
    浏览(31)
  • 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(10.A)- FlexSPI NAND启动时间(RT1170)

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 恩智浦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日
    浏览(72)
  • 痞子衡嵌入式:从功耗测试角度了解i.MXRTxxx系列片内SRAM分区电源控制

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 从功耗测试角度了解i.MXRTxxx系列片内SRAM分区电源控制 。 我们知道配合 MCU 一起工作的存储器包含 ROM(Flash) 和 RAM 两类,前者主要放 RO 代码和数据,后者放 RW 数据。MCU 可以没有片内 ROM,但是一般都会包

    2024年02月12日
    浏览(28)
  • 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(12)- 从SD/eMMC启动

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡启动 。 最近在恩智浦官方社区上支持了一个关于 i.MXRT 从 SD 卡启动的案例,这让痞子衡想起了一年前写过的一篇《i.MXRT600从SD/eMMC启动》,那一篇重点介绍了基于 eMMC 设备

    2024年02月02日
    浏览(26)
  • 《痞子衡嵌入式半月刊》 第 82 期

    这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《痞子衡嵌入式半月刊: 第 81 期》

    2024年02月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包