01 嵌入式系统开发流程与工具
考频:★★★★(开发阶段 + 工具参数必考)
一、嵌入式系统开发的 4 个阶段
考频:★★★★★(填空题必考)
| 阶段 | 名称 | 主要工作内容 |
|---|---|---|
| 第 1 阶段 | 需求分析与规格说明 | 分析用户需求,确定系统功能、性能指标、约束条件 |
| 第 2 阶段 | 系统设计 | 软硬件划分,确定整体架构,选型 CPU/OS/外设 |
| 第 3 阶段 | 构件设计 | 详细设计各软硬件构件(模块),编写代码 |
| 第 4 阶段 | 系统集成与测试 | 集成所有构件,调试,验证功能和性能 |
[!CAUTION] 高频易错点:第 3 阶段叫"构件设计",不是"模块设计"!
考试填空中如果写"模块设计"会被扣分,正确答案是构件设计。
二、宿主机-目标机交叉开发环境
考频:★★★★(概念和接口常考)
基本概念
嵌入式开发通常采用"宿主机-目标机"的交叉开发模式:
| 名称 | 说明 |
|---|---|
| 宿主机(Host) | 开发用的 PC 电脑(通常是 x86 架构的 Windows/Linux 电脑) |
| 目标机(Target) | 实际运行嵌入式程序的板子(如 ARM 开发板) |
宿主机(PC) 目标机(ARM 开发板)
┌──────────────┐ ┌─────────────────┐
│ 编写代码 │ JTAG/串口 │ 运行程序 │
│ 交叉编译 │ ─────────────→ │ 显示结果 │
│ 调试控制 │ ←───────────── │ 发送调试数据 │
└──────────────┘ └─────────────────┘
裸机调试接口
[!NOTE] 裸机(无操作系统)调试:需要通过 JTAG 接口连接调试仿真器(如 J-Link、ULINK),才能在目标板上进行调试。
填空答案:裸机调试通过 JTAG 接口连接调试仿真器。
JTAG(Joint Test Action Group) 是一种标准调试接口,支持: - 下载程序到目标板 - 设置断点 - 单步执行 - 查看/修改寄存器和内存
三、嵌入式开发工具
考频:★★★★(ADS/RVDS 辨析常考)
主流 ARM 开发工具
| 工具名称 | 全称 | 说明 |
|---|---|---|
| ADS | ARM Developer Suite | ARM 公司官方集成开发环境(IDE),包含编译器、调试器 |
| RVDS | RealView Development Suite | ADS 的升级版,性能更好,是 ADS 的后继产品 |
| GCC | GNU Compiler Collection | 开源编译器,arm-linux-gcc 是其交叉编译版本 |
| GDB | GNU Debugger | 开源调试器,与 GCC 配套使用 |
[!TIP] ADS vs RVDS:RVDS 是 ADS 的升级版,两者都是 ARM 官方工具,RVDS 更新、更强大。考题问"ARM 官方 IDE"答 ADS 或 RVDS 均可,但注意区分两者的先后关系。
采用开发工具的主要目的
[!NOTE] 采用嵌入式开发工具的主要目的(选A): - 提高开发质量 - 缩短开发周期 - 降低开发成本
这三点是标准答案,选择题里出现这三点的组合就是正确答案。
四、arm-linux-gcc 交叉编译器详解
考频:★★★★★(填空必考,参数必须记住)
什么是交叉编译?
在 x86 架构的 PC(宿主机)上,编译出能在 ARM 架构目标板上运行的程序,这个过程叫交叉编译。
普通编译:x86 机器上编 → x86 上运行 交叉编译:x86 机器上编 → ARM 上运行
基本使用格式
常用参数(必背!)
| 参数 | 功能 | 考试重点 |
|---|---|---|
-g |
加入调试信息,供 GDB 调试使用 | 必考! |
-o 文件名 |
指定输出文件名 | 常考 |
-c |
只编译,不链接,生成 .o 目标文件 |
|
-O / -O2 |
代码优化(1~3级) | |
-Wall |
显示所有警告信息 | |
-I 路径 |
指定头文件搜索目录 | |
-L 路径 |
指定库文件搜索目录 | |
-l 库名 |
链接指定的库 |
实际使用示例
# 最基本的编译
arm-linux-gcc -o hello hello.c
# 加入调试信息(重点!)
arm-linux-gcc -g -o hello hello.c
# 只编译不链接
arm-linux-gcc -c hello.c # 生成 hello.o
# 完整编译(带调试信息、头文件路径、库)
arm-linux-gcc -g -I ./include -L ./lib -o app main.c -lm
[!WARNING] 填空题高频:
Q:使用 arm-linux-gcc 编译时,需要加入调试信息以便 GDB 调试,应添加什么参数?
A:
-g完整命令:
arm-linux-gcc -g -o output input.c
五、开发环境搭建流程
了解一下典型的嵌入式 Linux 开发环境搭建步骤(综合题背景知识):
1. 在宿主机安装交叉编译工具链
└── 安装 arm-linux-gcc 等工具
2. 编写并交叉编译程序
└── arm-linux-gcc -o app app.c
3. 通过网络/串口/U盘将程序传到目标板
4. 在目标板上运行和调试
└── 裸机调试:JTAG 接口 + 调试仿真器
└── 有OS调试:通过网络 GDB 远程调试
本章小结
开发 4 阶段:需求分析 → 系统设计 → 构件设计 → 系统集成与测试
(第3阶段是"构件设计",不是"模块设计"!)
宿主机-目标机模式:
宿主机(PC) → 交叉编译 → 目标机(ARM板)
裸机调试:JTAG 接口
开发工具:ADS → RVDS(升级版),arm-linux-gcc(交叉编译器)
arm-linux-gcc 关键参数:
-g = 加调试信息(必考!)
-o = 指定输出文件名
-c = 只编译不链接
真题演练
以下是NCRE三级嵌入式真题中与本节相关的典型考题:
1. 开发嵌入式系统时,需要构建一个宿主机-目标机的开发环境。若目标机是裸机,那么为了调试和下载软件需要将调试仿真器连接到目标机的哪一种接口?
- A)SPI接口
- B)以太网接口
- C)JTAG接口
- D)USB接口
答案解析
答:C 由于JTAG调试不占用目标机的资源,因此目标机的初始启动程序调试、硬件接口的调试,一般都采用JTAG。裸机状态的目标机更需要采用JTAG调试方式,因为此时目标机上没有操作系统支持其他调试方式。
2. 在基于ARM微处理器为核心的硬件平台上,开发其Linux环境下的应用程序exp1.c。若需要编译后生成exp1.c对应的汇编程序,应使用的命令是( )。
- A)arm-linux-gcc -S exp1.c
- B)arm-linux-gcc -o exp1 exp1.c
- C)arm-linux-gcc -c exp1.c
- D)arm-linux-gcc -g -o exp1 exp1.c
答案解析
答:A GCC编译器的关键参数:-S 生成汇编语言文件;-c 只编译不链接,生成目标文件(.o);-o 指定输出文件名;-g 加入调试信息。要生成汇编程序应使用 -S 参数。
3. 下面有关嵌入式系统开发过程的描述语句中,不恰当的是( )。
- A)在系统设计阶段应该根据系统需要实现的功能,来综合考虑软硬件功能的划分,确定哪些功能由硬件完成,哪些功能由软件完成
- B)在系统设计阶段不仅需要描述用户的功能需求如何实现,且需要描述非功能需求(如:功耗、成本、尺寸等)如何实现
- C)构件设计阶段,设计者需要设计或选择符合系统结构所需要的具体构件。构件通常是指硬件模块,而不包括软件模块
- D)系统集成与测试阶段,应该每次只对一部分构件或模块所集成的系统进行测试,各部测试完成后,再整体测试
答案解析
答:C 构件设计阶段,设计者需要设计或选择符合系统结构和规格说明中所需要的具体构件,既包括硬件也包括软件模块。C项说"构件通常是指硬件模块,而不包括软件模块"是错误的。
4. 【填空题】嵌入式系统的开发过程按顺序可以分成_分析与规格说明、系统设计、_设计、系统集成与测试等4个阶段,测试的目的是验证模块/系统的功能和性能,以及发现错误。
答案
答:需求;构件 嵌入式系统的开发过程通常分为:需求分析与规格说明、系统设计、构件设计、系统集成与测试等4个阶段。其中构件设计包括软件设计与编程、专用硬件芯片选择及硬件电路设计等具体工作。