课程概述

快速体验裸机开发,安装交叉编译工具链,学习Makefile和链接器脚本,安装ecplise集成开发环境,学习使用J-LINK,GDB,GDB Server等工具,学习程序下载,单步调试,断点,查看寄存器等知识。

第1课-裸机开发快速体验

抛弃原有的在windows下使用ADS/RVDS等集成开发环境进行开发,将开发环境切换到linux系统下,深入学习Makefile,链接器脚本,调试环境搭建等内容。

课程目的

学习裸机开发的流程,熟悉了解裸机开发过程中将要使用的各种工具。

裸机开发流程

  1. 编写裸机程序
  2. 调试裸机程序
  3. 生成2进制映像(编译、链接、格式转换)
  4. 烧写/运行2进制映像

安装交叉工具链

交叉工具链是一系列工具的合集,不仅仅是交叉编译器,还包括链接器,汇编器,反汇编器等等。

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。

  1. 制作SD启动卡,将uboot烧写到SD卡
  2. 将SD卡插入到开发板,设置开发板从SD卡启动
  3. 从串口进入uboot模式,模式化NandFlash
  4. 选取从USB烧写镜像,再选择烧写的部分是uboot
  5. 插入USB线,设备会提示“Waiting for DNW to transmmit data"
  6. 打开虚拟机,将DNW设备连接到虚拟机里
  7. 在linux系统中安装USB下载驱动,执行"insmod dnw_usb.ko"
  8. 使用dnw往开发板上传输数据执行"./dnw led.bin 50008000"
  9. 将开发板设置回从NandFlash启动,上电之后裸机程序即会执行

第2课-交叉工具链

交叉工具链是一系列工具的集合,包括预处理器,汇编器,编译器,反汇编器,链接器,转换器,ELF文件工具,调试器等。

编译器

arm-linux-gcc -print-search-dirs #查看交叉编译器的头文件和库文件搜索路径

链接器

arm-linux-ld -Tled.lds -o led.elf led.o

链接器生成的文件是elf格式的可执行程序

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格式的可执行文件转换成二进制的可执行文件。

第3课-Makefile工程管理

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课-链接器脚本

链接脚本用于定义输入文件中的段信息如何时映射到输出文件中,并且控制输出文件的内存布局。

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集成开发环境

用于编译、在线调试程序。

准备工作

  1. 从SD卡启动,格式化NandFlash
  2. 连接串口,Jlink口,设置从NandFlash启动

安装GDB Server

解压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软件

解压 JLink_Linux_V434a.tgz,进入目录之后先将相关库文件复制到/usr/lib,然后将 45-jlink.rules拷贝到/etc/udev/rules.d。

下面进行测试看Jlink是否能够被虚拟机linux系统识别,确认连接正确,开发板从NandFlash启动。然后将JLink连接至虚拟机中,执行./JLinkGDBServer,如果连接正确,则会提示查找到JLink设备。

安装与配置Eclipse

  1. 先将/usr/bin目录下系统自带的eclplise重命名,然后解压ARM-Tools下的ecplise并打开。打开Help->Install New Software,输入http://opensource.zylin.com/zylincdt,查找相关软件并安装。
  2. 通过已经有代码在ecplise中建立工程,选择 File->New->Makefile Project with Existing Code,选择代码所在的文件夹。
  3. 不勾选Project->Build Automatically
  4. 编译工程,点击Project->Build All,ecplise会调用已有的Makefile编译工程。
  5. 选择Debug Configuration,双击Zylin Embedded debug(Native),新建一个调试的配置文件并进行配置,包括要调试的工程,调试的文件(ELF格式的文件),调试器,初始化命令等,不勾选stop ad startup选项,不停留在main函数处。
  6. 保证JLinkGDBServer在运行,然后点击调试,就可以看到程序在单步运行,并且可以查看变量和寄存器相关信息。

  • 无标签