大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MXRT系列MCU的ROM启动日志

  关于 i.MX RT 启动问题解决的文章,痞子衡写过非常多,其中大部分都是具体到某一类启动设备下的具体问题分析,比较依赖经验,这些经验当然是非常有用的。此外也有一篇 《启动失败先查看SRC_SBMRx寄存器》,这篇内容通用于全部启动设备,算是葵花宝典系列了。一直以来我们都当芯片启动 ROM 程序运行状态完全是个黑盒子,如果遇到异常,我们通常是去猜其可能遇到的问题,那么能不能不全靠猜呢?答案是可以的!这便是痞子衡今天要聊 ROM 启动日志:

一、ROM启动日志原理

  我们知道 i.MX RT 系列上电都是片内固化的 ROM 程序代码先运行,由 ROM 来加载启动设备里的用户程序去执行,所以如果用户程序不能正常启动,一定是 ROM 程序执行过程中遇到了异常。

  i.MX RT 初始 ROM 代码来源于它的老大哥 i.MX 处理器,翻看 i.MX 参考手册其中有关于 ROM Log Event 功能的描述,所谓 ROM Log Event 就是 ROM 程序在执行过程中将其重要节点事件(状态)按时间轴记录到一个日志缓冲区里(日志缓冲区通常在片内 RAM 固定地址处),这个日志内容显然对于分析 ROM 执行过程非常有用,那么 i.MX RT 系列 ROM 代码里有没有保留这个功能呢?很高兴,它还在!

  下表记录了 i.MX RT 全系列型号的 ROM 启动日志缓冲区地址:

芯片 启动LOG地址 最大启动LOG长度(Bytes)
i.MXRT118x 0x3048a000 264
i.MXRT117x 0x2024ad78 264
i.MXRT116x 0x2024ad78 264
i.MXRT106x 0x2020523c 256
i.MXRT105x 0x202051c8 256
i.MXRT104x 0x2020523c 256
i.MXRT102x 0x2020515c 256
i.MXRT1015 0x2020515c 256
i.MXRT1011 0x20203d38 256
i.MXRT6xx 0x10017f00 264
i.MXRT5xx 0x10017ef8 264

二、获取ROM启动日志数据

  上一节我们知道了 ROM 启动日志缓冲区存储地址,获取其数据的方法就简单了,可以直接连接上仿真器去读取。不过这里有需要注意的地方:如果是在 ROM 跳转用户程序之前发生的异常(日志体现为启动失败),那么内核 PC 应该还停留在 ROM 空间,这时候 RAM 区数据是完整的,无人破坏。如果是在 ROM 跳转到用户程序之后发生的异常(日志体现为启动成功),这时候用户程序已经开始执行了,这可能会破坏 RAM 区数据(如果用户程序链接文件里用到了存储启动日志的 RAM 区域),这时候启动日志内容就不一定有效了。

  以 i.MXRT1170 为例,痞子衡找了一块开发板,上电后挂上 J-Link 调试器,使用 J-Link 命令行工具里的 SaveBin 命令从 0x2024ad78 地址处读取最大的日志数据存储到 bootlog.bin 文件中。这里需要注意在用 J-Link 连接目标设备时尽量不要选 MCU 型号,而用内核 CORTEX-M7 代替,这样可以防止选了 MCU 型号而自动加载执行相应配套初始化脚本(万一脚本里有片内 RAM 相关操作破坏日志数据)。

命令格式:SaveBin <filename>, <addr>, <NumBytes>
命令解释:Save target memory range into binary file.

  除了借助调试器,我们也可以借助芯片串行下载模式下配套的 MCUBoot 工具链(Flashloader+blhost)来获取 ROM 日志数据,具体可见 《MCUBootUtility v6.3发布,支持获取与解析启动日志》 一文 2.3 小节里的途径二。

三、解析ROM启动日志

  i.MXRT 全系列 ROM 启动日志缓冲区数据结构并不是完全一样的,主要分为两个版本。其中 i.MXRT10xx 系列的日志结构如下,跟 i.MX 处理器差不多,每条日志内容压缩存储在一个 uint32_t 型变量里,最大支持 64 条日志(当实际日志超出 64 条时,后面的日志直接被忽略不记)。

uint32_t pu_irom_log_buffer[64];

  而 i.MXRT11xx 系列以及 i.MXRTxxx 系列的日志结构相比前一代有一些改进,其结构如下,首先增加了 entryIndex 用于记录有效的日志个数,同时也增加了 checkSum 用于校验全部日志的完整性(但实际意义并不大,ROM 异常运行时计算 checkSum 时机难以确定)。

typedef struct _log_context
{
uint32_t entryIndex;
uint32_t logEntries[64];
uint32_t checkSum;
} log_context_t;

  此时最大日志个数依旧是 64(当实际日志超出 64 条时,会找到日志缓存区里排在最后的状态为 Fail 或者 Fatal 的日志,然后只保存其后面的正常日志并继续向下记录)。

