如何在iar链接文件icf中指定文本段的地址

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

如何在iar链接文件icf中指定文本段的地址

Jump to solution
1,825 Views
jingyangxie
Contributor V

我在使用ixmrt1170的开发板,因为程序操作片内ROM去的大小,有7兆左右,现在想把代码段放到SDRAM中,如何处理?

原来开发板的ram.icf示例为:

define symbol m_interrupts_start = 0x00000000;
define symbol m_interrupts_end = 0x000003FF;

define symbol m_text_start = 0x00000400;
define symbol m_text_end = 0x0003FFFF;

 

现在已知SDRAM的起始地址是0x80000000,如何进行分配,以使程序烧录后,能正确运行

0 Kudos
1 Solution
1,797 Views
jay_heng
NXP Employee
NXP Employee

你这里面只有 0x1000 的偏移,改成 0x2000 的偏移试试。这个_end  也没改完全。

define symbol m_interrupts_end = 0x800003FF;

 

另外可以生成 srec 格式文件给 MCUBootUtility

View solution in original post

0 Kudos
14 Replies
1,808 Views
jay_heng
NXP Employee
NXP Employee

当代码 RO 段全部链在 SDRAM 时,这时候在 IDE 里无法将工程直接下载进 Flash 离线启动,需要借助额外工具(比如 MCUBootUtility)做下载(下载过程还要使能 DCD)。

在原 IDE 工程里只能在 SDRAM 调试(仿真器直接将二进制下载进 SDRAM 运行),这种方式断电程序会丢失。调试前 SDRAM 需要单独初始化,如下脚本里都包含了 SDRAM 初始化操作

\SDK_2.12.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7\iar\evkmimxrt1170_connect_cm7.mac

\SDK_2.12.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7\evkmimxrt1170_connect_cm4_cm7side.jlinkscript

 

0 Kudos
1,803 Views
jingyangxie
Contributor V

目前是用MCU BootUtility烧录,配置如下:

jingyangxie_0-1666317666527.png

其中DCD bin的路径为\NXP-MCUBootUtility-3.5.0\NXP-MCUBootUtility-3.5.0\src\targets\MIMXRT1176\evkmimxrt1170_xip_boot_header_dcd.bin

 

使用的例程是\SDK_2.12.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world

链接文件为MIMXRT1176xxxxx_cm7_sdram_txt.icf

点击"ALL-In-One-Action",显示:

jingyangxie_0-1666318007546.png

 

 

0 Kudos
1,802 Views
jingyangxie
Contributor V
链接文件修改了偏移地址:
define symbol m_interrupts_start = 0x80001000;
define symbol m_interrupts_end = 0x800003FF;

define symbol m_text_start = 0x80001400;
define symbol m_text_end = 0x801FFFFF;

define symbol m_data_start = 0x20000000;
define symbol m_data_end = 0x2003FFFF;

define symbol m_data2_start = 0x202C0000;
define symbol m_data2_end = 0x2033FFFF;

define symbol m_data3_start = 0x80200000;
define symbol m_data3_end = 0x82FFFFFF;
0 Kudos
1,798 Views
jay_heng
NXP Employee
NXP Employee

你这里面只有 0x1000 的偏移,改成 0x2000 的偏移试试。这个_end  也没改完全。

define symbol m_interrupts_end = 0x800003FF;

 

另外可以生成 srec 格式文件给 MCUBootUtility

0 Kudos
1,790 Views
jingyangxie
Contributor V
可以了,多谢多谢
0 Kudos
1,787 Views
jingyangxie
Contributor V

另外我还想问下,使用DCD.c文件如何产生dcd.cfg文件;或者有没有MXRT1176\evkmimxrt1170_xip_boot_header_dcd.bin这个文件对应的cfg参考下

0 Kudos
1,785 Views
jay_heng
NXP Employee
NXP Employee

这两个小工具都可以将 dcd.cfg 转换成 dcd.bin

\NXP-MCUBootUtility-3.5.0\tools\dcdgen

\NXP-MCUBootUtility-3.5.0\tools\imgutil

 

dcd.c 就是 dcd.bin 吧,前者只是直接用于工程编译。

0 Kudos
1,780 Views
jingyangxie
Contributor V

通过查看,bin文件不是dcd.c,打开发现是二进制文件,请问BootUtility这个工具是依据什么产生的这个evkmimxrt1170_xip_boot_header_dcd.bin

0 Kudos
1,782 Views
jingyangxie
Contributor V

好的,我试下

0 Kudos
1,813 Views
jay_heng
NXP Employee
NXP Employee

如果你是想工程全部 RO 代码都放在 SDRAM,可以使用 SDK 包里的 \SDK_2.12.0_MIMXRT1170-EVK\devices\MIMXRT1176\iar\MIMXRT1176xxxxx_cm7_sdram_txt.icf 链接文件。如果你想工程二进制能下进 Flash 里离线启动,需要做如下修改:

 

define symbol m_interrupts_start       = 0x80002000;
define symbol m_interrupts_end         = 0x800023FF;

define symbol m_text_start             = 0x80002400;
define symbol m_text_end               = 0x801FFFFF;

 

 

0 Kudos
1,811 Views
jingyangxie
Contributor V

编译生成了out文件,但是MCU BootUtility烧录失败,在“connect bootROM”就报错

ZDPXOS3@ZX]4Z@Y(KEJ8WJ4.png

0 Kudos
1,804 Views
jay_heng
NXP Employee
NXP Employee

你可以生成 hex 或者 srec 格式镜像文件,然后打开文件看里面是不是全是连续地址(仅在一个Device Map空间)。你如果想把二进制下载进 Flash,必须是连续地址的镜像文件。

1,798 Views
jingyangxie
Contributor V

生成的地址是连续的,可以看下附件

0 Kudos