大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在i.MXRT1xxx系列上用NAND型启动设备时可用两级设计缩短启动时间

  去年痞子衡写过一篇骚操作文章 《借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间》,这对于 NAND 型启动设备上程序热重启时间的缩短非常有帮助。我们知道随着项目进程的推进,代码功能逐渐完善,程序体积也会变得越来越大,相应地启动时间也会增大(每次复位 BootROM 都会搬移一次程序,搬移时间和程序长度成正比),痞子衡已经为大家解决了程序热重启时间问题,但是程序上电启动(冷启动)时间仍然过长怎么办?

  最近痞子衡在支持一个 RT1170 汽车电子客户,他们使用了 eMMC 作为启动设备,他们就对程序启动时间比较担心。鉴于此,痞子衡决定给他们做一个示例,这个方法其实痞子衡在 《测量RT1170 Raw NAND启动时间》 一文 2.2 小节里简单提及过,就是小 L2Boot + 大 App 两级启动设计(L2Boot尽量小,App可以很大,L2Boot起来之后去做一些用户启动任务,然后由L2Boot再去慢慢加载App)。那会痞子衡只是放个嘴炮,这次咱们就动个真格:

  • Note:本文以 eMMC 启动设备为例,但思想方法同样适用 Raw/Serial NAND, SD 等启动设备。

一、RT1170从eMMC启动

  RT1xxx 系列包含两个 uSDHC 模块,其中 uSDHC1 主要支持 1/4-bit 模式,而 uSDHC2 可以支持 1/4/8-bit 模式,因此大部分客户都会将 8-bit eMMC 挂在 uSDHC2 上。这个汽车电子客户选用了来自江波龙的兼容 eMMC5.1 标准的 8GB 容量芯片 FEMDME008G-A8A39,硬件设计上内存介质供电 VCC 是 3.3V,主机接口供电 VCCQ 是 1.8V(高速):

VCCQ = 1.8V,低功耗模式,可支持 HS200/HS400
VCCQ = 3.3V,高功耗模式,可支持 52MHz CLK SDR/DDR

  要从 eMMC 启动,首先需要准备一个 Non-XIP 程序,具体可参考 《RT上Non-App制作限制》。有了程序,然后将芯片 Boot Mode 设置为 2'b01 串行下载模式,再使用痞子衡 MCUBootUtility 工具做一键下载即可,软件配置如下:

  程序下载完成之后,将芯片 Boot Mode 设置为 2'b10,此外 BOOT_CFG[1/5/7/8/9] 均设为1,即从 uSDHC2 8-bit 1.8V High-Speed 模式启动,断电复位,你应该能看到程序从 eMMC 中被启动了。

二、支持eMMC读取的L2Boot设计

  确认基本的 eMMC 启动过程没问题了,现在开始设计 L2Boot。其实这个 L2Boot 也没啥玄机,本质上也是一个 Non-XIP 程序,只不过程序功能包含:用户启动任务执行、eMMC 数据读取驱动、用户程序加载执行。痞子衡这里的 L2Boot 设计主要涉及 eMMC 数据读取以及用户程序加载执行。

  目前官方 SDK_2_15_000_MIMXRT1170-EVKB 里没有单纯的 eMMC 例程,但是其它 RT 型号倒是有例程 \SDK_2_15_000_EVKB-IMXRT1050\boards\evkbimxrt1050\sdmmc_examples\mmccard_freertos,痞子衡其实就想要一个最简单的裸机版本的 eMMC 读写测试。

  为了不重复造轮子,痞子衡就在 \SDK_2_15_000_MIMXRT1170-EVKB\boards\evkbmimxrt1170\bootloader_examples\flashloader 基础上做了删减,仅保留 eMMC 读写以及程序跳转功能,代码仓库如下:

https://github.com/JayHeng/RT-SDMMC/tree/dev_l2boot_emmc/boards/mcu/mmc_boot

  这个 L2Boot 工程里最核心的函数 bootloader_run() 如下,其中用户程序拷贝过程目标地址和长度使用了 HARDCODE,这里其实是可以改进的(可参考 RTxxx 系列启动设计在用户程序中断向量表保留区域放置 APP_EXEC_START 和 APP_LENGTH)。此外 APP_EMMC_START 设 0x80000,是因为这款 eMMC 芯片擦除单元(erase group)为 512KB,第一个 group 我们放置了 L2Boot,用户 App 可从第二个 Group 开始放。

#define APP_EMMC_START  (0x80000)  // 用户程序数据在eMMC中起始位置
#define APP_EXEC_START (0x2000) // 用户程序首地址(中断向量表地址),这里是 ITCM 偏移 0x2000 处(偏移不强制)
#define APP_LENGTH (0x6000) // 用户程序体大小

  需要提醒的是,这个 L2Boot 务必要遵循 BootROM 对于 Non-XIP 程序加载的链接限制(空出前面位置给启动头),因为上电后其由 BootROM 加载执行。

三、L2Boot与App联动

  为了测试 L2Boot 功能是否正常,痞子衡在仓库里也放了一个示例用户 App 工程(其实就是 SDK 里的 hello world 例程),这个 App 由于是被 L2Boot 加载执行,所以它也不存在 BootROM 关于 Non-XIP 程序的链接地址限制问题了,完全看 L2Boot 的代码设计要求。

