1、交叉工具链概念
在宿主机上进行预处理、编译、汇编、链接等工作,以生成能在目标机上运行的程序的过程成为交叉编译。在宿主机上执行预处理、编译、汇编、链接等工作的一系列工具称为交叉工具链。
a、tar xzf arm-linux-gcc-4.5.1-v6-vfp.tgz.
b、mkdir /usr/local/arm. mv 4.5.1/ /usr/local/arm/ 将交叉工具链移动到/usr/local/arm目录下。
c、为了能在终端直接输入命令而运行交叉编译器,需要将交叉工具链bin/目录的路径添加到环境变量PATH中:
vim /root/.bashrc;加入export PATH=$PATH:/usr/local/arm/4.5.1/usr/bin。使之生效source /root/.bashrc。
除了这种方法,还可以将这句话添加进/etc/profile中,使系统在启动时就在PATH添加交叉编译工具链的路径。要重新启动系统才会生效。
d、测试终端输入arm-,并按tab键,出现很多命令。
比较:
arm-linux-gcc hello.c -o hello_arm
gcc hello.c -o hello_x86
file hello_arm hello_x86分别查看两个文件的属性,两个文件都是32位ELF格式,可执行文件,前者为arm体系架构,后者为intel 80386。
arm- linux-objdump -D -S hello_arm >log将hello_arm反汇编的结果输出到文件log中。常用来帮助分析oops错误。
arm-linux-readelf -d hello_arm >log,将hello_arm反汇编结果中的dynamic section 输出到文件log中,vim log可以看出它使用了动态库libc.so.6。
嵌入式系统构建之工具链的安装,只有安装好工具链之后才能谈嵌入式的开发,这还需要注意的是,对于不同的版本的uboot或者内核,可能需要选择不同版本的交叉工具链,特别是对于一些老的uboot,较新版本的交叉工具链可能无法编译通过,这是因为老的uboot的makefile中可能使用了一些已经不再使用的编译选项。
2、配置编译uboot
a、uboot介绍
uboot是德国DENX小组开发的用于多种嵌入式CPU的bootloader程序,uboot不仅仅支持嵌入式Linux系统的引导,还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOSz嵌入式操作系统。Uboot除了支持PowerPC系列的处理器外,还能支持MIPS,x86,ARM,NIOS,XScale等诸多常用系列的处理器。
目录树:
board:和一些已有开发板有关的文件,每一个开发板都以一个子目录出现在当前目录中。
common:实现uboot命令行下支持的命令,每一条命令都对应一个文件,例如bootm命令对应就是cmd_bootm.c
cpu:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录。
disk:对磁盘的支持。
doc:文档目录。
drivers:uboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。
fs:支持的文件系统,uboot现在支持cramfs,fat,fdos,jffs2和registerfs.
include:uboot使用的头文件,还有各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录下configs目录有与开发板相关的配置头文件。
lib_xxx:与体系结构相关的库文件。
net:与网络协议栈相关的代码,bootp协议,TFTP协议,RARP协议和NFS文件系统的实现。
tools:生成uboot的工具,如mkimage,crc等等
a、tar xvzf uboot_tiny6410.tar.gz。b、make distclean,清理可能的中间文件。c、配置make tiny6410_config。d、编译make ARCH=arm CROSS_COMPILE=arm-linux-。e、最后通过SD卡启动烧写到nandflash。
3、设置自启动
a、设置nandflash 自动启动
setenv bootcmd nand read c0008000 400000 0 \; bootm c0008000
b、设置自动下载内核到内存后启动
setenv bootcmd tftp c0008000 uImage.bin \; bootm c0008000. 在"\;"之前和之后都有一个空格。
nand read addr off size 从nandflash的off地址读size大小的数据到内存地址addr处。
nand write addr off size 将内存addr地址size大小的数据写到nandflash地址off处。
整片擦出nandflash,输入命令:nand erase,擦出前先把nandflash的0地址开始0x80000字节的数据读到内存备份,输入命令:nand read.i 50008000 0 80000,i表示跳过坏块。再查看nandflash的0地址开始的一页数据。
将内存开始的0x50008000开始的0x80000字节数据,写回nandflash的0地址处,使用命令:nand wtite.i 0x50008000 0 0x80000。
nand dump off 将一页的内容打印出来。