1.1 嵌入式ARM系统开发概述
嵌入式ARM系统开发是指在ARM裸机上进行开发,在ARM上没有“跑”任何操作系统和驱动,全部由自己编程实现,相当于把ARM当做高级单片机来使用。下面介绍嵌入式ARM系统开发的一些基础知识。
1.1.1 ARM系统可执行映像文件格式
ARM系统的可执行映像文件格式主要有ELF(.elf)、AXF(.axf),和BIN(.bin),下面对这三种映像格式文件分别进行介绍。
ELF:Linux操作系统下可执行映像文件格式,在Linux环境下用GCC编译器生成的可执行映像文件格式即为ELF格式,在Linux操作系统下可直接运行。
AXF:ARM的调试文件,由ARM集成开发工具ADS生成,除了包括可执行代码外,还包括其他调试信息,用于ADS调试。
BIN:真正的可执行文件,包括ARM可执行的指令和数据,可以使用相关工具(Objcopy)从ELF文件中生成,写到FLASH或RAM中可直接运行。
ARM中的各种源文件(包括汇编文件、C语言程序及C++程序等)经过ARM编译器编译后生成ELF(Executable and Linking Format)格式的目标文件。这些目标文件和相应的C/C++运行时所用到的库经过ARM连接器处理后,生成ELF格式的映像文件(Image),这种ELF格式的映像文件是一种可执行文件。
BIN文件是真正的可执行文件。AXF文件是ARM的调试文件,除了包含BIN的内容之外,还附加了其他的调试信息。这些调试信息加在可执行的二进制数据的前面,所以把AXF文件写到ARM的指令执行地址(一般是0x0)将不能运行;因为在此地址前几十个字节的数据不是可执行的二进制数据,而是头部的调试信息。而BIN文件正是去掉了调试信息的可以执行的“精华”部分。
可执行映像文件主要分为3个段,即RO段、RW段和ZI段,如下图所示。
· RO段:只读代码段;
· RW段:RW区域放的是已赋值(赋0除外)的全局变量;
· ZI段:ZI区域放的是未赋值的全局变量或初始化为0的全局变量。
1.1.2 ARM开发调试工具
ARM公司为ARM系统的开发提供了图形化的集成开发环境——ADS,目前使用的版本是ADS1.2; ADS提供了项目代码管理、编辑、编译等功能。关于ADS的使用,读者可参考其他相关资料,这里主要介绍一些ARM的调试系统框架及基本原理。
ARM芯片本身提供了在线调试功能,这使得我们可以在线进行实时调试,不需要再像其他单片机那样使用仿真器进行开发调试。ARM CPU提供了JTAG接口,通过JTAT接口我们可以给ARM发送调试命令,实现访问ARM内部的指令寄存器和数据寄存器,暂停程序的执行等调试功能。同时通过JTAG接口,我们可以烧写程序到系统的Nor FLASH或Nand FLASH上。ARM的在线调试功能正是通过JTAG口来实现的,典型的ARM系统调试框图如下图所示。
典型的ARM调试系统主要分为三部分:调试主机、协议转换器(调试代理)、目标机系统(调试目标)。调试主机一般是一台运行调试软件(如ADS)的计算机。调试主机可以发出一些高层的调试命令,如设置断点、访问内存等。
协议转换器(如MULTI-ICE)用来将调试主机发出的高层调试命令转换为底层的ARM JTAG调试命令。
调试目标一般就是指基于ARM内核MCU目标开发板。经过协议转换器进行命令解释,主机上运行的调试软件就可以通过JTAG接口直接和ARM内核对话。通过扫描链,可以把ARM/THUMB指令插入到ARM的指令流水线当中去执行。通过插入特定的ARM指令,我们可以检查、保存或者改变内核和系统的状态。为了支持底层的调试,ARM处理器提供了硬件上的调试扩展。这些调试扩展包括:
· 停止程序的运行;
· 检查和修改ARM920T的内核状态;
· 观察和修改内存;
· 恢复程序的运行。
1.1.3 加载地址和运行地址
由于ARM系统开发的应用程序在运行和没有运行时所在的位置可能不一样,例如,应用程序没有运行时存放在Nand FLASH中,运行时被搬到RAM中执行,所以就引出了加载地址(应用程序的加载)和运行地址(应用程序的运行)的概念。
· 加载地址:映像文件位于存储器(还没有运行,一般在ROM中,也可以在RAM中)时的地址;
· 运行地址:映像文件运行时的地址。
应用程序的加载和运行地址在应用程序链接时通过链接选项指定,如下图所示。
看看ADS开发文档ARM Developer suite 1.2中的ADS_CodeWarriorIDEGuide.pdf怎么说的:
RO Base This text field sets both the load address and execution address of the region containing the RO
section. If you do not enter a value, the value defaults to 0x8000。
从ADS的帮助文档知道,RO Base设置的是加载地址和运行地址,在这里加载地址和运行地址是一致的,通过ADS调试裸机程序时,映像文件首先要加载到目标板的内存中。
ADS链接器预定义如下变量来表示应用程序运行时的地址,ADS的预定义变量和含义分别如下:
· |Image$$RO$$Base| :RO段起始地址;
· |Image$$RO$$Limit| :RO段结束地址加1;
· |Image$$RW$$Base| :RW段起始地址;
· |Image$$RW$$Limit| :RW段结束地址加1;
· |Image$$ZI$$Base| :ZI段起始地址;
· |Image$$ZI$$Limit| :ZI段结束地址加1。