• 5.1 交叉开发模式概述

• 交叉开发模式:宿主机(PC机:VMware下的Ubuntu)-目标板(FS3399M4实 验箱:超级终端Xshell)

• GNU软件:

        ① Shell:Shell基本上是一个命令解释器,类似于DOS下的command

        ② glibc:glibc是GNU发布的libc库,即c运行库

        ③ GCC:GCC(GNU Compiler Collection,GNU编译器套件)是由GNU 开发的编程语言编译器

        ④ gdb:UNIX及UNIX-like下的调试工具

        ⑤ vim:vim是一个类似于vi的著名的功能强大、高度可定制的文本编辑器,在vi的基础上改进 和增加了很多特性

        ⑥ Emacs:Emacs是著名的集成开发环境和文本编辑器

• 宿主机与目标板的连接方式:

        ① 串口(Debug_1,Debug_2)

        ② 以太网接口(RJ45)

        ③ USB接口

        ④ JTAG接口(Joint Test Action Group)

• 5.2 宿主机环境

5.2.1 串口终端

– Windows下的超级终端

        超级终端是Windows自带的一个串口调试工具,其使用较为简单, 被广泛使用在串口设备的初级调试上,如Xshell7

– Linux下的minicom

        • minicom是一个串口通信工具,就像Windows下的超级终端。可 用来与串口设备通信,如调试交换机和Modem等。它的Debian软 件包的名称就叫minicom,用apt-get install minicom命令即可下载 安装。如果宿主机是纯Linux环境,则需要使用minicom作为串口 终端。

 

5.2.2 BOOTP

– BOOTP(Bootstrap Protocol,引导程序协议)是一种引导协议,基于 IP/UDP协议,也称自举协议,是DHCP协议的前身。BOOTP用于无盘工作 站的局域网中,可以让无盘工作站从一个中心服务器上获得IP地址。通 过BOOTP协议可以为局域网中的无盘工作站分配动态IP地址,这样就不需 要管理员去为每个用户去设置静态IP地址。

– BOOTP的一般工作流程就是BOOTP客户端(目标板,实验箱)和BOOTP服 务器(宿主机,PC机,Ubuntu)之间的交互,其流程如下:

        ① 由BOOTP启动代码来启动BOOTP客户端,这个时候BOOTP客户端还没有IP地 址。

        ② BOOTP客户端使用广播形式的IP地址255.255.255.255向网络中发出IP地址查 询要求

        ③ 运行BOOTP协议的服务器接收到这个请求,会根据请求中提供的MAC地址 找到BOOTP客户端,并发送一个含有IP地址、服务器IP地址、网关等信息的 回应帧

        ④ BOOTP客户端会根据该回应帧来获得自己的IP地址并通过专用文件服务器 (如TFTP服务器)下载启动镜像文件,模拟成磁盘来完成启动。

5.2.3 TFTP

– TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族 中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不 复杂、开销不大的文件传输服务。

– TFTP是简化了的FTP,TFTP没有用户权限管理的功能

– FTP:File Transfer Protocol,文件传输协议

5.2.4 交叉编译

– 交叉编译:在x86架构的宿主机(PC机,Ubuntu)上编译生成适用于ARM 架构(FS3399M4实验箱)的ELF格式可执行代码

• 交叉编译:aarch64-linux-gnu-gcc hello.c -o hello

• 本地编译:gcc hello.c -o hello_pc

ELF:Executable and Linkable Format可执行与可链接格式 ,是一种用于二进制文件、可 执行文件、目标代码、共享库和核心转储格式文件。

• 5.3 目标板环境

5.3.1 JTAG接口简介

