原创 IAR如何将二进制文件链接到代码中?

2011-1-6 22:36 5443 7 9 分类: MCU/ 嵌入式
如何将二进制文件链接到代码中?




    有时需要将一些二进制文件链接到项目中,怎么办呢?IAR提供强大的链接功能.下面简单介绍一下如何把一个二进制的文件"ZROM_Data.bin"编译链接到代码中.
    首先要用winhex创建二个只有4字节文件的二进制文件.为什么是4字节呢?因为ARM是4字节对齐的,所以创建4字节的文件最合适又省空间的.将这两个文件分别命名为"ZROM_BEGIN","ZROM_END.BIN".我将用这两个文件来辅助定位和确定"ZROM_Data.bin"的位置和文件大小.
    然后找开IAR项目的OPTION对话框,定位到Linker->Input标签,如下图所示.输入
   ZROM_AAAA
   ZROM_DATA
   ZROM_ZZZZ



名字可以随意,这三个名字表示后面将要链接到项目的3个文件.然后定位到Linker->Extra options选中"use command line options",在文本框输入以下命令(命令格式请按F1查看IAR帮助文件):
--image_input=$PROJ_DIR$\ZROM_BEGIN.BIN,ZROM_AAAA,ROM_region,4
--image_input=$PROJ_DIR$\ZROM_Data.Bin,ZROM_DATA,ROM_region,4
--image_input=$PROJ_DIR$\ZROM_END.BIN,ZROM_ZZZZ,ROM_region,4 



    最后,在Linker->list标签中选中Generate linker map file,让链接器生成map文件,以确认数据
是否正确链接目标代码中.注意,在输入上述命令时,请不要留空格,行尾也不能留(图中红圈部分),否则编译不通过.



      接下来查看二进制代码是否链接到目标文件中.打开map文件,查找"ZROM_AAAA".如下图所示,三个二进制文件已经成功被链接目标代码.



    难道就这么完了吗?没有!从上图可以得知,ZROM_AAAA的首地址为0x080000c4,ZROM_DATA的首地址为0x080000c8,ZROM_ZZZZ的首地址0x0802313c.但是随着代码的增减,每次编译这些地址值将会发生很大的变化,如何能自己的代码找到这ZROM_DATA这块数据的首地址以及确定它的大小呢?另外,你可能会问:为什么要取名为ZROM_AAAA,ZROM_DATA,ZROM_ZZZZ呢?细心的朋友会发现,IAR编译成的标代码会按照字母的顺序来链接,所以按这种命名方法,生成的代码是紧紧挨在一块的,用ZROM_AAAA的址可以确定"ZROM_Data.Bin"的开始位置,用ZROM_ZZZZ可以确定"ZROM_Data.Bin"的结束位置,这样,二进制文件的大小和位置都确定了,接下来用代码定位到访问这个二进制文件
   文件首地址u8 *)&ZROM_DATA
   文件大小u32)&ZROM_ZZZZ-(u32)&ZROM_DATA
 至此大功告成!是不是很方便?   


梅川酷子

文章评论2条评论)

登录后参与讨论

用户1694343 2013-10-25 16:33

你看一下第一张图片,有定义ZROM_DATA这个符号的

用户377235 2013-9-23 17:39

(u8 *)&ZROM_DATA // 这里编译错误,提示 Error[Pe020]: identifier "ZROM_DATA" is undefined G:\IAR Proj\YaWaJi\main.c 23 请问:怎么解决?

相关推荐阅读
用户1694343 2012-01-05 14:03
单色LCD点阵字模提取工具
单色LCD点阵字模提取工具...
用户1694343 2011-06-05 08:42
点阵汉字库生成器
  本程序是本人第一个用Microsoft C#开的第一个软件。希望能为做嵌入式的朋友带来方便。 支持以下点阵:  12点阵  16点阵支持以下取模式方式:  逐行扫描  行列扫描  逐列扫描  列行...
用户1694343 2011-03-16 21:58
图形点阵提取工具
...
用户1694343 2011-01-10 08:31
用DeflateStream和GZipStream压缩数据
System.IO.Compression 命名空间提供两个类:DeflateStream和GZipStream,这两个类都可以实现数据压缩.这两个类采用都采用Deflate算法来进行无损数据压缩,下...
用户1694343 2011-01-08 22:58
获取文件关联的图标
System.Drawing.Icon名字空间提供了一个非常简单的办法获取与文件相关联的图标,调用ExtractAssociatedIcon方法,指定文件路径就能得到一个ICON对象.此方法返回指定文...
用户1694343 2011-01-08 22:58
Outline示例代码
1.三级树Outline1->Lines->Add("Root"); for(int i=0;i<5;i++) {  int m;   m=Outline1->AddChild...
我要评论
2
7
关闭 站长推荐上一条 /2 下一条