https://github.com/JayHeng/RT-SDMMC/tree/dev_l2boot_emmc/boards/mcu/mmc_app

  现在我们用 MCUBootUtility 工具依次将痞子衡仓库里的 mmc_boot 程序(一键下载方式)和 mmc_app 程序(通用编程器下载方式,如下图)下载进 eMMC 里。切换 Boot Mode 后断电复位,如果你看到 mmc_app 正在执行,恭喜你,两级启动设计完成了。

  至此,在i.MXRT1xxx系列上用NAND型启动设备时可用两级设计缩短启动时间痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

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

痞子衡嵌入式:在i.MXRT1xxx系列上用NAND型启动设备时可用两级设计缩短启动时间的更多相关文章

  1. 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...

  2. 痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能. 前段时间痞子衡写了一篇文章 <利用i.MXRT1060,1010上新 ...

  3. 痞子衡嵌入式:实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率. 上一篇文章 <聊聊i.MXRT1xxx上的普通GPIO与高速GP ...

  4. 痞子衡嵌入式:在i.MXRT1060-EVK上利用memtester程序给SDRAM做压力测试

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在i.MXRT1060-EVK上利用memtester程序给SDRAM做压力测试. 我们知道恩智浦i.MXRT1xxx系列是高性能MCU ...

  5. 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...

  6. 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...

  7. 痞子衡嵌入式:SNVS Master Key仅在i.MXRT10xx Hab关闭时才能用于DCP加解密

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列中数据协处理器DCP使用SNVS Master Key加解密的注意事项. i.MXRT不仅仅是处理性能超强的MCU,也是 ...

  8. 痞子衡嵌入式:探讨i.MXRT下FlexSPI driver实现Flash编程时对于中断支持问题

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT下FlexSPI driver实现Flash编程时对于中断支持问题. 前段时间有客户在官方社区反映 i.MXRT1170 下 ...

  9. 痞子衡嵌入式:恩智浦LPC系列MCU开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦LPC系列微控制器相关知识. 恩智浦半导体最早于2003年便开始推出LPC系列MCU,但早期的产品LPC2000/3000系列属 ...

  10. 痞子衡嵌入式:在i.MXRT启动头FDCB里调整Flash工作频率也需同步设Dummy Cycle

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Flash工作频率与Dummy Cycle的联系. 上一篇文章 <从头开始认识i.MXRT启动头FDCB里的lookupTable ...

随机推荐

  1. chrome 快速执行 snippets 1. F12 2. Ctrl+Shift+P 3. show snippets 4. 上下选择 5. Ctrl + Enter

    chrome 快速执行 snippets F12 Ctrl+Shift+P show snippets 上下选择 Ctrl + Enter

  2. 霞鹜文楷 字体推荐 - 'Fira Code', '霞鹜文楷等宽 Light',

    霞鹜文楷 字体推荐 字体推荐 在vscode里面 'Fira Code', '霞鹜文楷等宽 Light', 仓库 https://github.com/lxgw/LxgwWenKai https:// ...

  3. stm32读写sd卡代码解析和调试总结

    一 前言   做程序员真是来不得半点偷懒,假如你对经常使用的代码不熟悉,早晚会让你付出沉重的代价.像认识自己的灵魂一样认识每行用到的代码,这才是一个合格的程序员,才不至于在出现问题的时候出现慌乱.   ...

  4. 基于AmbiqMicro-AMA3B2KK-KBR的可穿戴智能手环解决方案之心率测量源码解析

    一 前记 梳理该可穿戴产品的手环,产品,是一种成长.也是一个总结. 二 源码解析 1 初始化:这里主要初始化心率的检测间隔时间和心率值的位数. /* initialize heart rate pro ...

  5. Unity3D 横板跳跃游戏半成品demo源代码

    项目介绍: 基于B站的 Unity3D新手教程进行学习制作,但视频中的做法有很多BUG,此demo是经过优化,几乎修复了教程里带的所有bug. 实现了基本的功能比如:怪物ai,开始菜单,设置菜单,地图 ...

  6. verilog勘误系列之-->设计行为仿真和时序仿真不一致分析

    描述 最近在vivado中设计一个计算器: 28bit有符号加减法,结果出现行为仿真和时序仿真不一致情况 原因 本篇是由于组合逻辑部分敏感信号使用错误导致 代码 r_a, r_b : 对计算数据a, ...

  7. Harris/Shi-Tomasi角点检测

    机器视觉--角点检测 什么是角点检测 在几何学里,我们会看到各种各样的三角形.多边形等,它们都有一个显著的特征:包含了角点信息.比如在三角形里,我们有三个角:在矩形里,我们有四个角.我们将找到这些图像 ...

  8. nginx root 和 alias 的区别

    区别: alias 含有rewrite的意思,可以重写掉不存在的路径.( nginx rewrite请看这里) 比如正常访问的地址是: http://ip:port 当我想让 http://ip:po ...

  9. KingbaseES checkpoint_timeout参数对wal日志量的影响

    前言 在KingbaseESV8R6数据库中,必须先将更改写入WAL日志(老版本称为 xlog),然后才能将这些更改从内存shared_buffer 写入到磁盘. 前两天有个同事遇到一个问题,wal日 ...

  10. CI和自动化测试的结合(jenkins的搭建和使用)

    CI持续集成是一种思想,具体实现是通过jenkins持续集成工具去实现的. Jenkins的安装和配置(war包启动) 安装jenkins的方式有两种: 方式一:通过下载安装包安装,jenkins.m ...