JTAG(Joint Test Action Group,联合测试工作组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都 支持JTAG协议,如DSP、FPGA器件等。标准的JTAG接口是5线:TMS、TCK、 TDI、TDO、nTRST,分别为模式选择、时钟、数据输入、数据输出线、系统复位。

 TCK——测试时钟输入

TDI——测试数据输入,数据通过TDI输入JTAG口

TDO——测试数据输出,数据通过TDO从JTAG口输出

TMS——测试模式选择,TMS用来设置JTAG口处于某种特定的测试模式

NC——未用的管脚

VCC(TRGT)——电源(+5V)

GND——地线

5.3.2 Boot Loader简介

– 嵌入式Linux系统启动后,先执行Bootloader,进行硬件和内存的初始化 工作,然后加载Linux内核和根文件系统映像,完成Linux系统的启动

– Bootloader:引导加载程序,是嵌入式目标板(实验箱)加电后运行的第 一段软件代码;是在操作系统内核运行之前用来初始化硬件设备、建立 内存空间的映射图的小程序。

–常见的Bootloader:

        • u-boot:Universal Boot Loader,是遵循GPL条款的开放源码项目,u-boot的作 用是系统引导

        • vivi:韩国Mizi公司开发的Bootloader引导程序。

• 5.4 交叉编译工具链

5.4.1 交叉编译的构建

• 本地编译:在Ubuntu上,编译生成PC平台运行的程序。

        – gcc hello.c-o hello_

• 交叉编译:在Ubuntu上,编译生成目标机(ARM,实验箱)平台运行的程序。

        – aarch64-linux-gnu-gcc hello.c-o hello

• 交叉编译工具链:是一个由编译器、链接器、解释器组成的集成开发环境。

– 交叉编译工具链是一个由标准库编译器链接器汇编器调 试器组成的集成开发环境。

– ARM平台的交叉编译工具:aarch64-linux-gnu-gcc

制作交叉编译工具链的方法: ① 从头编译 ② 脚本编译 ③ 下载使用

5.4.2 相关工具

– 1、glibc(标准库)

• glibc是GNU发布的libc库,即C运行库(GNU C Library)

• glibc是Linux系统中最底层的API

– 2、gcc(编译器)

• gcc(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器

• gcc编译过程的4个阶段:

        ① 预处理:生成“*.i”文件

        ② 汇编:用as命令,编译源文件,生成汇编文件(“*.s”文件)

        ③ 编译:用cc命令,生成目标文件(“*.o”文件)

        ④ 链接:用ld命令,生成可执行文件

① 预处理(-E):

        • gcc -E -o hello.i hello.c

        • 生成“hello.i”文件

② 汇编(-S):

        • gcc-S -o hello.s hello.i

        • 生成“hello.s”文件(汇编文件,即汇编语言程序)

③ 编译(-c):

        • gcc-c -o hello.o hello.s

        • 生成“hello.o”文件(目标文件)

④ 链接(-o):

        • gcc-o hello-pc hello.o

        • 生成“hello-pc”文件(可执行文件)

– 执行可执行文件:

        • ./hello-pc

                – hello world!

gcc 使用入门教程

• 例1:一个源文件(hello.c)

✓ gcc-g -Wall -o hello-pc hello.c

✓ ./hello-pc

        ✓ hello world!

✓-g:表示在生成的目标文件中带调试信息

✓-Wall:选项-Wall开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。

✓-o:机器码的文件名是通过-o选项指定的。该选项通常作为命令行中的最后一个参数。 如果被省略,输出文件默认为“a.out”

✓ ./:路径./指代当前目录,因此./hello-pc载入并执行当前目录下的可执行文件“hello-pc”。

– 3、binutils(链接器+汇编器)(重要)

• binutils是与gcc配套的工具集,binutils工具集中的部分工具除了 被gcc在后台使用为我们创建程序文件之外,其他则有助于方便开 发和调试

• binutils主要包括:

        ① addr2line:指令地址翻译器,用于得到程序指令地址所对应的函数, 以及函数所在的源文件名和行号

        ② ar:静态库生成器,用于创建和修改档案文件,以及从档案文件中 抽取文件。静态库(.a文件)就是一种档案文件,需要用它生成和 管理。

        ③ as:汇编编译器,用于将汇编代码转换为目标文件

        ④ ld:链接器

        ⑤ nm:符号显示器,用于列出程序文件中的符号及符号在内存中(开始)地 址,符号包含C程序中的函数名和变量名

        ⑥ objdump:信息查看器,能显示程序文件的相关信息和对程序文件进行反汇 编

        ⑦ objcopy:段剪辑器,可以用来从程序文件中拷贝出我们所指定的段;在将 引导加载器烧至闪存中时,有时需要通过从程序中抽取段的方式生成烧写文 件,这时objcopy工具就能派上用场。

        ⑧ ranlib:库索引生成器,用于生成一个档案文件的内容索引以加快对档案 文件的查找速度;将该工具运用于静态库能提高库参与链接的效率

        ⑨ readelf:显示有关 ELF二进制文件的信息,通过readelf-h *.exe进行查看。

• 5.5 本地调试(gdb)

• gdb:GNU Debugger,GNU调试器

• 本地调试:

        – 调试ARM可执行文件(实验箱上运行的可执行文件)

                • 在“串口超级终端Xshell7”上运行:gdb

                • 此时“本地”是指实验箱

        – 调试x86可执行文件(Ubuntu上运行的可执行文件)

                • 在Ubuntu的“终端”上运行:gdb

                • 此时“本地”是指PC机(Ubuntu)

• 1、调试ARM可执行文件:

– 生成带调试信息(-g)的可执行文件,在Ubuntu的“终端”上执行:

        • aarch64-linux-gnu-gcc -g -Wall -o test test_main.c test_sum.c

• 将生成“test”可执行文件

– 将“test”可执行文件上传到实验箱中

– 在Xshell7中运行gdb调试工具:

        • 方法一:gdb test • 方法二:gdb

• 2、调试x86可执行文件:

– 在Ubuntu的“终端”下执行(-g表示包含调试信息):

• gcc-g -Wall -o test-pc test_main.c test_sum.c

• 将生成“test-pc”可执行文件

• 方法一:gdbtest-pc • 方法二:gdb

• 5.6 远程调试(gdb+ gdbserver)

• 远程调试:

        – 用于调试ARM程序,即在Ubuntu(宿主机)上调试运行在实验箱(目标机)上的 程序

        – 在实验箱的“Xshell7超级终端”上运行:gdbserver

        – 在Ubuntu的“终端”上运行:arm-linux-gdb

• 5.7 内核调试(gdb+ kgdb)

• 使用printk函数:调试应用程序时,可以使用printf函数显示有关信息。调试Linux内核时,则是使用printk函数显示 有关信息。

• 使用kgdb内核调试工具:

        – 在目标机(实验箱,Xshell7)上运行kgdb

        – 在宿主机(PC机,Ubuntu)上运行gdb

• 5.8 网络调试

• 如果嵌入式系统(目标机,实验箱)上有网络通信程序, 则需要网络调试工具

• 在传统的网络分析和调试技术中,嗅探器(Sniffer)是最 常见也是最重要的一种技术。

• tcpdump是一款功能强大、截取灵活的开源嗅探器工具。

• 除了tcpdump外,还有arp、ping、route、netstat等网络调 试与诊断工具。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