课程概述
快速体验裸机开发,安装交叉编译工具链,学习Makefile和链接器脚本,安装ecplise集成开发环境,学习使用J-LINK,GDB,GDB Server等工具,学习程序下载,单步调试,断点,查看寄存器等知识。
第1课-裸机开发快速体验
抛弃原有的在windows下使用ADS/RVDS等集成开发环境进行开发,将开发环境切换到linux系统下,深入学习Makefile,链接器脚本,调试环境搭建等内容。
课程目的
学习裸机开发的流程,熟悉了解裸机开发过程中将要使用的各种工具。
裸机开发流程
- 编写裸机程序
- 调试裸机程序
- 生成2进制映像(编译、链接、格式转换)
- 烧写/运行2进制映像
安装交叉工具链
交叉工具链是一系列工具的合集,不仅仅是交叉编译器,还包括链接器,汇编器,反汇编器等等。
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
tar xvzf arm-linux-gcc-4.3.2.tgz -C /
|
下一步是修改环境变量,将交叉编译器的bin目录加入到系统环境路径下。
修改 /etc/profile,添加下面一行即可:
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
export PATH=$PATH:/usr/local/arm/4.3.2/bin
|
测试方法:
在命令行输入以下命令,查看是否有输入:
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
arm-linux-gcc -v
|
编译裸机程序
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
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。
- 制作SD启动卡,将uboot烧写到SD卡
- 将SD卡插入到开发板,设置开发板从SD卡启动
- 从串口进入uboot模式,模式化NandFlash
- 选取从USB烧写镜像,再选择烧写的部分是uboot
- 插入USB线,设备会提示“Waiting for DNW to transmmit data"
- 打开虚拟机,将DNW设备连接到虚拟机里
- 在linux系统中安装USB下载驱动,执行"insmod dnw_usb.ko"
- 使用dnw往开发板上传输数据执行"./dnw led.bin 50008000"
- 将开发板设置回从NandFlash启动,上电之后裸机程序即会执行
第2课-交叉工具链
交叉工具链是一系列工具的集合,包括预处理器,汇编器,编译器,反汇编器,链接器,转换器,ELF文件工具,调试器等。
编译器
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
arm-linux-gcc -print-search-dirs #查看交叉编译器的头文件和库文件搜索路径
|
链接器
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
arm-linux-ld -Tled.lds -o led.elf led.o
|
链接器生成的文件是elf格式的可执行程序
ELF文件工具
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
arm-linux-readelf -a led.elf #查看elf文件的所有信息,比如CPU架构,大小端,入口地址,段信息等
arm-linux-readelf -d hello #查看文件使用的库
|
反汇编器
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
arm-linux-objdump -D -S hello > hello.dump #将hello进行反汇编
|
使用-g选项进行编译之后的反汇编包含源代码。
文件格式转换器
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
arm-linux-objcopy -O binary led.elf led.bin #提取elf格式中的二进制指令
|
将ELF格式的可执行文件转换成二进制的可执行文件。
第3课-Makefile工程管理
代码块 |
---|
language | none |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
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
|
第4课-链接器脚本
链接脚本用于定义输入文件中的段信息如何时映射到输出文件中,并且控制输出文件的内存布局。
代码块 |
---|
language | c++ |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
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段,在链接脚本中需要指定这些段的信息。
第5课-Ecplise集成开发环境
用于编译、在线调试程序。用于编译、*在线调试*程序。
准备工作
- 从SD卡启动,格式化NandFlash
- 连接串口,Jlink口,设置从NandFlash启动
安装GDB Server
解压arm-linux-gdb-7.5.tar.gz,执行build-all,其内容为:
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
#/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,添加一行:
代码块 |
---|
language | bash |
---|
theme | Confluence |
---|
linenumbers | true |
---|
collapse | false |
---|
|
export PATH=$PATH:/opt/arm-linux-gdb/bin
|
安装Jlink软件
解压 JLink_Linux_V434a.tgz,进入目录之后先将相关库文件复制到/usr/lib,然后将 45-jlink.rules拷贝到/etc/udev/rules.d。
下面进行测试看Jlink是否能够被虚拟机linux系统识别,确认连接正确,开发板从NandFlash启动。然后将JLink连接至虚拟机中,执行./JLinkGDBServer,如果连接正确,则会提示查找到JLink设备。
安装与配置Eclipse
- 先将/usr/bin目录下系统自带的eclplise重命名,然后解压ARM-Tools下的ecplise并打开。打开Help->Install New Software,输入http://opensource.zylin.com/zylincdt,查找相关软件并安装。
- 通过已经有代码在ecplise中建立工程,选择 File->New->Makefile Project with Existing Code,选择代码所在的文件夹。
- 不勾选Project->Build Automatically
- 编译工程,点击Project->Build All,ecplise会调用已有的Makefile编译工程。
- 选择Debug Configuration,双击Zylin Embedded debug(Native),新建一个调试的配置文件并进行配置,包括要调试的工程,调试的文件(ELF格式的文件),调试器,初始化命令等,不勾选stop ad startup选项,不停留在main函数处。
- 保证JLinkGDBServer在运行,然后点击调试,就可以看到程序在单步运行,并且可以查看变量和寄存器相关信息。