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
    +关注

    关注

    553

    文章

    7998

    浏览量

    348873
  • 存储
    +关注

    关注

    13

    文章

    4311

    浏览量

    85838
  • 固件
    +关注

    关注

    10

    文章

    556

    浏览量

    23021

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

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

收藏 人收藏

    评论

    相关推荐

    如何判断继电器是否正常工作

    判断继电器是否正常工作是一个涉及多个方面的过程,主要包括外观检查、电气性能测试以及实际应用的表现等。以下将从这些方面详细阐述如何判断继电器是否正常
    的头像 发表于 09-10 11:06 863次阅读

    如何在空白闪存上初始加载AT固件

    我一直在尝试将 AT 固件加载到我设计的新 PCB 上,但它不起作用,我想知道我是否做错了什么。这是我的板子: 为了进行比较,我一直在使用从速卖通供应商处购买的 ESP-01 模块。我正在
    发表于 07-15 06:47

    ESP32-C3-WROOM2烧录定频固件后,如何烧录回正常固件

    ESP32-C3-WROOM2模块烧录定频固件过SRRC认证,烧录了定频因件后,烧录多了几个,有几个模块需要烧录回正常固件,发现能烧录,但从串口信息可以看到,模块启动不
    发表于 06-07 07:33

    CYUSBKIT-003引导加载程序从主机接收固件后,引导加载程序是否会断开与主机的连接以重新识别?

    我有一块 CYUSBKIT-003 板,我正在学习它。我有两个问题要问您。 1.默认引导程序是引导加载程序,它位于 FX3 的 ROM 。引导加载程序从主机接收
    发表于 05-29 06:42

    STM32H在IAR如何实现从FLASH加载到SRAM运行程序?

    如题,STM32H 在IAR如何实现从FLASH加载到SRAM运行程序 有没有相关的例程可供参考
    发表于 03-28 07:46

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

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

    运行FPGA然后将img加载到FX3时出现了黑屏是为什么?

    当我运行 FPGA 然后将 img 加载到 FX3 时出现了黑屏,我使用了 amcap.exe。 FPGA 输出动态模式。 请帮我解决我的问题。 我附上了 chipscope 和 amcap.exe
    发表于 02-26 08:36

    CYUSB2014固件编程后,出现“此设备无法启动”的原因?如何解决?

    普拉斯FX3 USB引导加载程序设备”,固件编程成功。 但是随后,就无法与设备通信了。 无法识别任何设备,C++ API 函数 \" usbDevice-d >
    发表于 02-26 07:55

    请问CYT4BFCM7 ITCMCM7 DTCM是什么?

    嗨 我正在使用 CYT4BF 正在检查 ITCM 和 DTCM。 CAN 您可以通过 CYT4BF 数据表的地址映射查看 CM7 ITCM/DTCM、
    发表于 02-01 07:47

    CYT4BF通过分配ITCM内存来使用经常执行的代码,下载程序时报错的原因?

    正常,但是下载程序时出现总线错误。 Q1) 总线错误是否因为ITCM内存地址与ROM地址重叠而发生? Q2) 您 CAN 告诉我如何将常用代码分配给 ITCM 内存并使用它? 问
    发表于 01-31 06:34

    在睡眠/深度睡眠模式下通过调试器TRACE32读取来自ITCM/DTCM地址的数据,会出现问题吗?

    我正在使用 CYT4BFC 和 TRACE32 调试器。 如下所示,CM7_0/CM7_1 的 ITCM 地址为 0x0000_0000,DTCM 地址为 0x2000_0000。 通过
    发表于 01-18 10:48

    如何使用TCM提高CPU性能?

    7_0 和 CM7_1)。2。启用 iCache 时使用 ITCM 会带来任何 CPU 性能优势吗?3.如何以最佳方式设计时钟频率以优化 CPU 性能? 我们是否为 CPU 和内存使用
    发表于 01-18 07:01

    ldr文件如何加载到SC589开发板运行?

    ADI官方的SC589开发板,在cces可以通过ICE-2000直接加载程序进行评估测试,测试通过之后我想把程序直接加载到SC589,以使在开发板接电源时,直接运行
    发表于 01-12 06:22

    能否不使用ITCM就对Flash进行编程呢?

    一些是执行ITCM当中的指令,请问为什么要如此设计呢? 3 蜂鸟E203具有ITCM和DTCM,但是debug ram的指令和数据全部堆放在了IT
    发表于 01-10 07:28

    e203 rom启动仅仅是引导到itcm执行指令吗?flash启动就是加载指令到itcm吗?

    e203 rom启动仅仅是引导到itcm执行指令吗?flash启动就是加载指令到itcm吗? rom代码不是存储器形式:(能否解释一下哎)
    发表于 01-10 07:05