IAR中链接多个二进制文件

IAR是常用的嵌入式开发工具,自带编译链接环境,因此编译和链接的配置和ARM GCC是有所区别的,在最近的一个项目中我们需要链接一些已经编译好的二进制文件到最终的二进制文件中,所以就研究了一下链接预编译的二进制文件的方法。

问题原因

实际问题是这样子的,我们的一款芯片是多核心架构的,IAR本身虽然支持多核心调试,但是如果另外一个核心不需要调试,而是一些现成的二进制文件,我们就没必要每次都开两个workspace下载,一个比较简单的方式是将预编译好的二进制文件直接编译到最终的结果文件中就可以了

具体做法

IAR双核心调试配置方式

首先我们来看看IAR双核心调试的时候最终的链接是怎么做的(以CM4主核和CM0辅核为例),通过工程配置信息,我们发现其实最终编译出来的也只有一个binary文件,IAR实际就是将CM0编译出来的二进制文件链接到CM4上,最终通过CM4的flashloader下载的,我们来看看具体的实现方式。

IAR_Dual_core_option.PNG

在linker的input选项卡中我们看到linker会直接将CM0的binary文件添加进CM4的结果文件中。同时可以通过symbol和section可以定义binary放的地址,这两个符号可以在linker的icf文件中找到:

define symbol cm0_image_start        = 0x01000000;
define symbol cm0_image_end          = 0x01040000;
define region cm0_region = mem:[from cm0_image_start to cm0_image_end];
define block SEC_CORE_IMAGE_WBLOCK          { section  __sec_core };

上面就是双核的时候IAR的配置,不过在这种方式下,我一直没有找到继续添加其他文件的方式,没办法,只好找其他方式来搞定。

更为直接的方式

毕竟借助双核的配置添加binary文件代价有些大,有些情况也不好做双核的配置,所以更为常用的方式是用两外一种更为直接的方式搞定。IAR实际Linker原生支持二进制文件,我们可以在工程配置的linker->Extra Option中增加需要添加的二进制文件,数量也没什么限制:

Raw_binary_support.PNG

几个重要参数如下:

--image_input $PROJ_DIR$\riscy\hello_ri5cy.bin,ri5cy_bin,ri5cy_section,8
--keep ri5cy_bin
--image_input $PROJ_DIR$\riscy\hello_zero.bin,zero_bin,zero_section,8
--keep zero_bin 

相应的在ICF文件中也要定义相应的地址,否则IAR linker会直接在编译的程序后面顺序添加binary文件,而我们需要固定地址才行。其实定义地址超级简单,只需要在linker的ICF增加下面两行就可以了:

place at address mem:0x80000 { section ri5cy_section };
place at address mem:0x1020000 { section zero_section };

这两行定义的是二进制文件存放的首地址。

发表新评论