本帖最后由 satoll 于 2021-4-7 13:57 编辑
ielftool是IAR提供的一个软件工具,可以从构建生成的ELF执行文件生成bin、Hex、S-records等烧写格式文件,还可以对ROM区域的数据生成CRC校验。ielftool还是一个开源的软件,用户可以修改源码,实现额外的功能。 ielftool的执行程序在IAR安装路径下的\arm\bin目录中,我们可以通过下面的命令格式调用ielftool: ielftool [options] inputfile outputfile [options] 其中,inputfile是链接器生成的ELF执行文件,即要进行操作的文件;outputfile是经过处理之后得到的文件,可以是ELF,或者Hex等烧写格式文件;options为所支持的命令选项,如下:
生成bin/hex/S-records烧写格式 用于从ELF执行文件得到用于固件烧写用的bin、Hex等格式的文件。使用--bin命令选项可以生成bin文件,--ihex生成32位地址的Hex格式文件,--srec生成S-records格式文件。从ELF格式生成Hex格式文件示例:
分割成多个bin文件 如果硬件上除了内置Flash之外还有外扩Flash,可以使用--bin-multi来生成多个bin文件,方便进行烧写。否则只是生成一个bin文件的话,有可能会得到一个巨大的文件(bin文件没有地址信息,所以多个Flash之间需要进行数据填充以保证后续地址的准确)。
区域填充 使用--fill命令可以对指定的地址区域进行数据填充,例如需要进行checksum计算或者一些特定场合需要将未使用的flash区域填充确认内容。
我们可以在IAR的Build-Actions中的Post-build输入ielftool命令让IAR在每次构建之后自动执行填充,例如: ielftool --fill 0x00;0x00-0x1FFF --bin --verbose $TARGET_PATH$ $TARGET_BPATH$.bin 其中--fill是填充命令,其后跟要填充的值(0x00),再后面是填充的地址范围(0x00-0x1FFF)。$TARGET_PATH$是主输出文件(.out)的完整路径, $TARGET_DIR$是主输出文件完整路径(不带扩展名)。--bin指定输出bin格式文件。--verbose记录所执行的操作,在build窗口输出。 在工程的Options->Build Actions->Post-build command line中填入上面的命令,在代码构建完成之后,IAR自动调用ielftool工具将.out文件转换成bin文件,在转换时,根据上述命令所指定的地址区域和字节进行填充。
生成Checksum 1、IAR可以在工程的Options中通过图形界面选择一个Flash区域进行CRC校验计算。
但是如果要对多个区域生成CRC校验,或者多个区域生成多个CRC校验,那么就需要使用ielftool来操作了,方法如下。 首先在工程的Options->Link->Extra Options中使用--place_holder命令在Flash中预留两个位置,用于存放生成的checksum。--place_holder的命令格式如下: --place_holder symbol[,size[,section[,alignment]]] symbol:要创建的符号名称; size:要保留的字节数,默认是4字节; section:使用的section名,默认是.text; alignment:section对齐字节,默认是1。 使用--place_holder保留checksum1和checksum2的存储空间: --place_holder __checksum1,2,.checksum1,1 --place_holder __checksum2,2,.checksum2,1 定义checksum1和checksum2的起止地址符号,指示要进行checksum计算的地址区域: --define_symbol __checksum_begin1=0x08000000 --define_symbol __checksum_end1=0x08000140 --define_symbol __checksum_begin2=0x08000150 --define_symbol __checksum_end2=0x0800058F --keep __checksum1 --keep __checksum2 --keep命令用于强制保留定义的符号,指示链接器不要进行优化而将其丢弃。
2、修改链接器脚本文件(*icf)指定.checksum1和.checksum2的存储位置。如果不指定,则由链接器自动安排,要获取checksum的值需要通过链接生成的map文件查找。checksum1和.checksum2的地址,进而进行读取。但最好还是将其存储在指定位置。
3、在工程Options-> Build Actions->Post-build commmand line中输入以下命令: ielftool --fill 0xFF;__checksum_begin1-__checksum_end1 --fill 0xFF;__checksum_begin2-__checksum_end2 --checksum __checksum1:2,crc16,0x0;__checksum_begin1-__checksum_end1 --checksum __checksum2:2,crc16,0x0;__checksum_begin2-__checksum_end2 --verbose "$TARGET_PATH$" "$TARGET_PATH$"
这样就会对指定的两个Flash区域分别生成CRC校验,并保存到Flash的最后。
总结 以上是对ielftool软件工具几个常用的功能介绍,它还有一些实用的功能,用户可以参考IAR的C/C++开发手册中的有关ielftool命令的详细说明。
|