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

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

3天内不再提示

CM3加载到 ITCM中的固件是否正常

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-07-22 09:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前端时间回来了一块板子,于是各个团队都进入了紧张的 Bringup 工作中。

这块板子上的主芯片是一颗 Arm Cortex M3 + DSP 的异构芯片,结构大概是这样的:

ae4ccc36-06f8-11ed-ba43-dac502259ad0.png

CM3 和 DSP 的固件独立存储在 Flash 中,上电后 CM3 先启动,然后 CM3 再把 DSP 的固件从 Flash 中加载到 Sram 中,最后再从 Sram 中拷贝到 DSP 的 ITCM 中,至于为什么不绕过 Sram 直接把 DSP 的固件从 Flash 中读到 DSP 的 ITCM 中,我们这里先不讨论。

Bringup 进行到第二天的时候,负责 DSP 的同学反馈说,DSP 的程序加载上去后,始终不能正常运行 —— 观察不到任何正常启动的现象。其实在 Bringup 刚开始阶段,这种情况是经常遇到的,我第一反应就是,让这位同学连上 DSP 的 JTAG 去单步调试,看到底发生了什么。

第三天的时候,我又找这位同学问了下,现在是什么情况了,这位同学一脸茫然的说:好奇怪,如果用 DSP 的 JTAG 直接下载固件到 ITCM,就能正常运行,通过 Cortex M3 去加载,就不能正常运行。听到这个差别,我潜意识的问他:有没有确认过 CM3 加载到 ITCM 中的固件是否正常?这位同学说应该不会有问题,这套流程他们之前在其他平台上都验证过。他们还有一些其他的坏一点,准备优先就他们的怀疑点做一些实验排查,比如 DSP 的cache 啊,复位控制啊,PLL 频率啊什么的。

因为 Bringup 阶段事情比较多,我也就没在追究去忙其他的事情了。

第四天,说所有怀疑的实验都做完了,还是没进展。我说确认下 CM3 拷贝到 ITCM 里面的固件是否正常吧 —— CM3 把固件拷贝到 ITCM 后,在用 JTAG 读出来,然后对比。

实验做完,这位同学蔫蔫的说,从 ITCM 中读出来的固件数据和编译出来的固件数据有一小部分对不上。而且这部分对上的数据位于固件尾巴上。

固件加载出错,程序肯定无法正常运行!那就直接排查数据在哪个环节出错的吧!

固件从 Flash 中加载到 Sram 中后,也用 JTAG 读出来和原始数据对比,结果正常!

那就是从 Sram 到 ITCM 的这个环节处了问题!

查看这段拷贝的代码,原来就是一个 rt_memcpy —— 我们在 Cortex M3 上运行的是 RT-Thread

ae5818e8-06f8-11ed-ba43-dac502259ad0.jpg

这位同学用 JLink 单步跟踪这段代码发现,每次程序运行到第二部分的时候,拷贝就异常了,能看到程序执行了,但是数据就是没拷贝过去!而第一段的拷贝都是正常的。

事出异常必有妖,我决定反汇编看看这段代码后面藏了什么玄机。

ae657e48-06f8-11ed-ba43-dac502259ad0.jpg

果真有猫腻,第一段代码,对于大块的 4 字节对齐的数据,CPU 是以 STR 这样的指令超 ITCM 写数据,即以 Word 为单位访问 ITCM,对于第二段,也就是一段数据的尾巴,剩下的那些零零散的不够四字节的数据,CPU 是以 STRB 这样的指令超 ITCM 写数据,即以字节为单位访问 ITCM。

memcpy 这样写是为了提高数据搬运的效率。对于按照 Word 对齐的数据,以 Word 的模式搬运,对于剩下的非Word 对齐的数据,以 Byte 模式搬运,一次搬运四字节肯定比一次搬运一字节要快。

但是我们这里踩了什么坑呢?以 Word 方式访问 ITCM 就正常,以 Byte 的方式访问就不成功?

为了进一步确认这个结论,我写了一段测试代码:

ae75cc3a-06f8-11ed-ba43-dac502259ad0.png

这段测试代码构造了一个 memcpy 命令,我可以在命令行通过 memcpy cnt value 来控制每次超 ITCM 搬运不同长度的数据,下面就开始测试:

ae860c6c-06f8-11ed-ba43-dac502259ad0.jpg

一次写 16 字节的 1 到 ITCM,然后通过 Jlink 可以看到 ITCM 这片区域被成功的写入了 16 字节的 1。因为 16 是 4 个 4 字节,所以这次的 memcpy 是通过 STR 指令进行的。

ae963010-06f8-11ed-ba43-dac502259ad0.jpg

一次 copy 17 字节的 2 到 ITCM, 通过 JLink 观察右下角的 ITCM,发现只写进去了 16 字节。根据 memcpy 算法,前 16 字节 是以 Word 的形式通过 STR 指令写入 ITCM 的,剩下的 一 字节 是以 STRB 的形式写入 ITCM 的。

aea7b628-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 18 字节,同样发现只写进去了 16 字节。

aeb47a2a-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 19 字节,还是只写进去了 16 字节!

aec132c4-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 20 字节,全部写入成功了!按照 memcpy 算法,20 字节是以 五次 STR 指令,以 Word 模式拷贝过去的。

aece75e2-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 21 字节,发现还是只写入了 20 字节!

aed88a14-06f8-11ed-ba43-dac502259ad0.jpg

一次 Copy 24 字节,全部拷贝成功!

到这里,我基本确认 Cortex M3 以 Byte 模式访问 ITCM 会失败!

然后联系 IC 设计方,确认是什么原因。IC 设计方回复说:Cortex M3 确实无法以 Byte 模式访问 ITCM,这是总线设计上限制的!

