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

news2024/12/25 12:47:40

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

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/851976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Angular安全专辑 —— CSP防止XSS攻击

什么是 CSP(Content Security Policy) CSP(Content Security Policy)是一种Web安全策略,用于减轻和防止跨站脚本攻击(XSS)等安全漏洞。它通过允许网站管理员定义哪些资源可以加载到网页中&#…

【动态规划】数字三角形

算法提高课课堂笔记。 文章目录 摘花生题意思路代码 最低通行费题意思路代码 方格取数题意思路代码 摘花生 题目链接 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道…

解决GitHub超时上不去

Github对于开发者开发者开发者来说肯定不陌生,但是Github 经常连接不上显示超时,一般都是节点ip的问题。本文主要介绍一下如何通过修改 Hosts 提升 Github 访问速度。之前在 Hosts 文件有加入过节点,不过容易失效,所以自己得常更新…

A10VSO140EF7、A10VSO45ED71变量柱塞泵比例放大器

A10VSO18EF1、A10VSO28EF2、A10VSO45EF5、A10VSO71EF7、A10VSO100EF2、A10VSO140EF7、A10VSO45ED71、A10VSO71ER72、A10VSO100ED71、A10VSO140ER72、A10VSO180ER71比例变量柱塞泵电流信号实现电比例控制。 高精确度。 发生电源故障时的安全功能,例如制动和转向系统…

Python爬虫(八)_Requests的使用

Requests:让HTTP服务人类 虽然Python的标准库中urllib2模块中已经包含了平常我们使用的大多数功能,但是它的API使用起来让人感觉不太好,而Requests自称"HTTP for Humans",说明使用更简单方便。 Requests唯一的一个非转…

LeetCode--HOT100题(24)

目录 题目描述:234. 回文链表(简单)题目接口解题思路代码 PS: 题目描述:234. 回文链表(简单) 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true &…

微信-jssdk使用

需求: h5中使用微信的jsSDK,后续实现微信定位以及多图上传 微信文档 申请测试公众号 1.测试公众号进行配置 其中的域名是本地的ip地址 config接口进行权限配置,动态获取JS-SDK权限验证的签名 获取公众号accessToken以及jsTicket public static String WeChatAppId="wx…

Redis数据库的下载和安装

目录 第一章、Redis数据库的下载和安装1.1)nosql数据库和 Redis 介绍1.2)Windows中下载安装Redis数据库1.3)Linux中安装Redis数据库1.4)Linux中启动redis1.5)Linux中关闭redis 第二章、三种Redis客户端连接Redis数据库…

0804|IO进程线程day7 【重点】线程的同步互斥(互斥锁、信号量、条件变量的概念及基本操作)

线程的同步互斥中的两个概念:临界资源、临界区: 临界资源:当多个任务同时访问一个资源的时候,我们将该资源称之为临界资源。临界区:访问临界资源的代码,称之为临界区线程之间,如果要进行通信&am…

从少年变成恶龙的平台经济

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦midjourney 产品统筹 / bobo 录音间 / 声湃轩北京站 东方甄选和抖音的“矛盾”再一次暴露出平台经济与入驻者之间微妙的关系。 平台经济,从一个引领时代…

人工智能有可能使下一代智力贫乏?

在ChatGPT推出之前,Maya认识的绝大多数大学生都会通过Google去完善自己的论文帮助。但人工智能之前的互联网其实是做不到真正的“高水平抄袭”,因为你根本无法找到复杂、具体、有创意或个性化的答案。 以上面提到的冲突解决课论文为例,写作要…

Effective Java笔记(30)优先考虑泛型方法

正如类可以从泛型中受益一般 ,方法也一样。静态工具方法尤其适合于泛型化 。 Collections 中的所有“算法”方法(例如 binarySearch 和 sort )都泛型化了 。 编写泛型方法与编写泛型类型相类似 。 例如下面这个方法,它返回两个集合…

实战项目ssm权限系统 3-自定义注解+AOP拦截器记录登录日志

一 登录日志以及操作操作日志的操作 1.1 登录日志配置收集 1.1.1 编写log入库的service层接口 1.接口:在spring-security模块中 2.实现类:在service-system模块中 3.dao层:在service-system模块中 1.1.2 过滤器添加log记录 在过滤器中&…

ArcGISPro中如何使用机器学习脚本

点击工程 打开包管理器,我们可以发现,无法修改ArcGIS自带的默认python环境,所以我们需将默认环境进行克隆 点击设置 设置要克隆的地方,点击确定 激活克隆的环境,然后重写启动ArcGISPro 搜索并点击需要安装的库&#xf…

virtualBox安装openEuler、virtualBox安装欧安镜像、openEuler镜像安装、虚拟安装openEuler

应领导要求,为后面系统改成国产操作系统+国产数据的要求,写一篇openEuler的文章。 第一步:下载openEuler镜像:openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 选择对应版本:现在一般是64位,下载64位即可 第二步:下载virtualbox,个人下载的7.0.10:Downloads …

【PCL-7】PCL统计滤波

【PCL-1】RANSAC平面分割_pcl ransac平面_WXG1011的博客-CSDN博客 这篇博客已介绍直通滤波与体素滤波,这里主要记录统计滤波。 统计滤波是遍历计算各测点与其领域点的平均距离,以此为标量,假设为高斯正态分布,按标准差去除离群点…

OpenAI允许网站阻止其网络爬虫;谷歌推出类似Grammarly的语法检查功能

🦉 AI新闻 🚀 OpenAI推出新功能,允许网站阻止其网络爬虫抓取数据训练GPT模型 摘要:OpenAI最近推出了一个新功能,允许网站阻止其网络爬虫从其网站上抓取数据训练GPT模型。该功能通过在网站的Robots.txt文件中禁止GPTB…

使用 Etcher 制作U盘系统盘

Etcher 资料: https://github.com/balena-io/etcher/blob/master/SUPPORT.md

网络优化工程师,你到底了解多少?

5G网络优化工程师到底是什么? 5G,第五代移动通信技术(5th Generation Mobile Communication Technology,简称5G)是具有高速率、低时延和大连接特点的新一代宽带移动通信技术,5G通讯设施是实现人机物互联的…

重磅!清华最新报告:文心一言超越ChatGPT 3.5

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 今年国内厂商已发布很多大语言模型,其中最具代表性的产品有:百度的文心一言、阿里巴巴的通义千问、科大讯飞的星火等,最具代表性的开源工作有&#xff1a…