|
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间。/ Y' c% t+ `( z5 X N5 _
最近痞子衡写了篇文章 《i.MXRT从Serial NAND启动时间测量》,这篇文章详细测试了不同长度的 Non-XIP 程序在不同 NAND 访问速度下由 BootROM 加载启动所需要的时间,比如 240KB 的程序在 60MHz NAND 的访问速度下启动时间接近 30ms,这个启动时间对于有些响应时间敏感的应用(比如汽车电子)来说还是比较长的。
: M5 Q J1 i' L/ g2 ^: z对于 Non-XIP 程序,经过冷启动后,其程序体本身已经被加载进芯片内部 SRAM 了,除非发生 POR,否则 SRAM 中的程序会一直保持着。假设程序在恶劣的电磁环境中运行,代码里虽然包含异常复位的处理,但是每次程序复位启动时间还是和冷启动时间一样长(每次都需要 BootROM 搬移加载),有点难以接受。那么对于这种热启动的情况,程序启动时间能够缩短吗?答案是可以的,今天痞子衡就介绍下 i.MXRT 上的 INIT_VTOR 特性:
5 c) O0 z# A7 a. K备注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中断向量表原理及其重定向方法》。
; P `0 R& j9 F简单来说,芯片上电启动后内核都是从 SCB->VTOR 指向的地址处获取程序中断向量表里的第二个向量即所谓的复位函数 Reset_Handler。有了复位函数,就找到了程序入口。' r1 _9 A) a6 g1 U. \& ?( f$ w
; 摘取自 startup_MIMXRT1052.s; w; \9 B9 `" }) c9 v1 b7 B
__vector_table
4 ?& }+ W. i" [2 _+ e$ K DCD sfe(CSTACK)
% x: z, Y% K7 ^7 ^ DCD Reset_Handler8 S- |* i1 J" I, P& i
DCD NMI_Handler
i7 n2 f7 ^/ ] DCD HardFault_Handler; K7 L+ @1 B0 i% e; B' a& c
DCD MemManage_Handler4 H; m3 e+ l* a
DCD BusFault_Handler
0 `7 e1 D0 c. u) I; G( e( V DCD UsageFault_Handler
6 ~- Y- H1 [1 j7 ?6 c; p& m ...
% W% U2 O% K! ^" l( A! M( b+ ~4 j对于 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 中断向量表地址。 |
|