0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

借助i.MXRT10xx系列INIT_VTOR功能缩短程序热重启时间

恩智浦MCU加油站 来源:未知 2023-09-07 08:50 次阅读

最近痞子衡写了篇文章 《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 中断向量表地址。

wKgaomT5H2aAdRDcAAHCJimzT7I824.png

正如痞子衡旧文 《妙用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-IMXRT1050oardsevkbimxrt1050demo_appsled_blinkyiar 例程(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:

wKgaomT5H2aAKAn5AAMJ690cG2E305.png

下面是不设置 IOMUXC_GPR->GPR16 的程序启动时间测试结果,无论是一开始的POR 冷启动还是后面 NVIC_SystemReset() 引起的热启动,启动时间都需要约 18.66ms

wKgaomT5H2eAW0UdAAKPtJnjHj4659.png

下面是设置了 IOMUXC_GPR->GPR16 指向 0x2000 之后的程序启动时间测试结果,只有一开始的 POR 冷启动时间是 18.66ms,后面 NVIC_SystemReset() 引起的热启动时间仅需要约 5.26ms。

wKgaomT5H2eAboIyAAK8a9zvM1Y368.png

上述实验结果证明,设置 IOMUXC_GPR->GPR16 指向应用程序中断向量表之后确实能缩短程序热启动时间。有朋友可能会疑问,设置了从 ITCM 直接热启动后为何还是有 5.26ms 的启动时间?这其实主要是从进入应用程序 Reset_Handler 到执行到测试 GPIO 拉低时的代码所消耗的时间,并且需要注意的是由 BootROM 加载执行的程序默认是在 ROM 配置后的 396MHz 主频下执行的(主频够快,测试代码消耗时间可以忽略不计),而直接复位从ITCM 里执行的程序是在默认主频 12MHz 下执行的(主频较慢,测试代码消耗时间不得不计)。

最后再提一下,除了直接在应用程序里设置 IOMUXC_GPR->GPR16 之外,也可以借助 BootROM 的 DCD 功能来设置,同样可以借助 MCUBootUtility 直接完成(详细步骤可参考《利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设》),痞子衡实测是有效的。

wKgaomT5H2eAIOHQAAFKKSIpWPg547.png

翻看i.MXRT1050 参考手册 System Boot 章节,IOMUXC_GPR寄存器地址空间也确实在有效的 DCD 设置范围。

wKgaomT5H2eAPPLeAAH_DYTe6kY727.png

END

更多恩智浦AI-IoT市场和产品信息,邀您同时关注“NXP客栈”微信公众号

wKgaomT5H2eAUoESAABCdkRE230504.jpg      

NXP客栈


恩智浦致力于打造安全的连接和基础设施解决方案,为智慧生活保驾护航。

长按二维码,关注我们

恩智浦MCU加油站


这是由恩智浦官方运营的公众号,着重为您推荐恩智浦MCU的产品信息、开发技巧、教程文档、培训课程等内容。

wKgaomT5H2eAIENNAAATNlPH08Y631.jpg  

长按二维码,关注我们


原文标题:借助i.MXRT10xx系列INIT_VTOR功能缩短程序热重启时间

文章出处:【微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17135

    浏览量

    351031
  • 恩智浦
    +关注

    关注

    14

    文章

    5857

    浏览量

    107351

原文标题:借助i.MXRT10xx系列INIT_VTOR功能缩短程序热重启时间

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MSP430x5xx和MSP430x6xx系列系列用户指南

    电子发烧友网站提供《MSP430x5xx和MSP430x6xx系列系列用户指南.pdf》资料免费下载
    发表于 12-19 15:32 0次下载
    MSP430x5<b class='flag-5'>xx</b>和MSP430x6<b class='flag-5'>xx</b><b class='flag-5'>系列</b><b class='flag-5'>系列</b>用户指南

    Simcenter Flotherm XT电子分析软件

    ,并在流程早期优化电子热管理。SimcenterFlothermXT的优势缩短电子设计过程使MCAD和EDA设计流程更接近设计,从而将分析过程的时间
    的头像 发表于 11-12 16:10 394次阅读
    Simcenter Flotherm XT电子<b class='flag-5'>热</b>分析软件

    从MSP430F4xx系列迁移到MSP430FR58xx/FR59xx/FR68xx/FR69xx系列

    电子发烧友网站提供《从MSP430F4xx系列迁移到MSP430FR58xx/FR59xx/FR68xx/FR69
    发表于 10-10 11:38 0次下载
    从MSP430F4<b class='flag-5'>xx</b><b class='flag-5'>系列</b>迁移到MSP430FR58<b class='flag-5'>xx</b>/FR59<b class='flag-5'>xx</b>/FR68<b class='flag-5'>xx</b>/FR69<b class='flag-5'>xx</b><b class='flag-5'>系列</b>

    iPhone 16 Pro机型发货时间缩短

    iPhone 15 Pro系列实现了显著缩短。具体而言,iPhone 16 Pro的发货时间缩短了1-2周,而Pro Max更是缩短了2-3
    的头像 发表于 09-24 15:11 596次阅读

    AM65xx时间同步架构

    电子发烧友网站提供《AM65xx时间同步架构.pdf》资料免费下载
    发表于 09-19 13:38 0次下载
    AM65<b class='flag-5'>xx</b><b class='flag-5'>时间</b>同步架构

    【GD32 MCU 移植教程】8、从 STM32F4xx 系列移植到 GD32F4xx

    GD32F4xx 系列 MCU 是基于 Arm® Cortex®-M4 处理器的 32 位通用微控制器,与 STM32F4xx系列 MCU 保持高度兼容。本文主要从以下三个方面进行介绍
    的头像 发表于 09-06 09:40 1259次阅读
    【GD32 MCU 移植教程】8、从 STM32F4<b class='flag-5'>xx</b> <b class='flag-5'>系列</b>移植到 GD32F4<b class='flag-5'>xx</b> 系

    通过VCO即时校准显著缩短锁定时间

    电子发烧友网站提供《通过VCO即时校准显著缩短锁定时间.pdf》资料免费下载
    发表于 08-28 09:32 0次下载
    通过VCO即时校准显著<b class='flag-5'>缩短</b>锁定<b class='flag-5'>时间</b>

    不同J-Link版本对于i.MXRT1170连接复位后处理行为

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是不同J-Link版本对于i.MXRT1170连接复位后处理行为。
    的头像 发表于 08-08 15:29 425次阅读
    不同J-Link版本对于<b class='flag-5'>i.MXRT</b>1170连接复位后处理行为

    i.MXRT1xxx系列上用NAND型启动设备时可用两级设计缩短启动时间

    去年痞子衡写过一篇骚操作文章 《借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序
    的头像 发表于 05-01 09:19 751次阅读
    在<b class='flag-5'>i.MXRT</b>1xxx<b class='flag-5'>系列</b>上用NAND型启动设备时可用两级设计<b class='flag-5'>缩短</b>启动<b class='flag-5'>时间</b>

    STM32上电到运行时间怎么缩短

    时间怎么能缩短点,启动最少要多久呢? int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU
    发表于 04-11 06:57

    CKS32F4xx系列I2S功能介绍

    CKS32F4xx系列使用高性能的32位内核,支持浮点运算单元(FPU),同时还支持DSP指令以及存储保护(MPU)用来加强应用的安全性。
    的头像 发表于 03-17 09:40 1205次阅读
    CKS32F4<b class='flag-5'>xx</b><b class='flag-5'>系列</b><b class='flag-5'>I</b>2S<b class='flag-5'>功能</b>介绍

    CG861XX系列与BQ76930系列的对比

    个串联的锂电池管理方案。 该系列由三个芯片封装在一起,因此CG861XX可以作为3-15节串联电池组监控和保护解决方案的一部分。它可以通过芯片本身的I2C接口连接到主机控制,执行多种电池组管理
    的头像 发表于 02-16 14:04 976次阅读
    CG861<b class='flag-5'>XX</b><b class='flag-5'>系列</b>与BQ76930<b class='flag-5'>系列</b>的对比

    TC3xx系列是否支持RTC功能

    请教各位,TC3xx系列芯片是否支持RTC功能,目前要记录snapshot的时间点(年月日时分秒)。
    发表于 02-02 07:53

    TC334 ADC 25us采样时间太长了如何缩短

    我用演示来测试,adc 采样时间只有 1~3 us;在我的程序中,将是 10us 甚至 100 us,每次结果都不一样。 发现添加 d " o while " 函数后,ADC 采样
    发表于 01-25 08:25

    介绍一下i.MXRT1170上用于保护片内OCRAM1,2的MECC64功能

    今天痞子衡给大家分享的是i.MXRT1170 MECC64功能特点及其保护片内OCRAM1,2之道。
    的头像 发表于 12-29 16:11 1056次阅读
    介绍一下<b class='flag-5'>i.MXRT</b>1170上用于保护片内OCRAM1,2的MECC64<b class='flag-5'>功能</b>