艾玛呀!忽然有种想打人的冲动,你文档上根本没提有这个限制啊!

后来想想,在无数次的 Bringup 过程中,类似这种固件拷贝不完整的情况,似乎坑过我好几次,有一次 Linux 内核起来后,很多驱动都加载失败,我一路从 Linux Kernel 查找到 U-Boot,再查到下载,最后确认是固件下载工具有问题,DTB 没有下载完整,而且这尼玛也是因为 flash 扇区对齐的问题导致的!还有一次从 U-Boot SPL 跳到 Arm turst firmware 后,总是卡死固定的位置,然后 Dump 发现 ATF 固件加载不完整,最后确认是 CLK 驱动问题引起 eMMC 工作异常导致的。

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

    关注

    559

    文章

    8219

    浏览量

    364184
  • 存储
    +关注

    关注

    13

    文章

    4704

    浏览量

    89618
  • 固件
    +关注

    关注

    11

    文章

    568

    浏览量

    24630

原文标题:固件下下去,板子没反应,我也很绝望啊

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    芯来e203移植开发分享(二)——仿真文件简述与itcm固化程序

    ,其实就是把rv32ui-p-add.verilog16进制文件加载到itcm的ram,需要主要的itcm
    发表于 10-27 06:04

    蜂鸟例程的编译与程序的加载

    install、make run_test,所有命令都定义在vsim文件夹下的Makefile。这一过程与1.1节所述内容一致,只是需要修改TESTCASE为待执行程序对应路径。 2 程序的加载
    发表于 10-24 13:34

    蜂鸟内核ITCM模块以及取值过程

    本文主要介绍蜂鸟ITCM模块。ITCM在蜂鸟是用于存储指令的,由于蜂鸟E203内核定位是对于小型的指令系统,因此在蜂鸟定位的系统,指
    发表于 10-24 08:29

    蜂鸟内核ITCM模块及取值过程

    本文主要介绍蜂鸟ITCM模块。ITCM在蜂鸟是用于存储指令的,由于蜂鸟E203内核定位是对于小型的指令系统,因此在蜂鸟定位的系统,指
    发表于 10-24 07:27

    E203分享之DDR扩展方案实施流程(下)

    gcc_hbirdv2_ilm.ld: 修改为: (2)FLASH下载方式,程序先下载到flash里头,再加载到ITCM和DDR3里头
    发表于 10-23 06:16

    如何将源地址 FCANFDx FiF 0 加载到 DMA 线的 SRC 寄存器

    您能否提供一个示例,说明如何将源地址 FCANFDx FiF 0 加载到 DMA 线的 SRC 寄存器? 我不想使用固定地址加载,例如: cy_stc_dma_descriptor_t
    发表于 07-18 08:06

    CX3无法将固件加载到SPI闪存如何解决?

    我无法将固件加载到 SPI 闪存。 步骤如下: 1. 开机,运行 USB 控制中心, 2.点击boot loader,点击FX3,然后选择“SPI flash”。然后USB控制中心显示“未找到
    发表于 07-16 07:37

    无法将固件刻录到PFlash的原因?怎么解决?

    。 据我所见,加载到 RAM 部分工作正常,当它开始闪存操作时,设备会冻结并需要电源循环,并且通常需要通过 miniwiggler 重新编程。刻录机功能通过链接脚本存储在 RAM ,以允许成功编程
    发表于 07-15 07:39

    求助,CYBT-243053-02 EZ固件问题求解

    编程器将 EZ 固件加载到 CYBT-243053-02-EVAL,但该主板未列入其套件/探针清单。 请建议正确的方法来对电路板进行编程。 2)。 据说EZ固件支持的最大MTU为128,我们可以通过软件增加它吗。
    发表于 07-04 07:50

    STM32IDE如何设定代码到ITCM运行?

    近期使用STM32MUX生成STM32IDE的代码(MCU是STM32H743),目前希望可以将部分代码定位到ITCM运行,加快处理速度,关于代码的.id链接文件,该部分资料比较少,目前我只
    发表于 06-24 06:45

    如何使用Keil将二进制文件加载到外部SPI Flash

    我想知道是否有办法使用 Keil 将随机二进制文件加载到外部 SPI 闪存。二进制文件将通过 LPC54102(OM13077 EVK 板)。我知道一些用于 FPGA 的 ISE 允许您执行此作
    发表于 03-17 06:37

    将指定文件下的函数加载到指定ram问题

    问题:mcuxpresso环境,xip模式下我需要使用flexspi将norflash的一部分作为文件系统,将flex以及fatfs相关函数全部加载到ram,发现rodata仍然在flash地址
    发表于 03-12 17:02

    STM32H743对关键中断函数,使用ITCM搬至RAM运行,仿真进入HardFault_Handler报错怎么解决?

    ,CubeIDE编译能正常通过,且map文件,对已搬至ITCM RAM区域运行的中断函数的地址是OK的。只要上电一仿真运行就会进入HardFault_Handler函数,MCU主频是480MHz,不知
    发表于 03-07 08:04

    DLP4500-C350REF I2C烧录固件异常的原因?

    测试,无论固件大小是否大于16MB,均可正常烧录,正常投影。 请协助分析下原因,并提供下解决思路!! 问题2: 根据DLPC350手册,DLPC350内部存在2个24bit的buff
    发表于 02-18 07:11

    使用wavevison5软件时,FPGA的程序是在线加载的,CY7C68013A固件也是在线加载的吗?

    我现在没有使用Wavevison5软件,而是用JTAG接口把snar019文件夹的FPGA程序直接下载到FPGA,下载之后为什么指示灯显示的有点不正常,PII_LD和DCLK_L
    发表于 12-27 08:11