快速体验裸机开发,安装交叉编译工具链,学习Makefile和链接器脚本,安装ecplise集成开发环境,学习使用J-LINK,GDB,GDB Server等工具,学习程序下载,单步调试,断点,查看寄存器等知识。
抛弃原有的在windows下使用ADS/RVDS等集成开发环境进行开发,将开发环境切换到linux系统下,深入学习Makefile,链接器脚本,调试环境搭建等内容。
学习裸机开发的流程,熟悉了解裸机开发过程中将要使用的各种工具。
交叉工具链是一系列工具的合集,不仅仅是交叉编译器,还包括链接器,汇编器,反汇编器等等。
tar xvzf arm-linux-gcc-4.3.2.tgz -C / |
下一步是修改环境变量,将交叉编译器的bin目录加入到系统环境路径下。
修改 /etc/profile,添加下面一行即可:
export PATH=$PATH:/usr/local/arm/4.3.2/bin |
测试方法:
在命令行输入以下命令,查看是否有输入:
arm-linux-gcc -v |
arm-linux-gcc -g -c led.S #交叉编译生成目标文件 arm-linux-ld -Tled.lds -o led.elf led.o #链接器生成elf格式的执行文件,需要提供链接脚本led.lds arm-linux-objcopy -O binary led.elf led.bin #提取elf格式中的二进制指令 |
在PC机上通过USB线将已经写好的裸机程序烧写到开发板的NandFlash。
交叉工具链是一系列工具的集合,包括预处理器,汇编器,编译器,反汇编器,链接器,转换器,ELF文件工具,调试器等。
arm-linux-gcc -print-search-dirs #查看交叉编译器的头文件和库文件搜索路径 |
arm-linux-ld -Tled.lds -o led.elf led.o |
链接器生成的文件是elf格式的可执行程序
arm-linux-readelf -a led.elf #查看elf文件的所有信息,比如CPU架构,大小端,入口地址,段信息等 arm-linux-readelf -d hello #查看文件使用的库 |
arm-linux-objdump -D -S hello > hello.dump #将hello进行反汇编 |
使用-g选项进行编译之后的反汇编包含源代码。
arm-linux-objcopy -O binary led.elf led.bin #提取elf格式中的二进制指令 |
将ELF格式的可执行文件转换成二进制的可执行文件。
all:led.bin led.bin: led.o arm-linux-ld -Tled.lds -o led.elf led.o arm-linux-objcopy -O binary led.elf led.bin %.o : %.S arm-linux-gcc -g -o $@ $< -c .PHONY: clean clean: rm *.o led.elf led.bin led.dis |
链接脚本用于定义输入文件中的段信息如何时映射到输出文件中,并且控制输出文件的内存布局。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) /*设置入口所在的符号地址*/ SECTIONS { . = 0x50008000; /*指定执行文件的起始装载地址是0x50008000*/ . = ALIGN(4); /*下面的地址按4字节对齐*/ .text : /*指定代码段由哪些组成*/ { led.o (.text) /*设置代码段的首文件*/ *(.text) } . = ALIGN(4); .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); __bss_start = .; /*使用变量__bss_start记录bss段的起始地址值*/ .bss (NOLOAD) : { *(.bss) . = ALIGN(4); } _end = .; /*使用_end变量记录bss段的结束地址*/ } |
一个可执行程序由段组成,比如数据段,代码段,bss段,在链接脚本中需要指定这些段的信息。
用于编译、在线调试程序。
解压arm-linux-gdb-7.5.tar.gz,执行build-all,其内容为:
#/bin/sh rm -fr gdb-7.5 rm -r /opt/arm-linux-gdb/ tar xvzf gdb-7.5.tar.gz cd gdb-7.5 ./configure --target=arm-linux --prefix=/opt/arm-linux-gdb/ -v #配置gdb server make && make install cd /opt/arm-linux-gdb/ |
安装完成之后的gdb server位于 /opt目录下,需要把相关路径添加到环境变量中,修改/etc/profile,添加一行:
export PATH=$PATH:/opt/arm-linux-gdb/bin |
解压 JLink_Linux_V434a.tgz,进入目录之后先将相关库文件复制到/usr/lib,然后将 45-jlink.rules拷贝到/etc/udev/rules.d。
下面进行测试看Jlink是否能够被虚拟机linux系统识别,确认连接正确,开发板从NandFlash启动。然后将JLink连接至虚拟机中,执行./JLinkGDBServer,如果连接正确,则会提示查找到JLink设备。