深入理解嵌入式Linux设备驱动程序
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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。