lf:executable and linkable format,bin就是binary,elf是一个可执行文件,但是里面的地址需要进行重定向,在基于arm的嵌入式系统中“可能”没有地址重定位的功能,地址必须是事先定位好了的,因此需要从elf文件中生产一个bin文件,这个bin文件中的地址就是固定的了
,不需要再进行重定位,虽说在bin文件中,对一些地址进行了填0,但是毕竟没有重定位的符号,可能回避elf文件小写,而且肯定比用于调试的elf文件小,在用bootloader将bin文件拷贝到内存后,便从某一个地址开始运行,没有地址重定位的说法了。
那么在用trace32仿真器时,要下载一个elf文件,依我看来,并不是把整个的elf文件放入内存,而是只是将可执行区域载入内存,至于放入何处,还需要做elf的解析吧,将代码放到内存恰当的地方,里面的符号就可以帮助计算放在何处的。下面引用了网上的一篇文章:
ARM的三种调试方法:转自http://tech.e800.com.cn/articles/2010/421/1271830980500_1.html
1 嵌入式软件开发流程
参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。
在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有 工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。
对后四种文件的理解很重要,其作用解释如下:
(1) 链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定 位。在SDRAM中调试程序、在FLASH中调试或固化后运行的链接脚本文件应加以区分。(在IDE开发环境中使用扩展名*.ld)
(2)命令脚本文件:在SDRAM中调试程序时起作用。在集成环境与目标连接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特 定的操作,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等。这些操作可以通过执行一组命令序列来完成,保存一组命令序列的文本文件称为命令脚 本文件(在 IDE开发环境中使用扩展名*.cs)。
(3)存储区映像文件:在SDRAM中调试程序时起作用。在软件调试过程中访问非法存储区在部分处理器和目标板上会产生异常,如果异常没有处理,则 会导致软件调试过程无法继续,为了防止以上问题并调整仿真器访问速度以达到最合适的水平,提供这样一种用于描述各个存储区性质的文件叫存储区映像文件(在 IDE开发环境中使用扩展名*.map)。
在程序的调试过程中可以选择使用存储区映像文件*.map和命令脚本文件*. cs配合程序的调试。
(4) 启动文件:它主要是完成一些和硬件相关的初始化的工作,为应用程序做准备。一般,启动代码的第一步是设置中断和异常向量;第二步是完成系统启动所必须的寄 存器配置;第三步设置看门狗及用户设计的部分外围电路;第四步是配置系统所使用的存储区分配地址空间; 第五步是变量初始化;第六步是为处理器的每个工作模式设置栈指针;最后一步是进入高级语言入口函数(Main函数)。
2 中断程序设计
中断调试方面可以采用类似矢量中断动态处理方式,让中断对应的确定地址代码调转到RAM的固定地址处,定义一个函数指针指向该固定地址,就可以随时 通过替换RAM固定地址处的代码,实现动态改变中断处理函数。
具体方法是:
(1)将中断源函数指针定义在RAM中相对的固定地址,建立中断矢量表;
void SetInterrupt (U32 vector, void (*handler)())
{
InterruptHandlers[vector] = handler;
}
void SetInterrupt (U32 vector, void (*handler)())
{
InterruptHandlers[vector] = handler;
}
(2)在程序中,调用具体某中断源的中断处理函数;
如: SetInterrupt(IIC_INT,IICWriteIsr);
/* 声明IIC中断处理函数,其中IIC_INT为 IIC中断源序号,IICWriteIsr为 IIC的写中断处理函数 */
(3) 在0x18处的IRQ或0x1C处的FIQ中断入口函数中,获取中断源、清除中断挂起标志、通过已定义的中断源函数指针进入用户具体某中断处理程序。
void ISR_IrqHandler(void)
{
IntOffSet = (unsigned int)INTOFFSET;
Clear_PendingBit(IntOffSet>>2) ;
(*InterruptHandlers[IntOffSet>>2])();
// 调用具体某中断处理程序
}
void ISR_IrqHandler(void)
{
IntOffSet = (unsigned int)INTOFFSET;
Clear_PendingBit(IntOffSet>>2) ;
(*InterruptHandlers[IntOffSet>>2])();
// 调用具体某中断处理程序
}
采用动态的中断处理方法,在中断源较多的情况下,中断响应时间和程序性能得到优化。另外,在调试方面,此处理方法具有便于跟踪调试的优点,并且根据 需要,可以方便变换中断处理函数。
3 中断调试
软件调试可以在SDRAM中或FLASH中进行。在SDRAM中,读写方便,访问速度快。一般软件调试应在RAM中完成,但当RAM空间小于 FLASH程序空间,程序只能在FLASH运行和调试时,或者用户希望了解程序在FLASH中实际运行情况时,就可以在FLASH中进行程序调试。
进行中断调试时,应注意中断入口位于SDRAM中或FLASH中0x18或0x1c地址,链接脚本文件必须使整个系统的代码正确定位于0x0起始 处,但SDRAM或FLASH对应的链接脚本文件及工程配置注意区别。
(1)程序在SDRAM中运行
在SDRAM中调试,使用SDRAM对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;下载程序(在IDE开发环境 中使用扩展名*.elf);调试。
下载程序前必须启动命令脚本文件完成前述的一些特定的操作,命令脚本文件的启动在连接仿真器时自动进行,其中存储区映射应与程序在SDRAM中运行 时相同,保证整个系统的代码正确定位于0x0起始处。下载程序的起始地址也为0x0,下载成功后便可进行调试工作。
(2)程序在FLASH中运行
在FLASH中调试,使用FLASH对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;程序格式转换(*.elf转 换为*.bin);固化*.bin程序;调试。
连接仿真器后不需要下载程序,存储区映射由本身工程中启动文件运行完成,不需要命令脚本文件。在本环境调试过程中,可以设置两个硬件断点。
分享到:
相关推荐
elf类型的文件转换成bin类型的转换工具,window环境下运行
本资源为一个windows脚本工具,可以将elf文件转为bin文件,其原理是调用objcopy工具,用起来方便,不用记复杂的命令选项
ARM ELF Development Systems Business Unit Engineering Software Group
arm elf文件格式简单分析
armbin2elf:用于32位ARM的bin2elf转换器工具 在找不到现有解决方案后,我沮丧地编写了此工具。 在线上有各种各样的“ bin2elf”脚本,其中包含调用objcopy和ld的魔术序列,但我发现它们完全不够用。 是的,从技术...
把Elf文件转换成BIN文件的工具。ielftool.exe
10.1啦,庆祝祖国60华诞,...这是由ELF文件,解码出BIN数据的源码, 附有演示工程,及相关的ELF文件。 生成BIN格式可以根据自己需要修改, 解都解出来了,要生成什么格式的自己就随便了。呵呵。 sck007 2009.09.29
ARM架构的ELF文件标准,对于研究和开发LINKER程序很有帮助。
A4 ARM ELF File Format.pdf,arm的重要文件格式
linux和arm开发板编译环境建立,只要在linux上安装这个文件即可
Linux 可执行文件ELF格式详细分析,ARM平台/x86平台,9份资料
将.elf文件格式转成.bin文件格式的
arm-linux-gcc和arm-elf-gcc 是嵌入式交叉编译工具最常用的,但是他们之间又怎样的区别呢?
下载arm-elf-tools-20040427.tar.gz包,解压,得到一个usr文件夹,复制该文件夹的内容到根目录下的相应文件夹下,就OK啦,在终端下执行arm-elf-gcc会显示: Reading specs from /usr/local/lib/gcc-lib/arm-elf/...
This specification provides the processor-specific definitions required by ELF [SCO-ELF10] for Arm based systems. The ELF specification is part of the larger System V ABI specification where it forms...
arm-elf-tools !!!!!!!!!!!!!!!
ELF文件格式说明 ARM可执行文件ELF格式说明详解
windowns下交叉编译器arm-elf-gcc。。。。。。。。。。
arm框架上面的elf文件结构,对理解arm框架底下的可执行文件很有帮助