举例说明:当前记录到了第 65 条日志
- 如果 logEntries[63:0] 里没有 Fail 或者 Fatal 状态的日志,那么清空数组,entryIndex 从 0 开始记录。
- 如果 logEntries[31] 是排在最后的 Fail 或者 Fatal 状态的日志,那么将 logEntries[63:32] 拷贝到 logEntries[31:0],entryIndex 重置为 32 再开始记录。

  除了以上启动日志缓冲区数据结构差别之外,i.MXRT10xx 与 i.MXRT11xx/i.MXRTxxx 在单条日志值定义上也是完全不同的,不过具体如何解析每条日志内容,用户无需过多关注,这在痞子衡开发的 MCUBootUtility v6.3 软件里已经全部搞定了,用户可以直接查看解析后的日志结果。

  还是继续以 i.MXRT1170 为例查看解析后的日志结果,我们在 FlexSPI1 连接的串行 NOR Flash 里下载一个能正常启动的 XIP 裸用户程序(非签名非加密),将芯片启动模式设为 2'b10,当看到程序正常执行后,挂上调试器读出启动日志数据(确保日志未被用户程序),并用 MCUBootUtility 软件解析如下,还是能够清晰地看到 ROM 执行过程信息的。

  至此,恩智浦i.MXRT系列MCU的ROM启动日志痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:如果i.MXRT离线无法启动,试着分析ROM启动日志的更多相关文章

  1. 痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持. 痞子衡之前写过一篇关于FlexSPI LUT的文章 <从头开始认识i ...

  2. 痞子衡嵌入式:i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项. 最近痞子衡在支持一个印度客户,这个客户项目主芯片选择 ...

  3. 痞子衡嵌入式:i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同. 因为 i.MXRT 全系列 ...

  4. 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...

  5. 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...

  6. 痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的开源项目 RT-UFL. 痞子衡在近两年多的i.MXRT客户项目支持过程中,遇到的一个相当高频的问题就是制作i.MXRT下载算法.我们 ...

  7. 痞子衡嵌入式:FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败问题. 本篇是<系统时钟配置不当会导致i.MXRT1xxx ...

  8. 痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT开发板(2) - 在Flash调试及离线启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1062 TencentOS Tiny EVB_AIoT开发板在Flash调试与离线启动. 腾讯 TencentOS 团队于 ...

  9. 痞子衡嵌入式:链接函数到8字节对齐地址或可进一步提升i.MXRT内核执行性能

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上进一步提升代码执行性能的经验. 今天跟大家聊的这个话题还是跟痞子衡最近这段时间参与的一个基于i.MXRT1170的大项目有 ...

  10. 痞子衡嵌入式:轻松为i.MXRT设计更新Segger J-Link Flash下载算法文件

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是为i.MXRT设计更新Segger J-Link Flash下载算法文件. 想要在Flash中调试,基本是离不开Flash下载算法的,毕 ...

随机推荐

  1. 我从 Python 潮流周刊提取了 800 个链接,精选文章、开源项目、播客视频集锦

    你好,我是豌豆花下猫.前几天,我重新整理了 Python 潮流周刊的往期分享,推出了第 1 季的图文版电子书,受到了很多读者的一致好评. 但是,合集和电子书的篇幅很长,阅读起来要花不少时间.所以,为了 ...

  2. odoo Actions学习总结

    环境 odoo-14.0.post20221212.tar Actions(动作) action定义系统响应用户操作的行为:登录.操作按钮.选择发票等- action可以存储在数据库中,也可以作为字典 ...

  3. [UE源码] 关于使用UE待改进的一些尝试

    UE从自己做了一款游戏后,发现了蓝图以及UE引擎本身的一些优缺点: 1.蓝图在一些简单的逻辑上书写方便,直观,而且编译速度快,但是也有一些其他问题: 结构体赋值后,无法二次修改 只有3种容器Array ...

  4. php 模型浏览器

    docker安装 文档:https://github.com/SeleniumHQ/docker-selenium docker run -d -p 4444:4444 -p 7900:7900 -- ...

  5. java实现二维码登录功能

    本文采用Springboot工程进行开发,使用Google的zxing生成二维码,直接放代码: <?xml version="1.0" encoding="UTF- ...

  6. 【Vue】el-select 数据过多替代方案

    一.需求问题: 一开始就考虑使用简单el-select选取数据,但是后面数据量增多, 超过一千条开始,组件会很卡不好用,第二个是接口也慢了 数据量多的话是有一个filterable做支持了,可以输入关 ...

  7. 【Windows】解决微软商店打不开的问题

    参考贴吧的帖子: https://tieba.baidu.com/p/6028738660#123983609458l 1.打开"运行"输入 inetcpl.cpl (" ...

  8. 【OracleDB】 07 分组查询 & 分组函数

    分组函数 分组函数作用于一组数据,并对一组数据返回一个值. Oracle中分组函数的种类: - 求平均值 AVG - 计数记录数 COUNT - 求最大值 MAX - 求最小值 MIN - 求和 SU ...

  9. 在本地主机使用anaconda3 安装MindSpore环境——教程(GPU版本)

    创建MindSpore虚拟环境 创建虚拟环境并安装依赖库 conda create -n mindspore python=3.7.5 cudatoolkit=10.1 cudnn=7.6.5 gmp ...

  10. SonarQube集成Xunit单元测试

    安装SonarQube 利用docker 安装SonarQube docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE ...