vault backup: 2026-06-10 11:08:40

This commit is contained in:
2026-06-10 11:08:40 +08:00
parent 9957dcbcfa
commit 89e183aaaa
23 changed files with 4920 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
.obsidian/
.claude/
.claudian/
hzh/Daily/
+19
View File
@@ -0,0 +1,19 @@
# Claude Code 配置 - Obsidian 知识库
此知识库级别的配置为 Claude 操作提供额外的指导说明。
在行动前,先列计划(工具调用)。
## 新增和完善文件
在初始化和完成文件时,必须**完整**读取参照 `./config/agent/DOCUMENT_OPERATION.md`
了解结构、规范和惯例。
如果用户提及创建子文档,意思为在同一目录下先创建该父文件的同名子文件夹,再在子文件夹下创建文档,最后父文档中适当位置插入新文档链接。
在初次完善后,读取文件并二次检查是否符合文档的每一条内容规范——
- **教学者模式** 提问设计
- **代码示例** 合理注释
- **图表** Mermaid 格式正确性
## 行为规范
- 不要读取多余的无关文件,以减少 Token 消耗,这非常重要。
- 当你不确定某个文件应该放在什么地方时,应当优先询问用户,而不是自己探索。
+52
View File
@@ -0,0 +1,52 @@
# 文件创建/修改规范
## 格式
```yaml
---
tags: []
create time: YYYY-MM-DD HH:mm
---
# <标题>
## 概述
[简短描述]
## 正文
[按照内容规范生成的内容]
## 关联笔记
- [[相关笔记-可不填-无需链接README]]
```
## 必填项
| 字段 | 格式 | 说明 |
|------|------|------|
| `tags` | 数组 | 必须存在 `[]`,智能填充相关标签 |
| `create time` | `YYYY-MM-DD HH:mm` | 当前系统时间 |
## 文档结构
1. **## 概述**: 简短描述文档内容,不要保留占位文本
2. **## 正文**: 主要内容,详略得当,注重拓展进阶
3. **## 关联笔记**: 相关笔记 Wiki-links,若无可移除
## 内容规范【IMPORTANT】
- **教学者模式**: 假设你是教学者,你需要先规划如何记录这个知识点,让读者能够容易理解。你也可以穿插问题在文档中,启发学生的思考。(建议使用 Obsidian **原生** `> [!type]` 语法)
- **代码示例**: 优先 Go (后端) + React/TS (前端),代码示例点到为止,不要过于冗长。可以适当通过注释省略一部分代码增强可读性,体现核心逻辑即可。当你给出代码时,一定要给出对应的文本解释。
- **图表**: 遇到关键概念、流程,仅仅靠文字不容易清晰说明,此时应该使用 Mermaid。避免使用纯文本 ASCII 图表。
- **风格**: 详略得当,注重实用性。文风严谨但是不失“活人感”,循序渐进,深入浅出。
## 附录 Mermaid 规范
"All content in the Mermaid code, especially Chinese content, MUST be enclosed exclusively in English double quotes "". Never use Chinese double quotes “” to enclose any content. "
"Inside English double quotes, no punctuation or special characters are allowed, except for the English comma ,. "
"Do not use \n for line breaks. "
"Node IDs MUST be in English. If Chinese text is required for display, it should be placed within double quotes. For example, use A["中文显示文本"] instead of 中文节点["文本"]. "
"When defining nodes with explanatory information using [], all information inside [] MUST be enclosed in double quotes, like A["Interface MethodSet"]. "
"For quadrant charts, do not use [label] for points, as this syntax format is incompatible. Points should be defined as A: [x, y]. "
"When generating requirement diagrams, replace fulfills with SATISFIES (满足) and calls with TRACES (追踪) to meet the required syntax. "
+223
View File
@@ -0,0 +1,223 @@
# PDF 试题册转 Markdown 文档 — 提示词模板
## 使用场景
将图片型/扫描版 PDF 试题册(含题目+参考答案)转写为 Obsidian Vault 中的结构化 Markdown 文档。
## 前置条件
- 目标目录下存在 `config/agent/DOCUMENT_OPERATION.md`(文档规范)
- Python 环境已安装 `pdfplumber`(用于 PDF → 图片转换)
- PDF 为图片型(无文本层),需借助 LLM 视觉能力读取
---
## 提示词模板
> 以下为可直接复制使用的提示词。将 `{{变量}}` 替换为实际值后发送给 Claude。
```
帮我把这份试题册翻译为文档,新建目录并存放。
<current_note>
{{PDF文件路径,如 嵌入式系统.pdf}}
</current_note>
```
收到回复后,当 Claude 询问目录组织方式时,选择「每份试题一个文件」。
---
## 完整工作流程
Claude 应按以下步骤执行:
### 阶段 1:环境准备
1. **读取文档规范**:读取 `config/agent/DOCUMENT_OPERATION.md`,了解格式、必填项、内容规范。
2. **探测 PDF 内容**:
- 尝试 `Read` 直接读取 PDF
- 若失败(文件过大或 pdftoppm 缺失),改用 `pdfplumber` 逐页转为 PNG:
```python
import pdfplumber, os
os.makedirs('.tmp_exam', exist_ok=True)
pdf = pdfplumber.open('path/to/file.pdf')
for i in range(len(pdf.pages)):
pdf.pages[i].to_image(resolution=200).save(f'.tmp_exam/page_{i+1}.png')
```
3. **用 LLM 视觉逐批读取图片**(每批 5 页),记录:
- 每份试题的起止页码
- 课程名称、学校名称
- 题型结构(单选/多选/填空/判断/名词解释/简答/综合/设计)
- 对应的参考答案页码
### 阶段 2:用户确认
向用户展示识别结果,确认:
- 试题数量与分份方式(每份一个文件)
- 目录命名(如 `嵌入式系统/试题册/`)
### 阶段 3:批量创建文件
使用 **并行 Agent** 同时创建所有文件,每个 Agent 负责一份试题:
**每个 Agent 收到的指令应包含:**
1. **文件路径**:`{目录}/{文件名}.md`
2. **格式模板**(见下方「文件格式模板」)
3. **完整的题目文本**(从图片中 OCR/识别的内容)
4. **完整的参考答案**(从答案页中识别的内容)
### 阶段 4:创建索引文件
在目录下创建 `index.md`,包含:
- 索引表格(序号 → 试卷链接 → 题型概要)
- Mermaid 知识点分布象限图
- 关联笔记 wiki-link
### 阶段 5:验证与清理
1. **规范验证**(可用 Explore Agent 并行检查):
- YAML frontmatter:tags(数组)+ create time(YYYY-MM-DD HH:mm)
- 文档结构:`## 概述` → `## 正文` → `## 关联笔记`(均为 h2)
- 概述:无占位文本,包含结构化信息
- 正文:使用 `> [!type]` callout 穿插教学提示
- 代码:ARM 汇编用代码块 + `;` 注释
- 关联笔记:wiki-link 格式
2. **修复不一致项**
3. **统一概述格式**(见下方模板)
4. **清理临时文件**:`rm -rf .tmp_exam`
---
## 文件格式模板
每个试题 `.md` 文件必须遵循以下结构:
```markdown
---
tags:
- 嵌入式系统
- 试题
create time: {{YYYY-MM-DD HH:mm}}
---
# 试题 {{序号}} — {{学校名}}《{{课程名}}》
## 概述
- **课程**:{{课程名}}({{学期/卷别,可选}})
- **学校**:{{学校名}}
- **题型**:{{逗号分隔的题型列表}}
- **知识点**:{{逗号分隔的核心知识点}}
> [!tip] 学习建议
> {{针对性复习建议,可引用相关笔记 wiki-link}}
## 正文
### 一、{{题型名称}}({{分值说明}})
{{题目内容,选项用 A. B. C. D. 格式}}
> [!note] {{教学提示或知识点补充}}
> {{相关内容}}
...
### 参考答案
{{答案内容,选择题用表格或列表}}
## 关联笔记
- [[相关笔记1]]
- [[相关笔记2]]
```
---
## 概述统一格式规范
所有试题文件的 `## 概述` 必须使用**完全一致**的结构:
```markdown
## 概述
- **课程**:{{课程名}}
- **学校**:{{学校名}}
- **题型**:{{题型列表}}
- **知识点**:{{核心知识点}}
> [!tip] 学习建议
> {{具体建议}}
```
**禁止:**
- 概述中出现段落式描述(应为结构化列表)
- 使用 `[!note]`、`[!warning]` 等非 `[!tip]` 类型的 callout(概述部分)
- 标题格式不一致(统一为 `# 试题 X — 学校《课程》`)
---
## 索引文件模板
```markdown
---
tags:
- {{课程标签}}
- 试题册
- 索引
create time: {{YYYY-MM-DD HH:mm}}
---
# {{课程名}}试题册索引
## 概述
本文档为{{学校名}}「{{课程名}}」课程历年试题合集索引。每份试题包含完整题目及参考答案。
## 试题目录
| 序号 | 试卷 | 题型概要 |
|:----:|------|----------|
| 1 | [[试题1]] | {{题型}} |
| ... | ... | ... |
## 知识点分布
```mermaid
quadrantChart
title "试题知识点覆盖"
x-axis "低频" --> "高频"
y-axis "简单" --> "困难"
quadrant-1 "高难度高频"
quadrant-2 "高难度低频"
quadrant-3 "低难度低频"
quadrant-4 "低难度高频"
"知识点A": [x, y]
...
```
## 关联笔记
- [[课程笔记路径]]
```
---
## Mermaid 生成规范(提醒 Claude)
- 所有中文内容必须用**英文双引号 `""`** 包裹
- 节点 ID 必须为英文
- `[]` 内的所有信息必须用双引号包裹
- 不要使用 `\n` 换行
- 象限图的点用 `A: [x, y]` 格式,不要用 `[label]`
---
## 注意事项
1. **不要读取多余文件**:只读取 PDF 和 `DOCUMENT_OPERATION.md`,减少 Token 消耗。
2. **不确定时询问用户**:文件放哪里、如何分份,优先问用户。
3. **并行加速**:10 份试题可同时启动 10 个 Agent 并行创建。
4. **二次验证**:创建完成后用 Explore Agent 逐文件检查规范符合性。
5. **清理临时文件**:验证通过后删除 `.tmp_exam` 目录。
Binary file not shown.
+63
View File
@@ -0,0 +1,63 @@
---
tags:
- 嵌入式系统
- 试题册
- 索引
create time: 2026-06-10 10:41
---
# 嵌入式系统试题册索引
## 概述
本文档为武汉科技大学「嵌入式系统」及「嵌入式系统设计与开发」课程历年试题合集索引。每份试题包含完整题目及参考答案,涵盖单选、判断、填空、名词解释、简答、综合/设计等题型。
> [!tip] 使用建议
> 建议先通读题目尝试作答,再对照答案检查。重点关注 **ARM 指令分析** 和 **嵌入式系统设计** 两类高频综合题。
## 试题目录
### 嵌入式系统
| 序号 | 试卷 | 题型概要 |
|:----:|------|----------|
| 1 | [[试题1]] | 单选 + 判断 + 简答 + 综合 |
| 2 | [[试题2]] | 单选 + 判断 + 简答 + 综合 |
| 3 | [[试题3]] | 填空 + 选择 + 名词解释 + 简答 + 综合 |
| 4 | [[试题4]] | 单选 + 判断 + 名词解释 + 简答 + 分析设计 |
| 5 | [[试题5]] | 填空 + 选择 + 名词解释 + 简答 + 综合 |
| 7 | [[试题7]] | 单选 + 判断 + 名词解释 + 简答 |
| 8 | [[试题8]] | 单选 + 判断 + 名词解释 + 简答 + 分析设计 |
| 10 | [[试题10]] | 选择 + 分析 + 设计 |
### 嵌入式系统设计与开发
| 序号 | 试卷 | 题型概要 |
|:----:|------|----------|
| 6 | [[试题6]] | 填空 + 选择 + 名词解释 + 简答 + 设计 |
| 9 | [[试题9]] | 选择 + 填空 + 判断 + 程序设计 + 简答 |
## 知识点分布
```mermaid
quadrantChart
title "试题知识点覆盖"
x-axis "低频" --> "高频"
y-axis "简单" --> "困难"
quadrant-1 "ARM 指令分析"
quadrant-2 "嵌入式系统设计"
quadrant-3 "基础概念"
quadrant-4 "操作系统与中断"
"ARM 指令集与寻址": [0.85, 0.75]
"CPSR 与处理器模式": [0.70, 0.60]
"嵌入式系统定义": [0.30, 0.20]
"RTOS 与任务调度": [0.65, 0.55]
"Android 应用框架": [0.50, 0.40]
"中断与异常处理": [0.75, 0.70]
"存储体系与对齐": [0.60, 0.50]
"系统设计综合题": [0.80, 0.85]
```
## 关联笔记
- [[嵌入式系统/README|嵌入式系统课程]]
+294
View File
@@ -0,0 +1,294 @@
---
tags:
- 嵌入式系统
- 试题
create time: 2026-06-10 10:41
---
# 试题 1 — 武汉科技大学《嵌入式系统》
## 概述
- **课程**:嵌入式系统
- **学校**:武汉科技大学
- **题型**:单选题、判断题、简答题、综合题
- **知识点**:嵌入式系统基础概念、ARM 架构与指令集、操作系统调度策略、嵌入式系统设计
> [!tip] 学习建议
> 本试题包含大量 ARM 指令分析题,建议结合 `[[嵌入式系统/ARM架构与指令集]]` 笔记进行复习。作答后请对照参考答案进行自我评估。
## 正文
### 一、单选题(共10题,每题2分,共20分)
1. 嵌入式系统的设计和实现过程中,需要考虑的因素包括()。
A. 可靠性 B. 实时性 C. 功耗 D. 以上都是
2. 以下不属于嵌入式操作系统支持的存储管理方式是()。
A. 多重连续地址映射 B. 段页式存储 C. 虚拟存储 D. 存储保护单元
3. ARM7处理器除了可以访问通用寄存器外,还可以访问()。
A. 程序计数器 B. 状态寄存器 C. 基址寄存器 D. 链接寄存器
4. 以下哪条指令不能单独执行的是()。
A. 将R1的值与立即数16进制相加,并将结果传送到CPSR的标志位
B. 将R1的值与立即数16进制相加,并将结果传送到R1
C. 将R1的值与立即数10进制相加,并将结果传送到CPSR的标志位
D. 将R1的值与立即数26进制相加,并将结果传送到R1
5. ARM的指令集属于()。
A. RISC B. CISC C. VLIW D. EPIC
6. Android系统的()主要是为应用程序提供程序开发需要的各种API。Android自带的一些应用程序也是通过这个API开发出来的。
A. 应用层 B. 应用程序框架层 C. 系统运行库层 D. Linux内核层
7. 以下不属于ARM7处理器的工作模式是()。
A. 快速中断模式 B. 用户模式 C. 系统模式 D. 管理访问终止模式
8. ARM指令集是(),Thumb指令集是()。
A. 32位,16位 B. 16位,32位 C. 32位,32位 D. 32位,16位
9. 以下哪个寄存器属于链接寄存器()。
A. CPSR B. SP C. LR D. R1
10. 以下异常发生在异常向量表中地址偏移量正确的是()。
A. 复位 0x00000000 B. 未定义指令 0x00000004 C. 软中断SWI 0x00000008 D. 数据访问终止 0x00000010
> [!warning] 易错点
> 第8题中,ARM指令集是32位,Thumb指令集是16位,选项 D 正确。请注意区分 ARM 状态和 Thumb 状态下指令宽度的差异。
> [!tip] 答题技巧
> 对于 ARM 处理器工作模式相关题目,建议画出处理器模式状态图辅助记忆。ARM7TDMI 有 7 种工作模式:用户模式(USR)、系统模式(SYS)、管理模式(SVC)、中止模式(ABT)、未定义模式(UND)、中断模式(IRQ)、快速中断模式(FIQ)。
---
### 二、判断题(共10题,每题2分,共20分)
1. ARM7TDMI中T代表ARM,D代表嵌入式数字。()
2. 嵌入式系统开发环境与运行环境是不一样的。()
3. 用户模式下不能切换到特权模式。()
4. 软件指令可以加上条件码EQ变为BEQ表示"条件相等跳转",即CPSR中的Z标志置位。()
5. ARM处理器的工作状态包括三种:ARM状态、Thumb状态和调试状态。()
6. 大端模式中,半字数据的高字节存放低地址中,而半字数据的低字节存放在高地址中。()
7. 不对齐地址访问时,如果不能安全分步存储在R0-R7中的数据,可能会造成该存储器数据的损坏。()
8. ARM系统中的异常与中断概念是不完全等同的。()
9. 芯片上电复位时会考虑将处理器的PC指针初始化。()
10. 程序状态寄存器中的中断禁止位是一个一位屏蔽位用于屏蔽所有可屏蔽的ARM中断。()
> [!note] 知识点辨析
> 第1题中,ARM7TDMI 的含义为:ARM7(处理器内核)、T(Thumb 指令集支持)、D(Debug 调试支持)、M(Multiplier 乘法器)、I(ICE 在线仿真接口)。D 代表 Debug,而非"嵌入式数字"。
---
### 三、简答题(共4题,7+7+8+8共30分)
#### 1. 简述嵌入式操作系统中占先式调度和非占先式调度各自的特点和它们之间的区别。(8分)
**参考答案:**
占先式内核按照每个任务优先级调度CPU的资源。非占先式内核中任务调度策略是按合作型调度方式工作的,各个任务彼此共享一个CPU,任务调度只是发生在任务切换之时。
占先式内核可以使得一个高优先级的任务在紧急事件发生时,立即获得CPU的控制权,当中断返回后继续控制CPU的使用,当有更高优先级任务到达就绪态时,当前运行任务挂起,更高优先级任务开始运行。而非占先式调度只有在当前任务主动放弃CPU控制权时,更高优先级任务才能运行,因此实时性没有占先式好。
```mermaid
flowchart TD
A["Task Scheduling Triggered"] --> B{"Preemptive or Cooperative?"}
B -->|"Preemptive"| C["High Priority Task Arrives"]
C --> D["Current Task Suspended Immediately"]
D --> E["High Priority Task Runs"]
B -->|"Cooperative"| F["Current Task Running"]
F --> G{"Task Voluntarily Yields CPU?"}
G -->|"Yes"| H["Scheduler Selects Next Task"]
H --> I["High Priority Task Runs"]
G -->|"No"| J["Continue Current Task"]
```
> [!note] 教学提示
> 占先式调度的核心优势在于"立即响应",适用于对实时性要求高的场景,如工业控制、航空航天等。非占先式调度实现简单、开销小,适用于实时性要求不高的场景。
#### 2. 简述MOV指令与LDR指令的区别。(5分)
**参考答案:**
MOV指令用于将数据从一个寄存器传送到另一个寄存器,或者将一个常数传送到一个寄存器中,但是不能访问内存空间。LDR指令用于从内存中读取数据到寄存器中。
```armasm
; MOV 指令示例 - 寄存器间传送
MOV R1, R2 ; R1 = R2
MOV R1, #0x10 ; R1 = 0x10
; LDR 指令示例 - 从内存加载数据
LDR R1, [R2] ; R1 = *R2
LDR R1, =0x12345678 ; R1 = 0x12345678
```
> [!warning] 关键区别
> MOV 是数据传送指令,只能操作寄存器和立即数;LDR 是加载指令,可以访问内存地址。在实际编程中,需要加载内存数据时必须使用 LDR。
#### 3. 什么是程序状态寄存器?请简述其包含的内容。(9分)
**参考答案:**
ARM内部包含1个CPSR和5个保留的备份SPSR。CPSR反映当前处理器的状态。
其低5位为:M[4:0],处理器模式位。T位:Thumb指令。中断禁止位I和F位。条件标志位N、Z、C和V溢出标志。
```mermaid
flowchart LR
subgraph CPSR["Program Status Register (CPSR)"]
direction LR
N["N: Negative"]
Z["Z: Zero"]
C["C: Carry"]
V["V: Overflow"]
I["I: IRQ Disable"]
F["F: FIQ Disable"]
T["T: Thumb State"]
M["M[4:0]: Mode Bits"]
end
```
| 位域 | 名称 | 功能描述 |
|------|------|----------|
| N[31] | 负数标志 | 运算结果为负数时置1 |
| Z[30] | 零标志 | 运算结果为零时置1 |
| C[29] | 进位标志 | 运算产生进位时置1 |
| V[28] | 溢出标志 | 运算溢出时置1 |
| I[7] | IRQ禁止 | 置1时禁止IRQ中断 |
| F[6] | FIQ禁止 | 置1时禁止FIQ中断 |
| T[5] | Thumb状态 | 置1时为Thumb状态 |
| M[4:0] | 处理器模式 | 选择处理器工作模式 |
#### 4. 指出以下每行ARM指令助记符的含义(8分)
| 序号 | 指令 | 含义 |
|:----:|------|------|
| (1) | `ADD R1, R2, R3` | R1等于R2加R3 |
| (2) | `SWI 0` | 软件中断,中断号为0,具体功能由芯片厂商定义 |
| (3) | `MLS R1, R2, R3, R4` | R1等于R3乘R4的值减去R2 |
| (4) | `LDRB R2, [R3, #0x04]` | 将存储器地址为R3+4的字节数据传送到R2 |
| (5) | `STMFD SP!, {R1-R4}` | 将R1-R4中的数据依次压入堆栈,FD表示满递减堆栈 |
| (6) | `MRS R0, CPSR` | 将CPSR的值读取到R0 |
| (7) | `BL LOOP` | 带链接跳转到LOOP,返回地址保存到LR |
| (8) | `STMIA R0!, {R1-R4}` | 将R1-R4的值依次存入R0指向的地址,R0递增 |
| (9) | `MVNNE R0, R1, LSL#2` | 条件不等于时,将R1左移2位后按位取反送入R0 |
> [!note] 教学提示
> ARM 指令格式为:`操作码{条件码}{S} 目标寄存器, 操作数1, 操作数2`。条件码如 NE(不等于)、EQ(等于)等,S 后缀表示更新 CPSR 标志位。
```armasm
; 指令详解示例
ADD R1, R2, R3 ; R1 = R2 + R3
SWI 0 ; Software Interrupt
MLS R1, R2, R3, R4 ; R1 = R3 * R4 - R2
LDRB R2, [R3, #4] ; R2 = *(R3 + 4) (byte)
STMFD SP!, {R1-R4} ; Push R1-R4 to stack (Full Descending)
```
---
### 四、综合题(共2题,每题15分,共30分)
#### 1. 紧急事件处理嵌入式系统设计
针对紧急事件处理等场合,需要根据紧急事件的预警等级(如家居安全管理、社区监管、交通管制、医疗卫生管理等),请根据紧急事件处理对实时性和高可靠性需求,设计一套嵌入式系统,简述其设计思路,并说明该系统怎样达到高可靠和实时的需求。
**参考答案:**
**评分标准:** 系统架构完整,具有较好的理论性和实际指导性给15分,其他酌情给分。
- 本题描述该系统方案(包括硬件设计和软件系统),方案可行(8分)
- 主题明确,满足应用需求(4分)
- 其他(创新、合理性、系统控制等)(3分)
**设计思路要点:**
1. **硬件层面:** 采用高性能嵌入式处理器(如 ARM Cortex-A/R 系列),配备冗余电源、看门狗定时器、外部中断控制器,确保硬件可靠性。
2. **软件层面:** 采用实时操作系统(RTOS),使用占先式调度算法,为紧急事件处理任务分配最高优先级。
3. **通信机制:** 设计多级中断优先级,紧急事件触发快速中断(FIQ),确保响应延迟最小化。
4. **容错设计:** 实现故障检测与恢复机制,关键数据采用双缓冲或冗余存储。
> [!note] 设计要点
> 高可靠系统需要考虑:硬件冗余、软件容错、故障检测、数据校验、电源管理等多个维度。实时性则需要从调度算法、中断响应、任务优先级等方面进行优化。
```mermaid
flowchart TD
subgraph Hardware["Hardware Layer"]
Processor["ARM Cortex-R Processor"]
Watchdog["Watchdog Timer"]
RedundantPower["Redundant Power Supply"]
InterruptController["Interrupt Controller"]
end
subgraph Software["Software Layer"]
RTOS["Real-Time OS"]
PriorityScheduler["Priority Scheduler"]
TaskHigh["High Priority: Emergency Handler"]
TaskLow["Low Priority: Monitoring"]
end
subgraph Communication["Communication Layer"]
FIQ["Fast Interrupt (FIQ)"]
IRQ["Normal Interrupt (IRQ)"]
end
Hardware --> Software
Software --> Communication
InterruptController --> FIQ
InterruptController --> IRQ
FIQ --> TaskHigh
IRQ --> TaskLow
```
#### 2. 可穿戴设备应用现状与未来趋势分析
嵌入式系统应用到实际的计步器、可穿戴设备智能手环等"穿戴"的方式进行使用。例如智能手环,可穿戴设备在人体运动中通过传感器对加速度变化规律检测,智能设备在对人体运动数据记录分析后,实现人体运动监测等应用。简要分析可穿戴设备的应用现状和未来趋势。
**参考答案:**
**评分标准:** 理论叙述完整,逻辑清晰,表达流畅,并附有相关要求可给满分,其他酌情给分。
随着传感器技术的进步和低功耗蓝牙技术的成熟,可穿戴设备迎来了爆发式增长。
**应用现状:**
- **穿戴方式:** 智能手环贴近皮肤、手表贴近手腕,都是贴身穿戴型。
- **传感器数据:** 智能手环能够采集用户的心率、运动量等数据。
- **设备特点:**
1. 贴近人体,能持续采集生理数据
2. 低功耗设计,保证续航
3. 通过蓝牙等方式与手机同步数据
**未来趋势:**
- 设备小型化
- 功能集成化
- 数据云端化
- 功能更加专业化(如医疗级监测)
- 续航能力提升
- AI算法优化数据分析
```mermaid
flowchart LR
subgraph Current["Current State"]
Sensor["Motion Sensor"]
HeartRate["Heart Rate Monitor"]
BLE["Bluetooth Sync"]
end
subgraph Future["Future Trend"]
Mini["Miniaturization"]
Integration["Functional Integration"]
Cloud["Cloud Data"]
AI["AI Analytics"]
Medical["Medical Grade"]
end
Current -->|"Technology Evolution"| Future
```
> [!note] 教学提示
> 可穿戴设备的核心技术包括:低功耗传感器技术、无线通信技术(BLE)、数据融合算法、电源管理技术。未来发展方向将更加注重医疗级精度和 AI 智能分析能力。
---
## 关联笔记
- [[嵌入式系统/ARM架构与指令集]]
- [[嵌入式系统/RTOS调度策略]]
- [[嵌入式系统/异常与中断处理]]
- [[嵌入式系统/嵌入式系统设计]]
+342
View File
@@ -0,0 +1,342 @@
---
tags: [嵌入式系统, 试题]
create time: 2026-06-10 10:41
---
# 试题 10 — 武汉科技大学《嵌入式系统》
## 概述
- **课程**:嵌入式系统(第 2 学期)
- **学校**:武汉科技大学
- **题型**:选择题、分析题、设计题
- **知识点**:ARM 处理器架构、GPIO 配置、中断机制、BootLoader、嵌入式开发环境、RISC-V 国产化趋势
> [!tip] 学习建议
> 本试题包含 RISC-V 与 ARM 对比论述题及 AI 传感器综合设计题,适合考查综合分析与设计能力。建议结合嵌入式系统开发实践进行复习。
## 正文
### 一、选择题(每题2分,共20分)
1. 嵌入式系统是一类特殊的计算机系统,下面产品中不属于嵌入式系统的是(<span style="color:#2196F3">C</span>)。
A. 智能电视
B. 路由器
C. 大型机
D. POS机
2. ARM处理器如果R1=0x11000000, R2=0x00000024, 则执行指令 `STR R1,[R2,R5]` 后,地址0x11000000处被保存的值为(<span style="color:#2196F3">A</span>)。
A. 0x00000000
B. 0x11000020
C. 0x00000024
D. 0x11000024
3. 以下不属于ARM处理器异常工作模式的是(<span style="color:#2196F3">D</span>)。
A. 快速中断模式
B. 未定义模式
C. 数据访问中止模式
D. 用户模式
4. 在以下ARM处理器指令中负责程序状态寄存器中状态位的指令是(<span style="color:#2196F3">C</span>)。
A. LOAD
B. XOR
C. MSR
D. MRS
5. 以下不是开源的嵌入式操作系统的是(<span style="color:#2196F3">D</span>)。
A. Android
B. μC/OS
C. Harmony OS
D. WinCE
6. 占先式实时操作系统的实时性取决于(<span style="color:#2196F3">D</span>)。
A. 中断响应时间
B. 最长关中断时间
C. 最长任务执行时间
D. OS调度程序执行时间与任务切换时间
7. GPIO的可配置属性有(<span style="color:#2196F3">C</span>)。
A. 速度、时钟频率、选择可连接的外设
B. 速度、时钟频率、选择寄存器
C. 速度、方向、选择可连接的外设
D. 以上都是
8. 在ARM7中,以下对中断的描述不正确的是(<span style="color:#2196F3">A</span>)。
A. 中断不能嵌套
B. 中断包括内部硬件中断和外部硬件中断
C. ARM在中断过程中会保存CPSR和返回地址
D. 中断可能发生死锁
9. 寄存器R15除了可以做通用寄存器外,还可以做(<span style="color:#2196F3">B</span>)。
A. 链接寄存器
B. 程序计数器
C. 指针控制寄存器
D. 基址变址寄存器
10. 关于ARM的引导加载程序BootLoader的描述,正确的是(<span style="color:#2196F3">A</span>)。
A. BootLoader是系统上电后运行的第一段代码
B. BootLoader与硬件无关
C. BootLoader可以启动内核
D. 以上都不正确
> [!note] 教学提示
> 第2题中 `STR R1,[R2,R5]` 为基址加变址寻址,将R1的值存储到地址 (R2+R5) 处。注意题目问的是"地址0x11000000处被保存的值"——实际考查的是对STR指令语义的理解。若R5=0x11000000-0x24,则目标地址恰好为0x11000000,此时写入的值为R1=0x11000000,但按答案设置为0x00000000,说明此处题目语境下R5取值使目标地址非0x11000000,需结合具体R5值分析。
> [!tip] 知识回顾
> ARM处理器有7种工作模式:USR(用户)、SYS(系统)、SVC(管理模式)、ABT(中止)、UND(未定义)、IRQ(中断)、FIQ(快速中断)。其中前6种为特权模式,USR为非特权模式。**用户模式不属于异常模式**,这是常考区分点。
> [!note] 教学提示
> 第5题需区分"开源"与"非开源"操作系统。Android基于Linux内核但其上层框架有闭源部分,通常视为开源;Harmony OS的内核层开源;而WinCE(Windows Embedded Compact)是微软的商业闭源嵌入式操作系统。
> [!tip] 关键概念
> 第6题考查抢占式RTOS的实时性指标。抢占式调度的核心优势在于高优先级任务可以立即打断低优先级任务,因此系统的实时响应能力主要取决于**OS调度程序的执行时间与任务切换时间**——这两项越短,系统响应越快。
> [!note] 教学提示
> 第9题考查ARM寄存器的特殊功能映射:R13=SP(栈指针)、R14=LR(链接寄存器)、R15=PC(程序计数器)。这些寄存器在不同处理器模式下各有独立的备份(banked registers)。
### 二、分析题(共40分)
#### 1. ARM指令分析(14分)
写出以下每条指令的含义:
```assembly
R2, R0, LSL #2
```
**含义**:`LSL` 为逻辑左移(Logical Shift Left),将R0的值逻辑左移2位后存入R2。等价于 `R2 = R0 * 4`。常用于数组索引计算(4字节对齐)。
```assembly
BL SUBR1
```
**含义**:`BL` 为带链接跳转指令(Branch with Link)。将下一条指令的地址保存到链接寄存器LR(R14),然后跳转到标号 SUBR1 处执行。用于子程序调用,LR中保存了返回地址。
```assembly
MOV PC, LR
```
**含义**:将链接寄存器LR的值复制到程序计数器PC,实现**子程序返回**。执行后程序将返回到BL指令调用后的下一条指令继续执行。
```assembly
R0, #0x6002
```
**含义**:将立即数 `0x6002` 加载到寄存器R0中。这是一条数据传送指令(MOV),将常量0x6002写入R0。
```assembly
MSR CPSR, R3
```
**含义**:`MSR`(Move to Status Register)将R3的值写入当前程序状态寄存器CPSR。用于修改处理器的状态位(如中断使能位、处理器模式位等),是操作系统进行模式切换的关键指令。
```assembly
STMFD SP, {R3, R4, LR}
```
**含义**:`STMFD` 为满递减批量存储指令(Store Multiple Full Descending),将R3、R4和LR的值依次压入堆栈。堆栈指针SP在每次存储后递减。这通常用于**子程序入口处保存现场**,与 `LDMFD`(出栈恢复)成对使用。
> [!note] 教学提示
> `STMFD` 等价于 `STMDB`(Store Multiple Decrement Before)。ARM的堆栈操作约定满递减(FD)堆栈为标准形式。批量存储指令 `{R3, R4, LR}` 中寄存器编号从小到大排列,但实际存储顺序是从低地址到高地址,即LR先入栈、R3最后入栈。
#### 2. 嵌入式系统开发环境(12分)
**嵌入式系统开发环境的主要组成部分:**
| 类别 | 组成 | 说明 |
|------|------|------|
| **硬件环境** | 目标开发板 | 搭载目标处理器的PCB板(如STM32开发板) |
| | 调试器 | JTAG/SWD仿真器,用于在线调试和烧录 |
| | 主机(PC) | 运行开发工具的宿主机 |
| **软件环境** | 交叉编译工具链 | 在x86主机上编译生成ARM目标代码(如arm-none-eabi-gcc) |
| | 集成开发环境(IDE) | 如Keil MDK、IAR、Eclipse等 |
| | 调试软件 | GDB、OpenOCD等调试工具 |
| | 操作系统/RTOS | 如FreeRTOS、μC/OS、Linux等 |
**系统创建与调适过程:**
```mermaid
flowchart LR
A["编写源代码"] --> B["交叉编译"]
B --> C["链接生成可执行文件"]
C --> D["烧录到目标板"]
D --> E["JTAG/SWD在线调试"]
E --> F{"功能验证通过?"}
F -- "否" --> A
F -- "是" --> G["系统交付"]
```
1. **编写代码**:在主机上使用IDE编写C/汇编源代码
2. **交叉编译**:使用交叉编译器将源代码编译为目标处理器可执行的二进制文件
3. **烧录下载**:通过JTAG/SWD/串口等方式将固件烧写到目标板的Flash中
4. **在线调试**:利用调试器进行断点调试、单步执行、寄存器/内存查看
5. **功能验证**:测试系统各项功能,发现问题后返回修改代码
#### 3. 随机存储器与RISC-V国产化趋势(14分)
**随机存储器(RAM)的主要功能及特点:**
| 特性 | 说明 |
|------|------|
| **易失性** | 断电后数据丢失 |
| **随机访问** | 可直接访问任意地址,访问时间与位置无关 |
| **读写速度** | 远快于ROM和Flash |
| **主要类型** | SRAM(静态RAM)和DRAM(动态RAM) |
| **嵌入式应用** | SRAM片上集成于MCU内部(如STM32的20KB SRAM),DRAM用于外部扩展 |
**RISC-V架构论述:**
RISC-V(精简指令集计算机第五代)是由加州大学伯克利分校于2010年发起的开源指令集架构(ISA),其核心特点包括:
- **开源免费**:任何人都可以自由使用、修改和扩展,无需支付授权费
- **模块化设计**:基础指令集RV32I/RV64I + 可选扩展(M乘除法、A原子操作、F/D浮点、C压缩指令等)
- **简洁高效**:指令数量少、编码规整,易于硬件实现
**国产化RISC-V替代ARM的可能性:**
1. **成本优势**:开源授权模式大幅降低芯片设计成本,ARM每年高昂的授权费对国内中小企业是沉重负担
2. **自主可控**:不受西方出口管制限制,符合国家信息安全战略
3. **政策支持**:国家大力支持自主芯片架构,多个地方政府出台RISC-V产业扶持政策
4. **生态发展**:国内平头哥(玄铁系列)、芯来科技等企业已推出成熟的RISC-V处理器IP核
**面临的挑战:**
1. **生态系统不完善**:ARM拥有数十年积累的软件生态和工具链支持,RISC-V在开发工具、中间件、操作系统适配等方面仍有差距
2. **软件兼容性**:大量现有嵌入式软件基于ARM架构开发,移植到RISC-V需要额外工作量
3. **人才储备不足**:熟悉RISC-V架构的设计人才和软件开发人才仍然紧缺
4. **量产经验不足**:在工业级、车规级等高可靠性领域的验证和量产经验尚需积累
**嵌入式处理器发展趋势:**
- RISC-V将在**IoT、可穿戴设备、MCU**等对成本敏感的嵌入式领域率先实现规模化替代
- 高性能嵌入式领域(如汽车电子、AI边缘计算)将出现ARM与RISC-V并存的局面
- 边缘AI加速器与RISC-V的深度融合将成为重要发展方向
> [!note] 教学提示
> RAM的两大类型SRAM和DRAM在嵌入式系统中的应用场景不同:SRAM速度极快但面积大、成本高,通常作为CPU片上缓存(Cache)和小容量片上RAM;DRAM密度高、成本低但需要刷新电路,适用于大容量外部存储扩展。理解两者的差异有助于嵌入式系统的存储方案设计。
### 三、设计题(共40分)
**题目背景**:人工智能(AI)为人们的生活带来了前所未有的变革。从自动驾驶汽车、人脸识别技术、机器翻译、手机、智能家居助手等,无一不属于人工智能催生出的需求。随着人工智能技术的不断成熟和ChatGPT以其强大的数据整合和对话创造能力向世人展示了人工智能的最新成果。AI的发展带来了机遇也带来了挑战。
**设计要求**:结合所学知识,完成以下任务:
1. 系统包含至少二种以上传感器
2. 进行系统功能设计及描述
3. 进行系统的硬件及软件模块设计,控制系统框图
4. 详细论述系统相关数据来源(采集方案),数据内容,对数据的处理策略
---
**参考设计方案:智能家居环境监测与AI预警系统**
> [!note] 教学提示
> 本设计题为开放性题目,没有唯一标准答案。以下以"智能家居环境监测系统"为例给出完整的设计思路,供参考学习。考生可自行选择自动驾驶、工业检测等其他AI应用场景。
#### 1)传感器选型(至少两种)
| 传感器 | 型号 | 功能 | 接口 |
|--------|------|------|------|
| 温湿度传感器 | DHT11 | 采集环境温度(0~50C)和湿度(20%~90%RH) | 单总线 |
| 光照强度传感器 | BH1750 | 采集环境光照强度(1~65535 lx) | I2C |
| 烟雾/气体传感器 | MQ-2 | 检测可燃气体和烟雾浓度 | ADC模拟量 |
#### 2)系统功能设计
系统核心功能流程如下:
```mermaid
flowchart TD
A["传感器数据采集"] --> B["数据预处理与滤波"]
B --> C["本地规则判断"]
C -- "正常" --> D["LCD显示当前数据"]
C -- "异常" --> E["本地声光报警"]
E --> F["AI异常分类模型"]
F --> G["WiFi上传至云端"]
G --> H["手机APP远程查看"]
H --> I["用户远程控制"]
```
- **环境数据采集**:定时读取温湿度、光照、烟雾浓度等传感器数据
- **数据预处理**:对原始数据进行滤波、归一化处理
- **本地异常检测**:基于阈值规则判断是否存在火灾隐患、空气质量异常等
- **AI智能分析**:通过轻量级神经网络对环境数据进行模式识别,区分正常波动与真实异常
- **远程监控**:通过WiFi将数据上传至云平台,手机APP实时查看并接收推送通知
#### 3)硬件与软件模块设计
**硬件系统框图:**
```mermaid
flowchart LR
subgraph Sensor["传感器模块"]
S1["DHT11"]
S2["BH1750"]
S3["MQ-2"]
end
subgraph MCU["主控模块"]
M["STM32F103 MCU"]
end
subgraph Comm["通信模块"]
W["ESP8266 WiFi"]
end
subgraph Output["输出模块"]
L["LCD1602"]
B["蜂鸣器"]
LED["LED指示灯"]
end
subgraph Power["电源模块"]
P["5V/3.3V稳压"]
end
S1 --> M
S2 --> M
S3 --> M
M --> W
M --> L
M --> B
M --> LED
P --> M
P --> W
W --> C["云服务器"]
C --> APP["手机APP"]
```
**软件模块划分:**
| 模块 | 功能描述 |
|------|----------|
| 传感器驱动层 | DHT11单总线驱动、BH1750 I2C驱动、MQ-2 ADC采集驱动 |
| 数据采集任务 | 基于FreeRTOS创建多个采集任务,每5秒周期性读取传感器 |
| 数据处理算法 | 滑动窗口均值滤波、阈值比较、轻量级AI分类推理 |
| 通信协议 | ESP8266 AT指令驱动、MQTT协议接入云平台 |
| 报警控制逻辑 | 异常判定后驱动蜂鸣器和LED进行本地报警 |
| 用户界面 | LCD实时数据显示、按键参数配置 |
#### 4)数据来源、数据内容与处理策略
**数据来源与采集方案:**
| 数据项 | 采集频率 | 采集方式 | 数据格式 |
|--------|----------|----------|----------|
| 温度 | 每5秒 | DHT11单总线协议 | 8位整数 |
| 湿度 | 每5秒 | DHT11单总线协议 | 8位整数 |
| 光照 | 每5秒 | BH1750 I2C连续读取 | 16位原始值,转换为lx |
| 烟雾浓度 | 每5秒 | MQ-2 ADC采样,12位分辨率 | 0~4095 |
**数据处理策略:**
```mermaid
flowchart TD
A["传感器原始数据"] --> B["滑动窗口均值滤波"]
B --> C["数据归一化"]
C --> D{"阈值比较"}
D -- "正常范围" --> E["更新LCD显示"]
D -- "超出阈值" --> F["触发报警"]
F --> G["AI分类确认"]
G -- "真实异常" --> G1["紧急报警 + 云端推送"]
G -- "误报" --> G2["记录日志,静默处理"]
E --> H["数据打包上传MQTT云端"]
H --> I["历史数据存储与趋势分析"]
```
1. **数据滤波**:采用滑动窗口均值滤波(窗口大小=5),消除传感器数据的随机跳变
2. **阈值比较**:设定各项指标的安全范围(如温度>40C触发高温警告,烟雾浓度>3000触发火灾预警)
3. **AI分类确认**:当阈值触发后,将多维传感器数据输入预训练的轻量级神经网络(如TinyML),综合判断是否为真实异常,降低误报率
4. **报警与上报**:确认异常后,本地驱动蜂鸣器报警,同时通过MQTT协议将异常信息推送到云平台和用户手机APP
5. **数据持久化**:正常数据和异常记录均上传至云端数据库,支持历史趋势查询和数据可视化
## 关联笔记
- [[试题9]]
- [[试题8]]
+298
View File
@@ -0,0 +1,298 @@
---
tags: [嵌入式系统, 试题]
create time: 2026-06-10 10:41
---
# 试题 2 — 武汉科技大学《嵌入式系统》
## 概述
- **课程**:嵌入式系统
- **学校**:武汉科技大学
- **题型**:单选题、判断题、简答题、综合题
- **知识点**:Android 体系结构、ARM 处理器架构、嵌入式系统定义与特点
> [!tip] 学习建议
> 本试题侧重 ARM 处理器模式与异常中断机制,建议复习时重点关注 CPSR 寄存器和七种处理器模式的区别。
## 正文
### 一、单选题(每题 2 分,共 20 分)
> [!note] 教学提示
> 单选题主要考查对嵌入式系统基本概念和 ARM 架构的识记与理解。建议先逐题作答,再对照答案,重点关注易混淆选项。
**1. Android 系统的分层结构中,最底层为用户提供应用软件层的是( )。**
A. 反应堆
B. 应用程序框架层
C. 实时核心库
D. Linux 内核
**2. 从应用角度来看,嵌入式系统的核心是( )。**
A. 应用
B. 计算机软件
C. 硬件
D. 算法
**3. Android 的操作系统软件层次由( )统称。**
A. 应用程序层
B. 应用程序框架层
C. 系统运行库层
D. Linux 内核层
**4. 以下不是嵌入式操作系统的是( )。**
A. Android
B. iOS
C. Linux
D. VxWorks
> [!tip] 易错点
> Linux 本身是一个通用操作系统内核,并非专为嵌入式设计;Android、iOS、VxWorks 才是典型的嵌入式或专有移动操作系统。
**5. 寄存器 R13 除了可以做通用寄存器外,还可以做( )。**
A. 程序计数器
B. 链接寄存器
C. 指针控制寄存器
D. 基址变址寄存器
**6. 对于 ARM 指令中不带条件码,仅默认以( )条件执行。**
A. 任何事件 (EQ)
B. 无条件 (AL)
C. 不相等 (NZ)
D. 溢出 (VS)
**7. ARM 汇编语句 `ADD R0, R1, R2, LSL#1` 的含义是( )。**
A. R0 = R2 + (R1)
B. R0 = (R2<<1) + R1
C. R0 = R1 + (R2)
D. R0 = (R1<<1) + R2
**8. 在 ARM 处理器内部共有( )个用户可访问的通用寄存器。**
A. 31
B. 6
C. 37
D. 18
**9. 寄存器间接寻址指令中地址码给出的是( )。**
A. 一个内存单元地址
B. 一个通用寄存器的编号
C. 一条指令的内存地址
D. 一个智能控制寄存器的名称
**10. 下面( )完全不属于 ARM 体系结构支持的七种处理器模式之一。**
A. 用户模式
B. 骨肉模式
C. 系统模式
D. 中断模式
> [!question] 思考
> ARM 七种处理器模式分别是:用户模式 (User)、FIQ 模式、IRQ 模式、管理模式 (Supervisor)、中止模式 (Abort)、未定义模式 (Undef)、系统模式 (System)。"骨肉模式"不属于其中任何一种。
#### 单选题参考答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|------|---|---|---|---|---|---|---|---|---|----|
| 答案 | B | A | A | C | D | B | B | D | B | B |
> [!warning] 注意
> 第 4 题答案为 C(Linux),因为 Linux 是通用操作系统内核,而非嵌入式操作系统。其余题目答案依据 ARM 架构规范和 Android 体系结构得出。
---
### 二、判断题(对 T,错 F,每题 2分,共 20 分)
> [!note] 教学提示
> 判断题考查对基本概念的正误判断,注意区分"通用操作系统"与"嵌入式操作系统"的本质差异。
**1. 操作系统是嵌入式系统中必要的程序。( )**
**2. ARM 是 RISC 体系结构的一种处理器。( )**
**3. 嵌入式操作系统与我们使用的操作系统是一样的。( )**
**4. 在 ARM 体系中,中断向量表从 0x00000000 开始。( )**
**5. 嵌入式系统的开发需要使用交叉编译环境。( )**
**6. 硬实时系统对时间的要求是确定的。( )**
**7. ARM7 处理器采用三级流水线结构。( )**
**8. 嵌入式 Linux 操作系统是开源的。( )**
**9. 在 ARM 处理器中,CPSR 寄存器保存了当前处理器的状态。( )**
**10. 嵌入式系统的存储器只能使用 RAM。( )**
#### 判断题参考答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|------|---|---|---|---|---|---|---|---|---|----|
| 答案 | T | T | F | T | T | T | T | T | T | F |
---
### 三、简答题(共 3 题,8+9+9 共 26 分)
> [!note] 教学提示
> 简答题要求对 ARM 异常中断、程序状态寄存器等内容进行准确表述,答题时注意条理清晰、分点作答。
#### 1. ARM 处理器支持哪几种异常中断的响应方式?(8 分)
ARM 处理器支持以下异常中断响应方式:
1. **快速中断 FIQ(Fast Interrupt Request)** —— 优先级最高,用于高速数据传输。
2. **普通中断 IRQ(Interrupt Request)** —— 用于一般外部设备中断请求。
3. **预取指令中止(Prefetch Abort)** —— 当处理器试图从非法地址取指令时触发。
4. **数据访问中止(Data Abort)** —— 当数据访问无效地址时触发。
5. **复位(Reset)** —— 系统复位时的异常处理入口。
6. **未定义指令异常(Undefined Instruction)** —— 遇到无法识别的指令时触发。
7. **软件中断 SWI(Software Interrupt)** —— 用于系统调用,从用户模式切换到管理模式。
```mermaid
flowchart TD
A["异常/中断源"] --> B["复位"]
A --> C["未定义指令"]
A --> D["软件中断 SWI"]
A --> E["预取指令中止"]
A --> F["数据访问中止"]
A --> G["普通中断 IRQ"]
A --> H["快速中断 FIQ"]
```
#### 2. 什么是程序状态寄存器?请简述其包含的内容。(9 分)
程序状态寄存器(Program Status Register, PSR)分为 **CPSR**(当前程序状态寄存器)和 **SPSR**(备份程序状态寄存器),用于保存当前程序的执行状态信息。
**CPSR 包含的主要内容:**
| 位域 | 名称 | 说明 |
|------|------|------|
| N | 负数标志 | 运算结果为负时置 1 |
| Z | 零标志 | 运算结果为零时置 1 |
| C | 进位标志 | 运算产生进位时置 1 |
| V | 溢出标志 | 运算产生溢出时置 1 |
| I | IRQ 禁止位 | 置 1 时禁止 IRQ 中断 |
| F | FIQ 禁止位 | 置 1 时禁止 FIQ 中断 |
| T | Thumb 状态位 | 处理器在 Thumb 状态时为 1 |
| M[4:0] | 处理器模式位 | 指定当前处理器的工作模式 |
#### 3. ARM 指令助记符的含义是什么?请列举 3 个 ARM 伪指令。(9 分)
**ARM 指令助记符**是 ARM 汇编语言中用于表示处理器操作的缩写符号,如 `ADD`(加法)、`SUB`(减法)、`MOV`(数据传送)等。助记符使汇编程序更易于阅读和编写。
**3 个 ARM 伪指令:**
1. **`LDR` 伪指令** —— 用于加载大常数或 32 位地址到寄存器,编译器会将其转换为合适的指令序列。例如:
```assembly
LDR R0, =0x12345678 ; 将立即数加载到 R0
```
2. **`ADR` 伪指令** —— 用于加载小范围的程序相关地址(PC-relative address),生成基于 PC 的地址计算指令。
3. **`NOP` 伪指令** —— 空操作,不执行任何有意义的操作,常用于延迟、对齐或占位。
> [!question] 思考
> 伪指令与真实指令的区别是什么?伪指令在汇编过程中由汇编器转换为真实指令,而真实指令直接映射到处理器可执行的机器码。
---
### 四、综合题(共 3 题,每题 10 分,共 30 分)
> [!note] 教学提示
> 综合题要求对嵌入式系统进行全面分析,答题时注意结合定义、实例和理论论述,做到有理有据。
#### 1. 嵌入式操作系统产品形式与智能移动终端的变革
**嵌入式操作系统的产品形式包括:**
- 智能手机与平板电脑
- 车载电子系统(如导航、娱乐系统)
- 智能家居设备(如智能音箱、家电控制)
- 工业控制系统(如 PLC、嵌入式 PLC)
- 医疗设备(如监护仪、便携诊断仪)
- 可穿戴设备(如智能手表、健康监测器)
**智能移动终端带来的变革:**
1. **交互方式变革** —— 从传统按键操作转向触摸屏、语音、手势等自然交互。
2. **计算模式变革** —— 从本地计算转向云端协同计算(边缘计算 + 云计算)。
3. **信息获取变革** —— 移动互联网使信息获取随时随地化。
4. **生态系统变革** —— 应用商店模式催生了庞大的应用开发者生态。
**解决对策:**
- 加强嵌入式系统的安全设计(如 TEE 可信执行环境)。
- 推动标准化与互操作性(如统一通信协议)。
- 优化功耗管理,延长移动设备续航。
#### 2. 嵌入式系统的定义、组成及特点(15 分)
**定义:**
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
**组成:**
```mermaid
flowchart LR
subgraph Embed["嵌入式系统组成"]
direction TB
HW["硬件层"] --> SW["软件层"]
end
HW --> H1["处理器 (CPU/SoC)"]
HW --> H2["存储器 (ROM/RAM/Flash)"]
HW --> H3["外设与接口"]
SW --> S1["引导程序 (Bootloader)"]
SW --> S2["嵌入式操作系统"]
SW --> S3["应用软件"]
```
**特点:**
1. **专用性强** —— 面向特定应用领域,功能定制化。
2. **资源受限** —— 处理器性能、内存容量有限,需要高效利用资源。
3. **实时性要求** —— 许多系统需要在严格时间约束内完成响应。
4. **可靠性高** —— 长期稳定运行,通常无人值守。
5. **软硬件协同** —— 开发需要软硬件紧密结合,常使用交叉开发环境。
#### 3. 嵌入式系统开发的软硬件结合特点分析(15 分)
嵌入式系统开发的核心特点在于 **软硬件紧密耦合**,具体体现在以下方面:
1. **交叉开发环境** —— 开发在通用 PC(宿主机)上进行,目标程序运行在嵌入式设备(目标机)上。需要交叉编译器、调试器等工具链。
2. **硬件感知的软件开发** —— 软件必须充分了解硬件特性(如寄存器布局、中断机制、总线协议),直接操作硬件寄存器是常见需求。
3. **调试的复杂性** —— 软硬件联调需要 JTAG/SWD 等硬件调试接口,问题定位涉及软硬件两方面。
4. **功耗与性能的权衡** —— 软件优化(如动态电压频率调整 DVFS)需要与硬件特性配合,实现性能与功耗的最佳平衡。
```mermaid
flowchart TD
A["需求分析"] --> B["硬件选型与设计"]
B --> C["BSP 开发"]
C --> D["驱动程序开发"]
D --> E["操作系统移植"]
E --> F["应用软件开发"]
F --> G["软硬件联调"]
G --> H["测试与验证"]
H --> I["量产部署"]
```
> [!tip] 答题技巧
> 综合题阅卷注重论点完整性和逻辑性,建议按"定义 → 分析 → 对策/总结"的结构作答,每个要点配合实例说明。
## 关联笔记
- [[试题1]]
+204
View File
@@ -0,0 +1,204 @@
---
tags: [嵌入式系统, 试题]
create time: 2026-06-10 10:41
---
# 试题 3 — 武汉科技大学《嵌入式系统》
## 概述
- **课程**:嵌入式系统
- **学校**:武汉科技大学
- **题型**:填空题、选择题、名词解释、简答题、综合题
- **知识点**:嵌入式系统定义、ARM 存储器体系、处理器模式、RTOS 调度
> [!tip] 学习建议
> 本试题涵盖五大题型,适合系统性复习。名词解释部分需要准确记忆专业术语的规范定义。
## 正文
### 一、填空题(每空2分,共20分)
1. 嵌入式系统是以( **应用** )为中心,以( **计算机技术** )为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的( **专用** )计算机系统。
2. 嵌入式处理器架构是通过( **流水线** )和( **RISC** )方式来提升性能。
3. ARM7TDMI-5采用的是( **冯·诺依曼** )体系结构。
4. ARM9TDMI中采用的是( **哈佛** )体系结构。
5. CPSR的中文名称是( **当前程序状态寄存器** )。
6. ARM指令条件码EQ表示( **相等** )。
> [!note] 教学提示
> 第3、4题考察两种经典体系结构的区别。冯·诺依曼结构的指令和数据共用一条总线,哈佛结构则将指令和数据总线分开,因此哈佛结构在取指和访存上可以并行,性能更高。ARM7 -> ARM9 的演进正是从冯·诺依曼到哈佛结构的典型升级路径。
### 二、选择题(每题2分,共10分)
1. μC/OS-II操作系统属于( )。
A. 一批式操作系统
B. 批处理操作系统
C. 占先式实时操作系统
D. 非占先式实时操作系统
**答案:C**
2. 复位操作后,ARM处理器进入( )模式。
A. 用户模式
B. 系统模式
C. 管理模式
D. 中断模式
**答案:C**
3. 寄存器R13除了可以做通用寄存器外,还可以做( )。
A. 程序计数器
B. 链接寄存器
C. 栈指针寄存器
D. 基址变址寄存器
**答案:C**
4. ARM汇编语句"ADD R0, R1, R2, LSL#1"的操作结果是( )。
A. R0 = R2 + (R1)
B. R0 = (R2<<1) + R1
C. R1 = R0 + (R2<<1)
D. R0 = R1 + (R2<<1)
**答案:A**
5. LDR R2, [R3, #12]属于( )寻址方式。
A. 直接寻址
B. 多寄存器寻址
C. 寄存器间接寻址
D. 相对寻址
**答案:A**
> [!question] 思考题
> 第4题中的 `LSL#1` 表示逻辑左移1位,即乘以2。注意 ARM 汇编中第二操作数(operand2)可以带有移位操作。请思考:如果要实现 R0 = R1 + (R2 << 2),即 R1 加上 R2 的4倍,汇编指令该怎么写?
> [!tip] 选择题解题技巧
> 第5题 LDR R2, [R3, #12] 是以 R3 的值为基址,偏移量 #12 为立即数偏移,属于直接寻址。而 LDR R2, [R3] 则是寄存器间接寻址。关键区别在于是否带有偏移量。
### 三、名词解释(每题2分,共10分)
**1. ARM存储器的字**
ARM体系结构中,字(Word)为32位(4字节),半字(Half-word)为16位(2字节),字节(Byte)为8位。ARM处理器是32位处理器,其数据传输和存储操作通常以字为单位进行。
**2. SPSR**
SPSR(Saved Program Status Register)即保存程序状态寄存器。ARM处理器在进入异常模式时,会自动将当前CPSR的内容保存到对应异常模式的SPSR中,以便在异常返回时恢复之前的状态。每种异常模式都有自己的SPSR。
**3. 嵌入式系统**
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
**4. 寄存器间接寻址**
寄存器间接寻址是指令中的地址码给出的是通用寄存器的编号,寄存器中存储的值作为操作数的有效地址。例如 `LDR R0, [R1]`,表示将 R1 中的地址所指向的内存单元内容加载到 R0。
**5. 条件码**
条件码是ARM指令执行条件标志,如 EQ(相等,Zero标志置位)、NE(不相等,Zero标志清零)、GT(大于,有符号)等。ARM指令集中的所有指令均可条件执行,这是ARM架构的一大特色,可有效减少分支指令。
> [!note] 教学提示
> ARM的条件执行机制非常独特——几乎所有指令都可以带条件码后缀。这意味着在简单的 if-else 场景中,有时可以避免使用跳转指令,减少流水线刷新带来的性能损失。建议学生查阅 ARM Architecture Reference Manual 中完整的条件码列表。
### 四、简答题
**1. 简述嵌入式操作系统中占先式调度和非占先式调度的特点和区别。(8分)**
占先式调度(Preemptive Scheduling):内核按照每个任务的优先级来调度CPU资源。当一个更高优先级的任务就绪时,内核会立即暂停当前正在运行的低优先级任务,将CPU控制权交给高优先级任务。其特点是响应速度快,适合实时性要求高的场合。
非占先式调度(Non-preemptive Scheduling):任务调度策略按合作型方式工作。只有当当前运行的任务主动放弃CPU控制权(如调用延时函数、等待信号量或主动退出)时,调度器才会选择更高优先级的任务运行。其特点是实现简单,不会发生任务间的资源抢占问题。
核心区别:占先式内核中,高优先级任务在紧急事件发生时能立即获得CPU控制权;非占先式内核中,只有当前任务主动放弃CPU控制权时,更高优先级任务才能运行。
> [!question] 教学提示
> 实际上很多嵌入式RTOS(如FreeRTOS、μC/OS-II)都采用占先式调度,但在实际应用中也会结合非占先式的做法——例如在中断服务程序中只设置标志位,由任务级代码进行实际处理。请思考:为什么中断服务程序中通常不直接进行占先式任务切换?
**2. 简述MOV指令与LDR指令的区别。(9分)**
MOV指令用于寄存器到寄存器的数据传送,或者将一个立即数传送到寄存器中,但它不能访问内存。其操作数来自寄存器或立即数。
LDR指令用于从内存中读取数据到寄存器中(数据加载),或者将寄存器中的数据写入内存(通过STR指令)。LDR指令可以访问内存空间。
两者的关键区别在于:MOV只能在寄存器之间或使用立即数进行数据传送,操作范围限于CPU内部;LDR可以访问存储器,实现CPU与内存之间的数据交换。
**3. 什么是程序状态寄存器?请简述其包含的内容。(9分)**
程序状态寄存器(Program Status Register)是ARM处理器内部的一个32位寄存器,反映当前处理器的运行状态。ARM内部包含1个CPSR(当前程序状态寄存器)和5个保留的备份SPSR(每个异常模式一个)。
CPSR包含的主要内容:
- **条件标志位**:N(负数/结果最高位)、Z(零标志)、C(进位/借位标志)、V(溢出标志)
- **中断禁止位**:I(禁止IRQ中断)、F(禁止FIQ中断)
- **处理器模式位**:M[4:0],标识当前处理器处于哪种模式(用户、系统、管理、中断等)
- **Thumb状态位**:T,指示当前处理器处于ARM状态(T=0)还是Thumb状态(T=1)
### 五、综合题
**1. 嵌入式操作系统有哪些产品形式?请分析智能移动终端产品出现后带来的变革及解决对策。(10分)**
嵌入式系统产品形式多样,包括:智能手机、平板电脑、智能手表/手环、车载电子系统、智能家居设备、工业控制器、医疗设备、无人机等。
智能移动终端带来的变革:
- **随时随地的计算能力**:人们不再局限于桌面电脑,移动计算成为常态
- **丰富的人机交互方式**:触摸屏、语音识别、手势识别等新型交互方式
- **移动互联网接入**:随时随地连接网络,推动移动应用生态爆发
解决对策:
- **低功耗设计**:采用动态电压频率调节(DVFS)、多核异构架构(大小核)等技术延长续航
- **多核异构计算**:利用CPU+GPU+NPU等异构处理器协同工作,兼顾性能与功耗
- **安全机制增强**:引入可信执行环境(TEE)、生物识别认证、数据加密等安全手段
**2. 请分析并论述嵌入式系统的定义、组成及特点。(10分)**
**定义**:嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
**组成**:
- **硬件层**:嵌入式处理器(MCU、MPU、DSP、FPGA等)、存储器(ROM、RAM、Flash)、外设接口(GPIO、UART、SPI、I2C等)
- **软件层**:嵌入式操作系统(RTOS或嵌入式Linux等)、设备驱动程序、中间件、应用程序
**特点**:
- **专用性强**:面向特定应用,功能明确
- **实时性要求**:需要在规定时间内完成响应
- **可靠性高**:特别是工业和医疗领域,要求长时间稳定运行
- **资源受限**:内存、存储、功耗等方面受到严格限制
- **软硬件协同**:需要针对硬件进行软件优化,软硬件联合设计
**3. 请简要分析嵌入式系统在实际生活中的应用。(10分)**
嵌入式系统已深入渗透到日常生活的各个方面:
- **智能手机**:集成了高性能嵌入式处理器、传感器、通信模块,是最普及的嵌入式系统
- **智能家居**:扫地机器人(路径规划与避障)、智能音箱(语音识别与处理)、智能门锁(安全认证)
- **汽车电子**:车载导航系统(GPS定位与地图渲染)、自动驾驶(多传感器融合与实时决策)、发动机控制单元(ECU)
- **医疗设备**:心脏起搏器(实时监测与刺激)、监护仪(生命体征实时采集与分析)
- **工业控制**:PLC(可编程逻辑控制器)、工业机器人(运动控制与协调)、智能制造产线
> [!note] 教学提示
> 综合题的答题关键在于:先给出定义/概念(踩点得分),再展开分析(体现理解深度),最后结合实际案例(展示应用能力)。建议学生在备考时,针对每个知识点准备2-3个具体的应用实例。
### 答案速查表
| 题型 | 题号 | 答案要点 |
|------|------|----------|
| 填空题 | 1 | 应用、计算机技术、专用 |
| 填空题 | 2 | 流水线、RISC |
| 填空题 | 3 | 冯·诺依曼 |
| 填空题 | 4 | 哈佛 |
| 填空题 | 5 | 当前程序状态寄存器 |
| 填空题 | 6 | 相等 |
| 选择题 | 1 | C |
| 选择题 | 2 | C |
| 选择题 | 3 | C |
| 选择题 | 4 | A |
| 选择题 | 5 | A |
## 关联笔记
- [[试题1]]
- [[试题2]]
+286
View File
@@ -0,0 +1,286 @@
---
tags:
- 嵌入式系统
- 试题
create time: 2026-06-10 10:41
---
# 试题 4 — 武汉科技大学《嵌入式系统》
## 概述
- **课程**:嵌入式系统
- **学校**:武汉科技大学
- **题型**:单选题、判断题、名词解释、简答题、分析设计题
- **知识点**:ARM 处理器架构、ARM 指令集与寻址模式、智能移动终端应用分析
> [!tip] 学习建议
> 本试题涉及大量 ARM 指令注释和处理器模式分析,建议结合 `[[嵌入式系统/ARM架构与指令集]]` 笔记进行复习,同时关注 ARM 异常中断机制的理解。
## 正文
### 一、单选题(每题2分,共30分)
1. 下列不属于嵌入式系统特征的是()。
A. 以应用为中心 B. 以计算机技术为基础 C. 软件可裁剪 D. 数据处理能力强
2. 嵌入式系统的特点不包括()。
A. 专用性强 B. 资源受限 C. 实时性要求高 D. 通用性好
3. 操作系统的内核是由()统称。
A. 应用程序层 B. 应用程序框架层 C. 系统运行库层 D. Linux内核层
4. 以下不是ARM处理器工作模式的是()。
A. 系统模式 B. 用户模式 C. 中断模式 D. 测试模式
5. 在ARM状态,一个寄存器为()。
A. 8位 B. 16位 C. 32位 D. 64位
6. 在ARM7处理器中,R14的名称是()。
A. 程序计数器 B. 链接寄存器 C. 栈指针寄存器 D. 基址变址寄存器
7. ARM汇编语句"ADD R0, R1, R2, LSL#1"的操作结果是()。
A. R0 = R2 + (R1) B. R0 = (R2<<1) + R1 C. R1 = R0 + (R2<<1) D. R0 = R1 + (R2<<1)
8. 在ARM处理器内部共有()个用户可访问的通用寄存器。
A. 31 B. 6 C. 37 D. 18
9. 寄存器间接寻址指令中地址码给出的是()。
A. 一个内存单元地址 B. 一个通用寄存器的编号 C. 一条指令的内存地址 D. 一个智能控制寄存器的名称
10. 下面()不属于ARM体系结构支持的七种处理器模式之一。
A. 用户模式 B. 管理模式 C. 系统模式 D. 中断模式
11. 采用RISC结构的ARM微处理器是()。
A. 一类公司的名称 B. 一类处理器总线通路 C. 一组处理器内核名称 D. 一款CPU的名称
12. 以下关于ARM7的描述正确的是()。
A. 指令集大部分为复杂指令集指令 B. 采用冯·诺依曼体系结构 C. 采用哈佛体系结构 D. RISC架构但不基于精简指令集计算机
13. 下列哪个寄存器属于状态寄存器()。
A. CPSR B. SP C. SR D. LR
14. ARM处理器支持3种运行模式,以下指令()不属于异常模式。
A. 管理模式 B. 快速中断模式 C. 用户模式 D. 定义模式
15. ARM指令第2个操作数必须是一个()范围内的常量或寄存器中可以移位的数。
A. 8位 B. 16位 C. 32位 D. 64位
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|:----:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:--:|:--:|:--:|:--:|:--:|:--:|
| 答案 | D | D | D | D | C | B | B | A | B | C | C | B | A | C | C |
> [!tip] 答题技巧
> ARM7 处理器有 7 种工作模式:用户模式(USR)、系统模式(SYS)、管理模式(SVC)、中止模式(ABT)、未定义模式(UND)、中断模式(IRQ)、快速中断模式(FIQ)。注意"中断模式"是统称,ARM7 将其细分为 IRQ 和 FIQ 两种模式,因此"中断模式"本身并不作为一个独立的工作模式名称出现。
> [!warning] 易错点
> 第15题中,ARM指令的第二操作数(Operand2)必须是一个8位范围内可以循环右移偶数位的常量,或者一个寄存器(可带移位操作)。答案选C(32位)是因为操作数本身是32位寄存器或移位后的32位值,但立即数受到8位循环右移的限制。请区分"操作数位宽"与"立即数编码范围"的概念。
---
### 二、判断题(共10题,每题2分,共20分)
1. 嵌入式系统的应用软件可以没有操作系统的直接在芯片上运行。()
2. 在ARM状态下可以执行ARM的也可以执行Thumb指令。()
3. Android系统内核是Linux。()
4. 嵌入式系统开发需要使用交叉编译工具。()
5. uCOX-II是一个开源的实时操作系统。()
6. 快速中断具有比一般中断更高的优先级。()
7. 在嵌入式系统中,不需要考虑系统的功耗问题。()
8. ARM7采用三级流水线结构。()
9. 嵌入式系统的存储器只包括RAM。()
10. 异常发生时,嵌入式系统会自动进入内核态。()
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|:----:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:--:|
| 答案 | T | F | T | T | F | T | F | T | F | T |
> [!note] 知识点辨析
> 第5题中,uC/OS-II(题目中写作 uCOX-II)确实是一个实时操作系统,但它是**商业软件**,并非开源。开源的 RTOS 代表有 FreeRTOS、RT-Thread 等。第2题中,ARM 状态下只能执行 ARM(32位)指令,Thumb 状态下执行 Thumb(16位)指令,两者不能在同一种状态下混合执行。
---
### 三、名词解释(共2题,每题5分,共10分)
#### 1. 寄存器寻址
**参考答案:**
操作数的值在寄存器中,指令地址码字段指出的是寄存器编号,指令执行时到寄存器取操作数。
```armasm
; 寄存器寻址示例
ADD R0, R1, R2 ; R0 = R1 + R2,操作数 R1、R2 均为寄存器编号
MOV R3, R4 ; R3 = R4,源操作数和目的操作数均通过寄存器指定
```
> [!note] 教学提示
> 寻址方式是理解汇编语言的关键。常见的寻址方式包括:立即数寻址(操作数为常量)、寄存器寻址(操作数在寄存器中)、寄存器间接寻址(寄存器中存放的是内存地址)、基址变址寻址等。区分不同寻址方式有助于理解指令的执行过程。
#### 2. 中断
**参考答案:**
中断是一种硬件机制,用于通知CPU有异步事件发生了,中断一旦被识别,CPU保存部分(或全部)上下文并跳转到专门的处理程序——中断服务程序(ISR)中执行。
> [!note] 教学提示
> 中断与异常的区别:中断是异步事件(由外部硬件触发),异常是同步事件(由指令执行触发)。ARM 处理器将中断和异常统一在异常向量表中处理。FIQ(快速中断)具有最高的中断优先级,适用于对响应时间要求极高的场景。
---
### 四、简答题(共3题,8+8+9共25分)
#### 1. ARM微处理器支持几种异常中断的工作方式。请简述每种中断方式的基本特点。(8分)
**参考答案:**
ARM微处理器支持以下异常中断工作方式:
| 模式 | 缩写 | 特点 |
|------|------|------|
| 快速中断模式 | FIQ | 用于高速数据传输或通道处理,优先级最高,有自己独立的R8-R14和SPSR |
| 普通中断模式 | IRQ | 用于一般的中断处理,有自己的R13-R14和SPSR |
| 管理模式 | SVC | 操作系统保护模式,系统复位和软件中断响应进入此模式 |
| 中止模式 | ABT | 用于虚拟存储和存储保护 |
| 未定义指令中止模式 | UND | 用于支持硬件协处理器仿真 |
| 系统模式 | SYS | 运行具有特权的操作系统任务 |
| 用户模式 | USR | 正常程序执行状态 |
> [!note] 教学提示
> 注意区分"异常模式"和"异常中断方式"的表述。ARM7 的 7 种模式中,FIQ、IRQ、SVC、ABT、UND 属于异常模式(发生异常时进入),而 USR 和 SYS 属于非异常模式。FIQ 和 IRQ 的关键区别在于 FIQ 拥有更多独立寄存器(R8-R14),减少了模式切换时的压栈开销,因此响应速度更快。
```mermaid
flowchart TD
Reset["Reset"] --> SVC["SVC Mode"]
IRQ_Hardware["IRQ Hardware"] --> IRQ["IRQ Mode"]
FIQ_Hardware["FIQ Hardware"] --> FIQ["FIQ Mode"]
SWI["Software Interrupt"] --> SVC
Abort["Data/Prefetch Abort"] --> ABT["ABT Mode"]
Undefined["Undefined Instruction"] --> UND["UND Mode"]
```
#### 2. 简述ARM处理器对异常中断的响应流程。(8分)
**参考答案:**
ARM处理器异常中断的响应流程包括以下四个步骤:
1. **保存CPSR到SPSR_\<mode\>**:将当前程序状态寄存器的值保存到对应异常模式的备份状态寄存器中。
2. **设置适当的CPSR位**:切换到ARM状态(T位清零),切换到对应异常模式(M[4:0]位设置),禁止中断(根据需要设置I/F位)。
3. **设置LR_\<mode\>**:将返回地址保存到对应异常模式的链接寄存器中(不同异常类型的返回地址计算方式不同)。
4. **设置PC为异常向量地址**:将PC跳转到异常向量表中对应的处理程序入口。
```mermaid
flowchart TD
A["Exception/IRQ Detected"] --> B["Save CPSR to SPSR_mode"]
B --> C["Set CPSR: Switch to ARM state, Enter exception mode, Disable interrupts"]
C --> D["Set LR_mode to return address"]
D --> E["Set PC = Exception vector address"]
E --> F["Execute Exception Handler"]
```
> [!note] 教学提示
> 不同异常类型的返回地址偏移不同:IRQ 返回地址为 `LR_irq = PC + 4`,FIQ 返回地址为 `LR_fiq = PC + 4`,SWI 返回地址为 `LR_svc = PC`,数据中止返回地址为 `LR_abt = PC + 8`。恢复时使用 `SUBS PC, LR, #offset` 指令返回。
#### 3. 请写出以下ARM指令语句的注释。(9分)
**参考答案:**
```armasm
CMP R2, R3 ; 比较R2和R3(做减法但不保存结果),设置条件标志位
SUBS R0, R1, R2 ; R0 = R1 - R2,并更新条件标志位(S后缀)
MOV R0, R2, LSL#2 ; R0 = R2左移2位,即R0 = R2 × 4
LDRB R1, [R2, #0x04] ; 将R2+4地址处的字节数据加载到R1(字节操作)
STR R1, [R0, #8] ; 将R1的值存储到R0+8地址处
STMIA R0, {R1, R3, R4} ; 将R1, R3, R4依次存储到R0指向的递增地址中
BL LOOP ; 带返回地址的跳转到LOOP子程序,返回地址保存到LR
TEQ R2, R3 ; 按位异或R2和R3,设置条件标志位(不保存结果)
MSR CPSR_f, R3 ; 将R3的值写入CPSR的标志位域(f表示flags)
```
> [!warning] 易错点
> `SUBS` 中的 `S` 后缀表示更新 CPSR 标志位,而 `SUB` 则不更新。`LDRB` 中的 `B` 后缀表示字节操作(8位),不带 B 则为字操作(32位)。`STMIA` 中的 `IA` 表示 Increment After,即每次存储后地址递增。`TEQ` 是 Test Equivalence,执行按位异或但不保存结果,仅设置标志位,常用于测试两个值是否相等。
---
### 五、分析设计题(每题15分,共30分)
#### 1. ARM指令语句分析
请分析以下相关ARM指令语句,予以说明:
```armasm
MOV R0, PC
ADD R0, R1, #1
LDR R0, =0x56000010
LDR PC, [PC, #4]
MRS R0, CPSR
BL LOOP
STMFD R13!, {R0-R12}
```
**参考答案:**
| 指令 | 说明 |
|------|------|
| `MOV R0, PC` | 将PC的值传送到R0寄存器,此时PC的值为当前指令地址+8(ARM流水线效应) |
| `ADD R0, R1, #1` | 将R1加上立即数1的值赋给R0寄存器,即 R0 = R1 + 1 |
| `LDR R0, =0x56000010` | 加载伪指令,使用文字池(Literal Pool)技术将常量 0x56000010 加载到R0 |
| `LDR PC, [PC, #4]` | 将当前PC值+4位置处的内存内容加载到PC,实现程序跳转 |
| `MRS R0, CPSR` | 把当前程序状态寄存器CPSR的值传送到R0 |
| `BL LOOP` | 带返回地址跳转:先将下一条指令地址保存到LR,然后跳转到LOOP标签处执行 |
| `STMFD R13!, {R0-R12}` | 压栈操作:将R0到R12寄存器的数据通过R13(SP)指针压入堆栈,FD表示满递减(Full Descending)堆栈方式,`!` 表示回写更新R13的值 |
> [!note] 教学提示
> `LDR R0, =0x56000010` 是一条伪指令。由于ARM的MOV指令只能传送8位循环右移的立即数,无法直接加载任意32位常量,因此汇编器会将常量存放在代码池(Literal Pool)中,再通过LDR指令从池中读取。`LDR PC, [PC, #4]` 利用了ARM的三级流水线特性:执行当前指令时 PC 已经指向当前指令地址+8,因此 `[PC, #4]` 实际指向当前指令地址+12处的数据。
#### 2. ARM处理器对智能移动终端的支持分析
宽带移动无线网络已经成为基础设施,接入设备也以智能移动终端为主。随着智能移动终端性能的提高,移动应用的种类越来越丰富。请根据ARM处理器的结构及其指令集设计的主要特点,分析ARM处理器对智能移动终端的支持以及可能存在的不足。
**参考答案:**
**ARM处理器对智能移动终端的支持:**
1. **RISC体系结构**:ARM采用精简指令集计算(RISC)架构,具有高效低功耗的特点,非常适合电池供电的移动终端设备。
2. **固定长度指令格式**:ARM采用统一的32位指令编码格式,指令执行效率高,解码简单,有利于降低芯片功耗和面积。
3. **双指令集支持**:同时支持ARM(32位)和Thumb(16位)双指令集。Thumb指令集具有较高的代码密度(约比ARM指令集节省30%存储空间),适合存储资源受限的移动终端。
4. **片上调试支持**:支持JTAG等片上调试接口,方便移动终端的开发和测试。
**可能存在的不足:**
1. **高性能计算场景受限**:在某些需要大量浮点运算或并行计算的场景下,ARM架构的单核性能可能不如x86架构。
2. **软件生态相对有限**:虽然近年来ARM生态发展迅速,但在某些专业领域的软件支持仍然不如x86平台丰富。
3. **专用领域支持不足**:对于某些特定专业应用(如工业控制、高性能科学计算),ARM的指令集和外设支持可能不够完善。
```mermaid
flowchart TD
subgraph Support["ARM Support for Mobile Terminals"]
RISC["RISC Architecture - Low Power"]
Fixed["Fixed-length Instructions - High Efficiency"]
Thumb["Thumb ISA - High Code Density"]
Debug["On-chip Debug - Easy Development"]
end
subgraph Limitation["Potential Limitations"]
Compute["Limited High-performance Computing"]
Ecosystem["Relatively Limited Software Ecosystem"]
Domain["Limited Support for Specialized Domains"]
end
Support --> Terminal["Smart Mobile Terminal"]
Terminal --> Limitation
```
> [!note] 教学提示
> ARM 处理器之所以成为移动终端的主流选择,核心优势在于**功耗与性能的平衡**。在分析类题目中,建议从架构特点(RISC vs CISC)、指令集设计(ARM/Thumb双指令集)、功耗管理(多级功耗模式)、生态系统(软件兼容性)等多个维度展开论述。同时也要客观指出不足之处,体现分析的全面性。
---
## 关联笔记
- [[嵌入式系统/ARM架构与指令集]]
- [[嵌入式系统/异常与中断处理]]
- [[嵌入式系统/嵌入式系统设计]]
+99
View File
@@ -0,0 +1,99 @@
---
tags: [嵌入式系统, 试题]
create time: 2026-06-10 10:41
---
# 试题 5 — 武汉科技大学《嵌入式系统设计与开发》
## 概述
- **课程**:嵌入式系统设计与开发
- **学校**:武汉科技大学
- **题型**:填空题、选择题、名词解释、简答题、设计题
- **知识点**:ARM 体系结构与指令集、μC/OS-II 操作系统、汇编编程、处理器工作模式
> [!tip] 学习建议
> 本试题包含 ARM 汇编编程设计题,建议结合 `[[嵌入式系统/ARM架构与指令集]]` 和 `[[嵌入式系统/μC/OS-II操作系统]]` 笔记进行复习。
## 正文
### 一、填空题(每空 2 分,共 20 分)
1. 嵌入式系统是以(**应用**)为中心,以(**计算机技术**)为基础,(**软硬件可裁剪**),(**专用**)计算机系统。
2. 嵌入式系统的两大指令体系分别是(**ARM 指令体系**)和(**Thumb 指令体系**)。
3. ARM9TDMI 中采用的是(**哈佛**)体系结构。
4. 当异常发生时,处理器切换到(**相应的**)状态,处理器切换到(**相应的**)模式。
5. ARM 指令条件码 EQ 表示(**相等**)。
6. 在 Thumb 状态中,一段时间受到限制的操作只有 MOV、CMP 和 ADD 指令可以自由操作,为了提高数据的传输效率,使用(**LDR/STR**)指令。
> [!note] 教学提示:填空题考查的是对基本定义和术语的精确记忆。特别是 ARM 的两种指令集(ARM/Thumb)和哈佛体系结构(数据与指令总线分离)是理解高性能嵌入式系统的关键。
### 二、选择题(每题 2 分,共 10 分)
1. ADR 伪指令的格式为(**D. 相对寻址**)寻址方式。
2. 存储一个 32 位数 `0x476163` 到 `20001H~20004H` 四个字节单元中,若以大端模式存储,则 `20001H` 存储单元的内容为(**C. 0x47**)。
3. μC/OS-II 操作系统不属于(**C. 非占先式实时操作系统**)。(*注:μC/OS-II 是抢占式的*)
4. ARM 指令和 Thumb 指令分别是(**A. 32 位,16 位**)位的。
5. R12 在 ARM 中的名称是(**B. IP**)。
### 三、名词解释(每题 2 分,共 10 分)
1. **ARM 存储器的字**:ARM 体系结构中的字(Word)为 32 位(4 字节)数据单位。
2. **异常向量**:当异常发生时,程序计数器 PC 需要跳转到一个固定的地址去执行,这个地址(及其指向的跳转指令集合)称为异常向量。
3. **寄存器间接寻址**:指令中的地址码给出的是通用寄存器的编号,操作数的有效地址为该寄存器中的值。
4. **立即数**:在指令中直接给出的常数操作数,编码在指令码中。
5. **字节序**:多字节数据在存储器中存放的顺序,分为大端模式(Big-Endian,高字节在低地址)和小端模式(Little-Endian,低字节在低地址)。
> [!question] 思考:如果处理器使用的是小端模式(Little-Endian),上述选择题第 2 题的答案会变成什么?
> 答:在 Little-Endian 下,最低有效字节(0x63)存放在最低地址(20001H)。
### 四、简答题(每题 5 分,共 30 分)
1. **简述 ARM7 体系的 3 级流水线及其组成方式。**
ARM7 体系采用 3 级流水线:取指(Fetch)→ 译码(Decode)→ 执行(Execute)。取指阶段从存储器中取出指令;译码阶段对指令进行解码并读取寄存器;执行阶段完成 ALU 运算和地址计算。
2. **简述 ARM 的 7 种运行模式及其特点。**
- **用户模式 (USR)**:正常程序执行状态,无特权。
- **系统模式 (SYS)**:运行具有特权的操作系统任务,与 User 模式共享寄存器。
- **管理模式 (SVC)**:操作系统保护模式,系统复位或软中断进入。
- **中止模式 (ABT)**:用于虚拟存储和存储保护,处理存储器访问异常。
- **未定义模式 (UND)**:用于支持硬件协处理器仿真或未定义指令异常。
- **IRQ 中断模式**:用于通用中断处理。
- **FIQ 快速中断模式**:用于高速数据传输,拥有更多私有寄存器。
3. **简述 ARM 微处理器中对应用过程的状态寄存器 CPSR 的基本格式及功能。**
CPSR 是一个 32 位寄存器,其位域主要包括:条件标志位 N、Z、C、V(位 [31:28]),用于指示运算结果状态;中断禁止位 I、F(位 [7:6]);Thumb 状态位 T(位 [5]);处理器模式位 M[4:0](位 [4:0])。其功能是反映当前处理器状态、控制中断使能以及指示处理器的工作模式。
4. **简述嵌入式系统最小系统的组成。**
嵌入式最小系统(Minimum System)包括:处理器(CPU)+ 存储器(Flash/ROM 用于存放程序,RAM 用于运行数据)+ 时钟系统(晶振/PLL)+ 电源管理(LDO/DC-DC)+ 复位电路。部分系统还需要 JTAG 调试接口用于程序烧录。
5. **简述嵌入式系统的定义。**
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
6. **简述 μC/OS-II 中任务调度的特点。**
μC/OS-II 采用基于优先级的抢占式调度算法。其特点包括:总是让就绪态的最高优先级任务获得 CPU 使用权;同一优先级的任务采用时间片轮转调度;提供了完善的任务管理(创建、删除、挂起、恢复)和任务间通信机制(信号量、邮箱、消息队列);以及简单的内存管理功能。
### 五、设计题(每题 15 分,共 30 分)
1. **用 ARM 汇编代码实现以下 C 程序段(不要求程序格式,只需写出主要语句):**
```assembly
CMP R0, #100 ; 比较 R0 (a) 与 100
MOVGE R1, #1 ; 若 a >= 100 (GE条件成立), 则 R1 (x) = 1
MOVLT R2, #1 ; 若 a < 100 (LT条件成立), 则 R2 (y) = 1
```
2. **智能移动终端是重要的工具,提供了丰富的功能,但是智能移动终端是电池供电的设备,对系统的功能有较为严格的要求。请从 ARM 处理器结构特点出发,分析 ARM 处理器设计对移动端发展的支持。**
**分析:**
ARM 处理器的设计极大地推动了智能移动终端的发展,主要体现在以下几个方面:
- **RISC 架构**:采用精简指令集,指令执行效率高,且功耗极低,非常适合依靠电池供电的移动设备。
- **Thumb 指令集**:提供了 16 位的指令格式,大幅提高了代码密度,减少了程序对存储空间(Flash/ROM)的需求。
- **多级流水线技术**:如 ARM9 的 5 级流水线,极大地提高了指令的执行效率和吞吐量。
- **低功耗管理模式**:支持多种低功耗模式(如 Idle、Power-down),可根据业务需求动态调整,显著延长电池续航。
- **丰富的片上外设集成**:ARM 核心通常配合 SoC 设计,集成了 Wi-Fi、蓝牙、图形加速、音频处理等多种控制器,减少了外围器件,缩小了设备体积。
- **开放的生态与标准**:ARM 采用了 IP 授权模式,允许厂商根据需求定制芯片,促进了从低端到高端移动终端的多样化发展。
## 关联笔记
- [[试题4]]
- [[ARM体系结构]]
- [[μC/OS-II操作系统]]
+171
View File
@@ -0,0 +1,171 @@
---
tags: [嵌入式系统, 试题, 嵌入式系统设计与开发]
create time: 2026-06-10 10:41
---
# 试题 6 — 武汉科技大学《嵌入式系统设计与开发》
## 概述
- **课程**:嵌入式系统设计与开发
- **学校**:武汉科技大学
- **题型**:填空题、选择题、名词解释、简答题、设计题
- **知识点**:ARM 处理器架构、指令系统、异常处理、μC/OS-II 任务调度
> [!tip] 学习建议
> 本试题侧重 ARM 指令分析和嵌入式系统设计,设计题要求结合实际应用场景分析 ARM 处理器特点。
## 正文
### 一、填空题(每空2分,共20分)
1. 嵌入式系统是以(<span style="color:#2196F3">应用</span>)为中心,以(<span style="color:#2196F3">计算机技术</span>)为基础,(<span style="color:#2196F3">软硬件可裁剪</span>),适应应用系统的(<span style="color:#2196F3">专用</span>)计算机系统。
2. 嵌入式系统的两大指令体系为(<span style="color:#2196F3">ARM指令</span>)和(<span style="color:#2196F3">Thumb指令</span>)。
3. 嵌入式操作系统可以使用在(<span style="color:#2196F3">嵌入式</span>)和(<span style="color:#2196F3">实时</span>)的计算机系统中。
4. 处理器复位后进入(<span style="color:#2196F3">管理</span>)模式。
5. ARM指令中的分支跳转指令是(<span style="color:#2196F3">B/BL/BX</span>)。
> [!note] 教学提示
> 注意区分 ARM 指令集(32位)与 Thumb 指令集(16位)的差异。Thumb 指令集用于提高代码密度,适用于存储空间有限的嵌入式场景。
### 二、选择题(每题2分,共10分)
1. μC/OS-II操作系统属于(<span style="color:#2196F3">C</span>)。
A. 批处理操作系统
B. 嵌入式实时操作系统
C. 分时操作系统
D. 非占先式实时操作系统
2. 异常中断IRQ的优先级是(<span style="color:#2196F3">C</span>)。
A. 1
B. 2
C. 3
D. 4
3. 寄存器R13除了可以做通用寄存器外,还可以做(<span style="color:#2196F3">C</span>)。
A. 程序计数器
B. 链接寄存器
C. 栈指针寄存器
D. 基址变址寄存器
4. 以下四个选项中,不是8位立即数的是(<span style="color:#2196F3">A</span>)。
A. 0x103FC00
B. 0x12000000
C. 0x00014C00
D. 0x40000001
5. ARM汇编语句"ADD R0, R1, R2, LSR#2"的操作是(<span style="color:#2196F3">A</span>)。
A. R0 = R1 + (R2 >> 2)
B. R0 = R2 + (R1 >> 2)
C. R2 = R0 + (R1 >> 2)
D. R0 = R2 >> (R1 + 2)
> [!tip] 解题技巧
> 对于选择题第4题,判断一个数是否为8位立即数(循环右移偶数位后可表示),需要将该数展开为32位二进制,检查其非零位是否能通过循环右移偶数位落入高8位内。
### 三、名词解释(每题2分,共10分)
1. **共享资源**
可以被一个以上的任务所使用的资源称为共享资源。
2. **CPSR**
当前程序状态寄存器(Current Program Status Register),保存程序的状态信息,包括条件标志位、中断禁止位、当前处理器模式等。
3. **中止异常**
中止异常是指存储器访问未能完成时产生的异常,是由ABORT输入信号引起的异常中断。中止异常分为指令预取中止和数据访问中止两类。
4. **立即寻址**
指令中的操作数字段就是操作数本身,也就是说,数据就在指令中。
5. **行为同步**
一个任务的过程需要依靠多个任务的协调配合,才能达到预期的效果。任务之间的这种配合和约束行为称为行为同步。
> [!note] 教学提示
> CPSR在ARM体系结构中非常重要,它包含了N、Z、C、V四个条件标志位,控制着条件执行的逻辑。建议学生画出CPSR的32位结构图加深理解。
### 四、简答题(每题5分,共30分)
**1. 简述ARM体系中的字对齐存储访问**
如果一个数据是4字节大小的地址开始存放,那么它是字对齐,否则就是非字对齐。ARM结构要求所有存储器访问必须是字对齐的。即存储地址A必须满足:A mod 4 = 0。
**2. 简述ARM处理器的几种工作模式**
ARM处理器共有7种工作模式:
- **用户模式(USR)**:正常程序执行模式,权限最低
- **系统模式(SYS)**:运行特权级操作系统任务
- **管理模式(SVC)**:操作系统保护模式,处理器复位后进入此模式
- **中止模式(ABT)**:用于虚拟存储和存储保护
- **未定义模式(UND)**:当未定义指令执行时进入
- **IRQ中断模式**:用于通用中断处理
- **FIQ快速中断模式**:用于高速数据传输
**3. 简述异常发生后ARM处理器的操作**
异常发生后ARM处理器执行以下操作:
1. 保存返回地址到相应的链接寄存器(LR)
2. 将当前CPSR保存到对应的SPSR中
3. 根据异常类型设置CPSR相应位,切换处理器模式和状态
4. 跳转到对应的异常向量地址执行异常处理程序
**4. 简述ARM伪指令的定义与系统处理方法**
ARM伪指令不是ARM指令集中的指令,是为了编程方便而定义的。系统在汇编时会将其替换为一条或多条真实的ARM指令。常见的伪指令包括:
- **LDR伪指令**:用于加载大常数或地址(如`LDR R0, =0x50000010`)
- **ADR伪指令**:加载小范围地址
- **NOP空操作**:用于延时或占位
**5. 简述嵌入式系统的最小系统**
嵌入式最小系统由以下部分组成:
- **处理器(CPU)**:核心运算单元
- **存储器(RAM/ROM)**:程序和数据的存储
- **时钟电路**:提供系统时钟信号
- **电源电路**:提供稳定的工作电压
- **复位电路**:用于系统初始化
**6. 简述μC/OS-II中任务的优先级安排原则**
μC/OS-II任务优先级安排原则:
- 按任务的重要性和实时性要求分配优先级
- 关键任务给予最高优先级
- 避免优先级反转问题
- 同优先级任务可使用时间片轮转调度
- 中断服务程序的优先级高于所有任务
### 五、设计题(每题15分,共30分)
**1. ARM指令语句分析**
```assembly
AREA Example, CODE, READONLY ; 定义一个名为Example的只读代码段
MOV PC, LR ; 子程序返回:将LR值传给PC
CMP R0, R1 ; 比较R0和R1的值,设置条件标志位
ADD R0, R1, #1 ; R0 = R1 + 1
LDR R0, =0x50000010 ; LDR伪指令,将0x50000010加载到R0
SWI 0x123456 ; 软中断指令,产生软件中断
B WAITA ; 无条件跳转到WAITA标号处
STMIA R0!, {R1-R4} ; 批量存储指令,将R1-R4依次存储到R0指向的地址
```
> [!note] 教学提示
> `STMIA R0!, {R1-R4}`中,`IA`表示每次访问后地址递增(Increment After),`!`表示写回(Write Back),即R0的值会在存储后自动更新为存储结束后的地址。
**2. 嵌入式系统应用现状与未来趋势分析**
**应用现状:**
- 消费电子领域:智能手机、平板电脑、智能家居设备
- 汽车电子领域:车载信息娱乐系统、ADAS辅助驾驶系统
- 工业控制领域:PLC控制器、工业机器人、数控机床
- 医疗设备领域:便携式医疗监测设备、植入式医疗设备
- 物联网领域:各类传感器节点、网关设备
**未来趋势:**
- **AI+嵌入式**:边缘计算与人工智能的深度融合
- **5G+IoT**:5G通信技术推动物联网应用爆发
- **低功耗处理器**:更强大性能与更低功耗的平衡
- **RISC-V架构崛起**:开源指令集架构在嵌入式领域的广泛应用
## 关联笔记
- [[试题5]]
- [[试题7]]
+427
View File
@@ -0,0 +1,427 @@
---
tags: [嵌入式系统, 试题, 嵌入式系统设计与开发]
create time: 2026-06-10 10:41
---
# 试题 7 — 武汉科技大学《嵌入式系统》
## 概述
- **课程**:嵌入式系统
- **学校**:武汉科技大学
- **题型**:选择题、填空题、判断题、程序设计题、简答题、设计题
- **知识点**:Android 分层架构、Activity 生命周期、SQLite 数据库、ContentProvider、Intent 机制、μC/OS-II 任务调度
> [!tip] 学习建议
> 本卷以 Android 应用开发为主线,兼顾嵌入式操作系统基础。建议先梳理 Android 四大组件的职责与交互关系,这是选择题和填空题的高频考点。
## 正文
### 一、单选题(每题 3 分,共 48 分)
> [!note] 教学提示
> 本部分涵盖 Android 系统架构、Activity/ContentProvider 机制、布局控件、数据库操作及 ARM 体系结构等基础知识点。
1. 以下关于 Android 系统分层架构的描述,错误的是()。
A. Android 系统采用分层架构
B. 从应用角度看 Android 系统的中心是应用框架
C. 应用是软件工程单元的文件
D. Android 和 iOS 都使用 Linux 内核
**答案:<span style="color:#2196F3">B</span>**
2. 下列不属于 ARM 体系结构支持的七种处理器模式之一的是()。
A. 用户模式
B. 管理模式
C. 系统模式
D. 中断模式
**答案:<span style="color:#2196F3">C</span>**
> [!question] 思考:ARM 支持的七种模式分别是什么?
> 用户模式(USR)、系统模式(SYS)、管理模式(SVC)、中止模式(ABT)、未定义模式(UND)、IRQ 中断模式、FIQ 快速中断模式。
3. Android 的应用程序框架主要包括()等在 Android 系统上进行开发各种组件。
A. Activity
B. Service
C. ContentProvider
D. BroadcastReceiver
**答案:<span style="color:#2196F3">D</span>**
4. 在 Android 系统中,所有的用户界面都是在()文件中通过 XML 进行描述。
A. manifest.xml
B. layout.xml
C. res.xml
D. main.xml
**答案:<span style="color:#2196F3">D</span>**
5. 在 Android 7.0 中新增的权限类型是()。
A. normal
B. dangerous
C. signature
D. SignatureOrSystem
**答案:<span style="color:#2196F3">D</span>**
6. 要想使布局中的 TextView 控件的内容在水平方向和垂直方向上居中,应该设置属性为()。
A. android:gravity="center"
B. android:layout_gravity="center"
C. android:text="center"
D. android:layout_centerInParent="true"
**答案:<span style="color:#2196F3">D</span>**
> [!note] 教学提示
> 注意区分 `gravity`(内容对齐)和 `layout_gravity`(组件在父容器中的对齐)。在 RelativeLayout 中,`layout_centerInParent` 可实现完全居中。
7. 在 Android 中,将字符串转换为大写的格式方法是()。
A. convert()
B. toUpperCase()
C. equals()
D. parse()
**答案:<span style="color:#2196F3">B</span>**
8. Android 中,使用 Intent 传递数据的主要类型有()。
A. Serializable
B. Parcelable
C. 以上两者都可以
D. 都不可以
**答案:<span style="color:#2196F3">C</span>**
9. 通过 ContentProvider 进行数据共享时,必须在 AndroidManifest.xml 文件中对()进行配置。
A. activity
B. provider
C. service
D. receiver
**答案:<span style="color:#2196F3">D</span>**
10. 使用 startActivityForResult() 方法启动 Activity 后,该 Activity 被销毁后系统回调的方法是()。
A. onActivity()
B. onPause()
C. onActivityResult()
D. onStop()
**答案:<span style="color:#2196F3">D</span>**
11. 以下哪些方式可以实现两个应用程序之间的数据共享?
A. 使用 SharedPreferences
B. 使用 ContentProvider
C. 使用文件存储
D. 以上都是
**答案:<span style="color:#2196F3">D</span>**
12. SQLite 数据库存储的数据类型不包括()。
A. NULL
B. INTEGER
C. VARCHAR
D. BLOB
**答案:<span style="color:#2196F3">A</span>**
> [!note] 教学提示
> SQLite 支持五种存储类型:NULL、INTEGER、REAL、TEXT、BLOB。VARCHAR 不是 SQLite 原生支持的存储类型名称。
13. 可以进行分层布局的容器是()。
A. FrameLayout
B. LinearLayout
C. RelativeLayout
D. TableLayout
**答案:<span style="color:#2196F3">B</span>**
14. 下列选项中,用于获取数据库记录的语句是()。
A. rawQuery
B. select
C. query
D. delete
**答案:<span style="color:#2196F3">B</span>**
15. Android 中实现单例模式的正确方式是()。
A. 将构造方法设为 private
B. 将类设为 abstract
C. 只能使用静态工厂方法
D. 以上都可以
**答案:<span style="color:#2196F3">D</span>**
16. 以下关于 Activity 生命周期的描述,正确的是()。
A. Activity 处于前台时完全可见
B. Activity 不可见但在后台运行
C. Activity 被系统回收前调用 onDestroy
D. Activity 不可见,用户不可交互
**答案:<span style="color:#2196F3">B</span>**
17. 判断下面代码的输出结果是()。
> [!note] 教学提示
> 本题考查 Android Activity 启动流程的理解,需结合 Intent 和生命周期回调顺序进行分析。
**答案:<span style="color:#2196F3">B</span>**
18. Intent 是 Android 系统提供的消息传递机制。下列哪个方法能启动其他应用的 Activity?
A. Intent.ACTION_DIAL
B. Intent.ACTION_CALL
C. Intent.ACTION_SENDTO
D. Intent.ACTION_VIEW
**答案:<span style="color:#2196F3">B</span>**
19. putExtra() 方法用于向 Intent 中添加附加信息。下列哪个方法能够读取 Intent 中附加的字符串类型数据?
A. getExtra()
B. getStringExtra()
C. getData()
D. getString()
**答案:<span style="color:#2196F3">C</span>**
20. Bundle 类的()方法可以返回所有 key 的集合。
A. getKeys()
B. getString()
C. getStringExtra()
D. toString()
**答案:<span style="color:#2196F3">A</span>**
### 二、填空题(每题 2 分,共 20 分)
> [!note] 教学提示
> 填空题重点考查 Activity 间数据传递、广播接收者配置、有序广播发送以及 SQLite 数据库操作等实践技能。
**1. Activity 间数据传递**
如果 Activity_A 启动 Activity_B 并等待其执行结果时,代码片段如下:
```java
Intent intent = new Intent(Activity_A.this, ①);
Bundle bundle = new Bundle();
bundle.putString("name", "我是string");
intent.putExtras(bundle);
②;
```
**答案:**
- ① <span style="color:#2196F3">Activity_B.class</span>
- ② <span style="color:#2196F3">startActivityForResult(intent)</span>
**2. 广播接收者配置**
如下代码实现一个广播接收者 `kp.adver.receiver`,接收权限为 20 的有序广播,请完成下面代码。
```xml
<receiver android:name="MyReceiver">
③
<intent-filter>
④
<action android:name="kp.adver.receiver"/>
</intent-filter>
</receiver>
```
**答案:**
- ③ <span style="color:#2196F3">&lt;action&gt;</span>
- ④ <span style="color:#2196F3">android:name="kp.adver.receiver"</span>
**3. 发送有序广播**
下面是向上清单发送广播并附带消息的代码片段,请完成主要代码。
```java
Intent intent = new Intent();
⑤
intent.putExtra("msg", "来自 kp的消息");
⑥
```
**答案:**
- ⑤ <span style="color:#2196F3">intent.setAction("kp.adver.receiver")</span>
- ⑥ <span style="color:#2196F3">sendOrderedBroadcast(intent, null)</span>
**4. 联系人数据访问**
向通讯录的多个联系人可以通过以下方式来实现:
```java
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://com.android.contacts/contacts"));
startActivity(intent);
```
**5. 数据库插入操作**
下面代码片段完成向数据库表添加一条记录,请完善:
```java
DBOpenHelper helper = new DBOpenHelper(getApplicationContext(), "test.db", null, DB_VERSION);
SQLiteDatabase db = helper.getWritableDatabase();
Person person = new Person();
person.setName("wustzz");
person.setAge(24);
db.⑦("person", null, new Person[]{person.name, person.age});
db.close();
```
**答案:**
- ⑦ <span style="color:#2196F3">insert</span>(插入操作)
### 三、判断题(每题 2 分,共 20 分)
> [!note] 教学提示
> 判断题覆盖 Android 应用组件、Activity 生命周期、数据存储等核心概念,正确写 T,错误写 F。
| 题号 | 答案 |
|:----:|:----:|
| 01 | <span style="color:#2196F3">F</span> |
| 02 | <span style="color:#2196F3">F</span> |
| 03 | <span style="color:#2196F3">T</span> |
| 04 | <span style="color:#2196F3">T</span> |
| 05 | <span style="color:#2196F3">F</span> |
| 06 | <span style="color:#2196F3">F</span> |
| 07 | <span style="color:#2196F3">T</span> |
| 08 | <span style="color:#2196F3">F</span> |
| 09 | <span style="color:#2196F3">T</span> |
| 10 | <span style="color:#2196F3">T</span> |
### 四、程序设计题(30 分)
> [!note] 教学提示
> 本题考查 SimpleAdapter 的使用,是 Android UI 开发中适配器模式的典型应用。
**使用 SimpleAdapter 为 ListView 创建适配器,绑定数据源。**
**主要步骤:**
1. 创建 `List<Map<String, Object>>` 数据结构
2. 遍历 `names` 数组,为每个 item 添加 `header`、`personName`、`desc`
3. 创建 SimpleAdapter 并设置给 ListView
```java
// 创建数据源
List<Map<String, Object>> list = new ArrayList<>();
String[] names = {"张三", "李四", "王五"};
for (String name : names) {
Map<String, Object> map = new HashMap<>();
map.put("header", R.drawable.ic_launcher); // 头像
map.put("personName", name); // 姓名
map.put("desc", "这是一段描述文本"); // 描述
list.add(map);
}
// 创建 SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter(
this,
list,
R.layout.list_item, // 布局文件
new String[]{"header", "personName", "desc"},// 数据 key
new int[]{R.id.iv_header, R.id.tv_name, R.id.tv_desc} // 对应 View ID
);
// 设置适配器
listView.setAdapter(adapter);
```
> [!tip] 解题技巧
> SimpleAdapter 的构造函数参数较多,需重点掌握:数据源、布局文件、数据 key 数组、对应 View ID 数组的对应关系。
### 五、简答题(每题 5 分,共 30 分)
**1. 简述 MV 指令与 LDR 指令的异同**
MV 指令将半字数据从一个寄存器传送到另一个寄存器;LDR 指令用于从内存中读取数据到寄存器。
| 指令 | 操作数类型 | 功能 |
|:----:|:--------:|:----:|
| MV | 寄存器 → 寄存器 | 数据传送 |
| LDR | 内存 → 寄存器 | 数据加载 |
**2. 简述 CPSR 各状态位定义及功能**
CPSR(当前程序状态寄存器)是一个 32 位寄存器,位域定义如下:
| 位域 | 范围 | 功能 |
|:----:|:----:|:----:|
| N | [31] | 负数标志,运算结果为负时置 1 |
| Z | [30] | 零标志,运算结果为零时置 1 |
| C | [29] | 进位标志,加法产生进位/减法无借位时置 1 |
| V | [28] | 溢出标志,运算溢出时置 1 |
| I | [7] | IRQ 中断禁止位,置 1 时禁止 IRQ |
| F | [6] | FIQ 中断禁止位,置 1 时禁止 FIQ |
| T | [5] | Thumb 状态位,为 1 时处理器处于 Thumb 状态 |
| M[4:0] | [4:0] | 处理器模式位,指示当前工作模式 |
**3. 简述嵌入式系统定义及特点**
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
特点:
- 专用性强,针对特定任务定制
- 资源受限,CPU、内存、存储有限
- 实时性要求高,需在规定时间内响应
- 软硬件协同设计,需考虑功耗和成本
**4. 简述 μC/OS-II 中任务调度的相关函数及作用**
| 函数 | 功能 |
|:----:|:----:|
| OSTaskCreate() | 创建新任务 |
| OSTaskDel() | 删除指定任务 |
| OSTaskSuspend() | 挂起任务 |
| OSTaskResume() | 恢复被挂起的任务 |
| OSTimeDly() | 延时指定时钟节拍数 |
| OSTimeDlyHMSM() | 按时分秒延时 |
| OSTaskChangePrio() | 改变任务优先级 |
| OSTaskSwInit() | 初始化任务切换 |
> [!note] 教学提示
> μC/OS-II 是一个抢占式实时操作系统,任务调度基于优先级。掌握这些 API 函数对于理解 RTOS 的任务管理机制至关重要。
### 六、设计题(每题 15 分,共 30 分)
**1. 用 ARM 汇编代码实现以下 C 程序段**
```c
if(a >= 100)
x = 1;
else
y = 1;
```
**答案:**
```assembly
CMP R0, #100 ; 比较 R0 和 100
MOVGE R1, #1 ; 若 R0 >= 100,R1 = 1 (x = 1)
MOVLT R2, #1 ; 若 R0 < 100,R2 = 1 (y = 1)
```
> [!note] 教学提示
> ARM 条件执行是其指令集的重要特性。`GE` 表示大于或等于(Greater or Equal),`LT` 表示小于(Less Than)。通过条件码可以避免使用跳转指令,提高流水线效率。
**2. 从 ARM 处理器结构特点分析其对智能移动终端的支持**
ARM 处理器的设计极大地推动了智能移动终端的发展,主要体现在:
- **RISC 架构**:采用精简指令集,指令执行效率高,且功耗极低,非常适合依靠电池供电的移动设备
- **Thumb 指令集**:提供 16 位指令格式,大幅提高代码密度,减少对存储空间的需求
- **多级流水线技术**:如 ARM9 的 5 级流水线,提高指令执行效率和吞吐量
- **低功耗管理模式**:支持 Idle、Power-down 等多种低功耗模式,延长电池续航
- **丰富的片上外设集成**:ARM 核心配合 SoC 设计,集成 Wi-Fi、蓝牙、图形加速等控制器,缩小设备体积
- **开放的生态与标准**:IP 授权模式允许厂商定制芯片,促进移动终端多样化发展
## 关联笔记
- [[试题5]]
- [[试题6]]
- [[ARM体系结构]]
- [[μC/OS-II操作系统]]
+340
View File
@@ -0,0 +1,340 @@
---
tags:
- 嵌入式系统
- 试题
create time: 2026-06-10 10:41
---
# 试题 8 — 武汉科技大学《嵌入式系统》
## 概述
- **课程**:嵌入式系统(第 2 学期)
- **学校**:武汉科技大学
- **题型**:填空题、选择题、名词解释、简答题、综合题
- **知识点**:ARM 体系结构与指令集、处理器模式与寄存器、RTOS 调度策略、嵌入式系统定义
> [!tip] 学习建议
> 本试卷填空题和选择题覆盖面广,建议结合 `[[嵌入式系统/ARM架构与指令集]]` 笔记进行系统复习。名词解释部分需要准确记忆专业术语的规范定义。
## 正文
### 一、填空题(每空 2 分,共 20 分)
1. 嵌入式系统是以(**应用**)为中心,以(**计算机技术**)为基础,(**软硬件可裁剪**),适应应用系统的(**专用**)计算机系统。
2. 嵌入式系统的两大指令体系分别是(**ARM 指令体系**)和(**Thumb 指令体系**)。
3. ARM9TDMI-5 中采用的是(**哈佛**)体系结构。
4. CPSR 的中文名称是(**当前程序状态寄存器**)。
5. ARM 指令条件码 EQ 表示(**相等**)。
6. 在 Thumb 状态中,为了提高数据的传输效率,可以使用(**LDR/STR**)指令。
> [!note] 教学提示
> 第 1 题是嵌入式系统的经典定义,务必熟记"以应用为中心、以计算机技术为基础、软硬件可裁剪、专用"四个关键词。第 2 题中 ARM 指令集为 32 位,Thumb 指令集为 16 位,Thumb 通过压缩指令码提高代码密度。
---
### 二、选择题(每题 2 分,共 10 分)
1. μC/OS-II 操作系统属于()。
A. 批处理操作系统
B. 嵌入式实时操作系统
C. 占先式实时操作系统
D. 非占先式实时操作系统
2. 当异常发生时,ARM 处理器进入()模式。
A. 系统模式
B. 管理模式
C. 用户模式
D. 中断模式
3. 寄存器 R13 除了可以做通用寄存器外,还可以做()。
A. 程序计数器
B. 链接寄存器
C. 栈指针寄存器
D. 基址变址寄存器
4. ARM 汇编语句"ADD R0, R1, R2, LSL#1"的操作结果是()。
A. R0 = R2 + (R1)
B. R0 = (R2 << 1) + R1
C. R1 = R0 + (R2 << 1)
D. R0 = R1 + (R2 << 1)
5. LDR R2, [R3, #12] 属于()寻址方式。
A. 立即数寻址
B. 多寄存器寻址
C. 寄存器间接寻址
D. 相对寻址
**参考答案:** 1. C 2. C 3. C 4. A 5. A
> [!warning] 易错点
> - 第 1 题:μC/OS-II 既是嵌入式实时操作系统(B),也是占先式实时操作系统(C)。但作为"操作系统类别"的考查,答案为 **C**(占先式实时操作系统),强调其调度特性。
> - 第 2 题:异常发生时 ARM 进入管理模式(SVC),而非中断模式。这是一个常见混淆点。
> - 第 4 题:ARM 汇编操作数从左到右读,`ADD R0, R1, R2, LSL#1` 等价于 `R0 = R1 + (R2 << 1)`,注意结果存入 R0 而非 R1。
> [!tip] 答题技巧
> ARM 指令格式为:`操作码{条件码}{S} 目标寄存器, 操作数1, 操作数2`。其中操作数 2 支持桶形移位器(Barrel Shifter),可以在一条指令内完成移位和运算。
---
### 三、名词解释(每题 2 分,共 10 分)
#### 1. ARM 存储器的字
ARM 体系结构中,存储器的数据组织以字节为基本单位。**字(Word)** 为 32 位(4 字节),**半字(Halfword)** 为 16 位(2 字节),**字节(Byte)** 为 8 位(1 字节)。ARM 处理器支持对字、半字和字节的访问。
#### 2. SPSR
SPSR(Saved Program Status Register)即**保存程序状态寄存器**。当异常发生时,ARM 处理器自动将当前 CPSR 的值保存到对应异常模式的 SPSR 中,以便异常返回时恢复处理器状态。每种异常模式都有自己的 SPSR。
#### 3. 嵌入式系统
嵌入式系统是以**应用**为中心,以**计算机技术**为基础,**软硬件可裁剪**,适应应用系统的**专用**计算机系统。它通常嵌入在宿主设备中执行特定功能,对实时性、可靠性、功耗等方面有严格要求。
#### 4. 寄存器间接寻址
寄存器间接寻址是指令地址码给出的是**寄存器编号**,操作数的**有效地址为该寄存器中存储的值**。例如 `LDR R0, [R1]` 表示将 R1 中存储的地址所指向的内存数据加载到 R0。
#### 5. 条件码
条件码是 ARM 指令集中用于实现**条件执行**的标志位编码。ARM 指令(非 Thumb)几乎都可条件执行,条件码如 EQ(相等/零标志置位)、NE(不等)、GT(大于)、LT(小于)等,共 15 种。当条件满足时指令才执行,否则被跳过。
> [!note] 教学提示
> 条件码的判断依据来自 CPSR 中的 N、Z、C、V 四个标志位。例如 EQ 对应 Z=1(结果为零),NE 对应 Z=0。理解条件码需要先掌握 CPSR 标志位的含义。
---
### 四、简答题(共 3 题,8+9+9 共 26 分)
#### 1. 简述嵌入式操作系统中占先式调度和非占先式调度的特点和区别。(8 分)
**参考答案:**
**占先式调度(Preemptive Scheduling):**
- 按任务优先级调度 CPU 资源
- 高优先级任务可以**立即抢占**当前正在运行的低优先级任务
- 中断返回后,若更高优先级任务就绪,当前任务被挂起
- 实时性好,响应迅速
- 实现复杂度较高,需要考虑任务切换时的上下文保护
**非占先式调度(Cooperative Scheduling):**
- 任务按合作型调度方式工作,各任务彼此共享 CPU
- 任务调度只发生在**任务切换**之时,即当前任务主动放弃 CPU 控制权
- 实现简单,系统开销小
- 实时性较差,高优先级任务可能因低优先级任务长时间运行而延迟
**核心区别:** 占先式允许高优先级任务随时打断低优先级任务;非占先式只能在当前任务主动让出 CPU 时才进行调度。
```mermaid
flowchart TD
A["Task Scheduling Triggered"] --> B{"Preemptive or Cooperative?"}
B -->|"Preemptive"| C["High Priority Task Arrives"]
C --> D["Current Task Suspended Immediately"]
D --> E["High Priority Task Runs"]
B -->|"Cooperative"| F["Current Task Running"]
F --> G{"Task Voluntarily Yields CPU?"}
G -->|"Yes"| H["Scheduler Selects Next Task"]
H --> I["High Priority Task Runs"]
G -->|"No"| J["Continue Current Task"]
```
> [!note] 教学提示
> 占先式调度适用于对实时性要求高的场景(如工业控制、航空航天),非占先式适用于实时性要求不高但追求简单可靠的场景(如简单消费电子)。μC/OS-II 采用占先式调度。
---
#### 2. 简述 MOV 指令与 LDR 指令的区别。(9 分)
**参考答案:**
| 对比维度 | MOV 指令 | LDR 指令 |
|----------|----------|----------|
| **功能** | 数据传送 | 数据加载 |
| **操作对象** | 寄存器到寄存器、立即数到寄存器 | 内存到寄存器 |
| **访问内存** | **不能**访问内存空间 | **可以**访问内存地址 |
| **典型用法** | `MOV R1, R2`、`MOV R1, #0x10` | `LDR R1, [R2]`、`LDR R1, =0x12345678` |
**MOV 指令** 用于将一个常数或寄存器中的值传送到另一个寄存器,不涉及内存操作。它是纯寄存器层面的数据传送。
**LDR 指令** 用于从内存中读取数据到寄存器。它以寄存器间接寻址的方式访问内存,是嵌入式编程中加载内存数据的必备指令。
```armasm
; MOV 指令示例 - 寄存器间或立即数传送
MOV R1, R2 ; R1 = R2(寄存器到寄存器)
MOV R1, #0x10 ; R1 = 0x10(立即数到寄存器)
; LDR 指令示例 - 从内存加载数据
LDR R1, [R2] ; R1 = *R2(从 R2 指向的内存地址加载)
LDR R1, =0x12345678 ; R1 = 0x12345678(伪指令,加载 32 位常数)
```
> [!warning] 关键区别
> MOV 是数据传送指令,只能操作寄存器和立即数;LDR 是加载指令,可以访问内存地址。在实际编程中,需要从内存读取数据时必须使用 LDR,不能用 MOV 替代。
---
#### 3. 什么是程序状态寄存器?请简述其包含的内容。(9 分)
**参考答案:**
ARM 处理器内部包含 **1 个 CPSR**(当前程序状态寄存器)和 **5 个 SPSR**(保存程序状态寄存器,每种异常模式各一个)。CPSR 反映当前处理器的状态。
**CPSR 主要包含以下内容:**
| 位域 | 名称 | 功能描述 |
|------|------|----------|
| N[31] | 负数标志 | 运算结果为负数时置 1 |
| Z[30] | 零标志 | 运算结果为零时置 1 |
| C[29] | 进位标志 | 运算产生进位时置 1 |
| V[28] | 溢出标志 | 运算溢出时置 1 |
| I[7] | IRQ 禁止 | 置 1 时禁止 IRQ 中断 |
| F[6] | FIQ 禁止 | 置 1 时禁止 FIQ 中断 |
| T[5] | Thumb 状态 | 置 1 时处理器处于 Thumb 状态 |
| M[4:0] | 处理器模式 | 选择处理器工作模式(USR/SVC/IRQ/FIQ 等) |
当异常发生时,ARM 硬件自动将 CPSR 保存到对应异常模式的 SPSR 中;异常返回时,通过指令将 SSR 恢复到 CPSR,从而恢复处理器状态。
```mermaid
flowchart LR
subgraph CPSR["CPSR - Current Program Status Register"]
direction LR
N["N: Negative Flag"]
Z["Z: Zero Flag"]
C["C: Carry Flag"]
V["V: Overflow Flag"]
I["I: IRQ Disable"]
F["F: FIQ Disable"]
T["T: Thumb State"]
M["M[4:0]: Mode Bits"]
end
```
> [!note] 教学提示
> CPSR 的低 5 位 M[4:0] 决定处理器工作模式,共有 7 种模式:USR(用户)、SYS(系统)、SVC(管理模式)、ABT(中止)、UND(未定义)、IRQ(中断)、FIQ(快速中断)。理解 CPSR 是掌握 ARM 异常处理机制的基础。
---
### 五、综合题(共 3 题,每题 10 分,共 30 分)
#### 1. 嵌入式操作系统的产品形式与智能移动终端的变革
嵌入式操作系统有哪些产品形式?分析智能移动终端产品出现后带来的变革。
**参考答案:**
**嵌入式操作系统的产品形式:**
嵌入式操作系统广泛应用于多种产品形态中:
| 产品类型 | 典型系统 | 应用场景 |
|----------|----------|----------|
| 智能手机 | Android、iOS | 通信、娱乐、办公 |
| 平板电脑 | Android、iPadOS | 教育、商务、娱乐 |
| 智能手表 | Wear OS、watchOS | 健康监测、通知 |
| 车载系统 | Android Auto、QNX | 导航、车控、娱乐 |
| 智能家居 | 各类 RTOS | 家电控制、安防 |
| 工业控制 | VxWorks、FreeRTOS | 自动化、机器人 |
**智能移动终端带来的变革:**
1. **随时随地计算:** 打破了传统计算机的使用场景限制,用户可以随时接入网络获取信息和服务
2. **移动互联网生态:** 催生了 App 经济,形成了以应用商店为核心的软件分发模式
3. **丰富的人机交互:** 触摸屏、语音识别、手势控制等新型交互方式取代传统键盘鼠标
4. **传感器融合:** GPS、加速度计、陀螺仪、摄像头等多种传感器的集成,使设备具备环境感知能力
5. **云计算协同:** 移动终端与云端深度结合,实现计算任务的分布式处理
> [!note] 教学提示
> 智能移动终端的出现本质上是嵌入式系统从"专用设备"向"通用移动平台"的演进。Android 和 iOS 的成功证明了嵌入式操作系统可以同时兼顾实时性、功耗管理和用户体验。
---
#### 2. 嵌入式系统的定义、组成及特点
分析并论述嵌入式系统的定义、组成及特点。
**参考答案:**
**定义:**
嵌入式系统是以**应用**为中心,以**计算机技术**为基础,**软硬件可裁剪**,适应应用系统的**专用**计算机系统。它将计算机硬件和软件集成到宿主设备中,完成特定的功能或任务。
**组成:**
嵌入式系统由**硬件**和**软件**两大部分组成:
- **硬件层:** 嵌入式处理器(CPU/MPU/MCU/DSP)、存储器(ROM/RAM/Flash)、外设接口(GPIO/UART/SPI/I2C)、电源管理模块
- **软件层:** 嵌入式操作系统(如 μC/OS-II、FreeRTOS)、设备驱动程序、中间件、应用程序
```mermaid
flowchart TD
subgraph Hardware["Hardware Layer"]
CPU["Embedded Processor"]
Memory["ROM / RAM / Flash"]
Peripherals["GPIO / UART / SPI"]
Power["Power Management"]
end
subgraph Software["Software Layer"]
OS["Embedded OS (RTOS)"]
Driver["Device Drivers"]
Middleware["Middleware"]
App["Application"]
end
Hardware --> Software
```
**特点:**
1. **专用性:** 面向特定应用领域,功能明确
2. **实时性:** 对响应时间有严格要求,需在限定时间内完成任务
3. **可靠性:** 在各种环境下长时间稳定运行
4. **资源受限:** 处理器性能、内存容量、存储空间有限,需优化设计
5. **软硬件协同:** 硬件和软件需紧密配合,可裁剪以满足成本和功耗需求
6. **低功耗:** 许多嵌入式设备依靠电池供电,功耗管理至关重要
---
#### 3. 嵌入式系统在实际生活中的应用
结合所学知识,简要分析嵌入式系统在实际生活中的应用。
**参考答案:**
嵌入式系统已深入渗透到现代生活的各个方面,以下为主要应用领域:
| 应用领域 | 典型产品 | 关键技术 |
|----------|----------|----------|
| **智能手机** | iPhone、Android 手机 | ARM 处理器、触控交互、移动 OS |
| **智能家居** | 智能音箱、扫地机器人 | IoT 通信、语音识别、传感器 |
| **汽车电子** | ECU、车载导航、ADAS | CAN 总线、实时控制、传感器融合 |
| **医疗设备** | 心脏起搏器、血糖仪、CT | 高可靠性、低功耗、精确控制 |
| **工业控制** | PLC、数控机床、机器人 | 实时控制、现场总线、抗干扰 |
| **物联网** | 智能穿戴、环境监测 | 低功耗通信(BLE/Zigbee)、边缘计算 |
**分析要点:**
1. **智能手机** 是嵌入式系统最成功的应用之一,集成 ARM 处理器、多种传感器、触摸屏等,运行 Android/iOS 等嵌入式操作系统
2. **智能家居** 通过 IoT 技术将家电设备联网,实现远程控制和自动化
3. **汽车电子** 是嵌入式系统的重要应用领域,现代汽车中包含数十个 ECU,负责发动机控制、安全气囊、ABS 等关键功能
4. **医疗设备** 对可靠性和实时性要求极高,如心脏起搏器需要 7x24 小时不间断工作
5. **工业控制** 强调实时性和稳定性,嵌入式系统在自动化生产线中发挥核心作用
> [!note] 教学提示
> 嵌入式系统的应用场景虽然多样,但核心需求一致:**专用性**(面向特定功能)、**实时性**(限时响应)、**可靠性**(稳定运行)。不同应用场景在这些需求上的侧重点不同,例如医疗设备更强调可靠性,工业控制更强调实时性。
---
## 关联笔记
- [[嵌入式系统/ARM架构与指令集]]
- [[嵌入式系统/RTOS调度策略]]
- [[嵌入式系统/嵌入式系统设计]]
+394
View File
@@ -0,0 +1,394 @@
---
tags: [嵌入式系统, 试题, 嵌入式系统设计与开发]
create time: 2026-06-10 10:41
---
# 试题 9 — 武汉科技大学《嵌入式系统设计与开发》A 卷
## 概述
- **课程**:嵌入式系统设计与开发
- **学校**:武汉科技大学
- **题型**:选择题、填空题、判断题、程序设计题、简答题
- **知识点**:Android 四大组件、布局与 Intent、SQLite 数据库、ContentProvider、SimpleAdapter、ARM 指令与 CPSR
> [!tip] 学习建议
> 本卷以 Android 应用开发为主线,兼顾嵌入式操作系统基础。建议先梳理 Android 四大组件的职责与交互关系,这是选择题和填空题的高频考点。
## 正文
### 一、选择题(每题3分,共48分)
**1. 能够在移动设备的操作系统是()。**
A. DOS &ensp; B. Android &ensp; C. Windows &ensp; D. Unix
**答案:B**
> [!tip] 解析
> Android 是专为移动设备设计的操作系统,基于 Linux 内核。DOS 是早期个人电脑操作系统,Windows 和 Unix 主要用于桌面或服务器环境。
---
**2. 下列关于 Android 应用开发的描述中,错误的是()。**
A. 应用图标需要放置在 res drawable 目录下
B. 变量目录 res 内部包含了应用程序工程所需的全部资源
C. 应用的配置文件清单文件是 AndroidManifest.xml
D. 目前 asset 和 res 能够存储资源文件,但只要 res 目录的文件会在 R.java 文件中自动生成索引
**答案:B**
> [!tip] 解析
> `res` 目录并不包含应用所需的**全部**资源,`assets` 目录也可以存放资源文件(如字体、配置文件等),且 `assets` 中的文件不会在 `R.java` 中生成索引,需通过 `AssetManager` 访问。
---
**3. 下列选项中,不属于 Android 四大组件的是()。**
A. Activity &ensp; B. Service &ensp; C. ContentProvider &ensp; D. BroadcastReceiver
**答案:D**
> [!note] 教学提示
> Android 四大组件为:**Activity**(界面)、**Service**(后台服务)、**ContentProvider**(数据共享)、**BroadcastReceiver**(广播接收)。实际上四大组件包括 Activity、Service、ContentProvider 和 BroadcastReceiver。但本题选项 D 虽然 BroadcastReceiver 本身是四大组件之一,结合答案来看,题目可能存在出题意图的偏差——请以原始试卷答案为准。**答案为 D**。
---
**4. 在 Android 中,用于完成用户界面的组件是()。**
A. Activity &ensp; B. Service &ensp; C. ContentProvider &ensp; D. BroadcastReceiver
**答案:A**
> [!tip] 解析
> Activity 是 Android 中负责用户界面展示和交互的组件,每个 Activity 对应一个屏幕窗口。Service 用于后台任务,ContentProvider 用于数据共享,BroadcastReceiver 用于接收广播消息。
---
**5. 在 Android 7.0 中新增的权限类型是()。**
A. normal &ensp; B. dangerous &ensp; C. signature &ensp; D. signatureOrSystem
**答案:D**
> [!tip] 解析
> Android 权限分为 normal、dangerous、signature 和 signatureOrSystem 四类。其中 `signatureOrSystem` 是在 Android 7.0(API 24)中新增/调整的权限保护级别,要求应用必须使用与系统平台签名相同的签名,或位于系统分区中。
---
**6. 要想使布局中的 TextView 控件的内容在水平和垂直方向上居中,应该设置属性为()。**
A. `android:gravity="center"` &ensp; B. `android:layout_gravity="center"` &ensp; C. `android:text="center"` &ensp; D. `android:layout_centerInParent="true"`
**答案:D**
> [!note] 教学提示
> 注意区分 `gravity` 和 `layout_gravity`:
> - `gravity` 控制**控件内部内容**的对齐方式
> - `layout_gravity` 控制**控件自身**在父布局中的位置
> - `layout_centerInParent="true"` 仅在 `RelativeLayout` 中生效,使控件在父容器中水平和垂直居中
---
**7. 在 Android 中,将字符串转换为大写的方法是()。**
A. convert() &ensp; B. toUpperCase() &ensp; C. equals() &ensp; D. parse()
**答案:B**
> [!tip] 解析
> Java 中 `String.toUpperCase()` 方法将字符串中所有字符转换为大写。`convert()` 不是标准方法,`equals()` 用于比较字符串,`parse()` 通常用于类型转换(如 `Integer.parseInt()`)。
---
**8. Android 中,使用 Intent 传递数据的主要方式有()。**
A. Serializable &ensp; B. Parcelable &ensp; C. 以上都可以 &ensp; D. 都不可以
**答案:C**
> [!tip] 解析
> Intent 传递对象数据时,可实现 `Serializable`(Java 标准序列化,性能较低)或 `Parcelable`(Android 专用,性能更高)接口。两种方式均可使用,但 Android 推荐使用 `Parcelable`。
---
**9. 通过 ContentProvider 进行数据共享时,需要在 AndroidManifest.xml 中配置()。**
A. activity &ensp; B. provider &ensp; C. service &ensp; D. receiver
**答案:B**
> [!note] 教学提示
> ContentProvider 必须在 `AndroidManifest.xml` 中通过 `<provider>` 标签注册,指定 `authorities`(唯一标识符)和对应的 ContentProvider 类名。
---
**10. 使用 startActivityForResult() 方法启动 Activity 后,系统回调的方法是()。**
A. onActivity() &ensp; B. onPause() &ensp; C. onActivityResult() &ensp; D. onStop()
**答案:C**
> [!tip] 解析
> 当被启动的 Activity 执行 `setResult()` 并结束返回时,系统会回调调用方的 `onActivityResult(int requestCode, int resultCode, Intent data)` 方法,用于接收返回数据。
---
**11. 以下哪种方式可以实现两个应用程序间的数据共享?**
A. SharedPreferences &ensp; B. ContentProvider &ensp; C. 文件存储 &ensp; D. 以上都是
**答案:B**
> [!note] 教学提示
> `SharedPreferences` 和文件存储只能在应用内部使用。跨应用数据共享的**标准方式**是 `ContentProvider`,它通过 URI 对外暴露数据接口,支持跨进程访问。
---
**12. SQLite 数据库存储的数据类型不包括()。**
A. NULL &ensp; B. INTEGER &ensp; C. VARCHAR &ensp; D. BLOB
**答案:C**
> [!tip] 解析
> SQLite 支持的数据类型为:NULL、INTEGER、REAL、TEXT、BLOB。SQLite 使用**动态类型系统**,`VARCHAR` 虽然在建表语句中可以写,但 SQLite 内部将其视为 TEXT,不存在独立的 VARCHAR 类型。
---
**13. 可以进行分层布局的容器是()。**
A. FrameLayout &ensp; B. LinearLayout &ensp; C. RelativeLayout &ensp; D. TableLayout
**答案:A**
> [!note] 教学提示
> `FrameLayout`(帧布局)是最简单的布局容器,它允许子元素层叠放置,后面的子元素会覆盖前面的,天然支持分层布局效果。`LinearLayout` 按线性排列,`RelativeLayout` 按相对位置排列,`TableLayout` 按表格排列。
---
**14. 下列选项中,用于获取数据库记录的语句是()。**
A. rawQuery &ensp; B. select &ensp; C. query &ensp; D. delete
**答案:D**
> [!tip] 解析
> 在 Android 的 `SQLiteDatabase` 类中,`query()` 和 `rawQuery()` 都用于查询记录。但本题答案为 D,可能是出题角度针对特定语境。请以原始试卷为准。
---
**15. Android 中实现单例模式的正确方式是()。**
A. 将构造方法设为 private &ensp; B. 将类设为 abstract &ensp; C. 使用静态工厂方法 &ensp; D. 以上都可以
**答案:A**
> [!note] 教学提示
> 单例模式的核心步骤:
> 1. 将构造方法声明为 `private`,禁止外部 `new` 创建实例
> 2. 在类内部创建 `private static` 实例
> 3. 提供 `public static` 方法获取唯一实例
>
> 将构造方法设为 `private` 是实现单例的**必要前提**。
---
**16. 以下关于 Activity 生命周期的描述,正确的是()。**
A. Activity 处于前台时完全可见
B. Activity 不可见但在后台运行
C. Activity 被回收前调用 onDestroy
D. Activity 不可见,用户不可交互
**答案:D**
> [!note] 教学提示
> Activity 生命周期各状态特征:
> - **Resumed(前台)**:完全可见且可交互
> - **Paused**:部分可见,不可交互
> - **Stopped**:完全不可见,但在后台保留实例
> - **Destroyed**:被销毁,资源被回收
---
### 二、填空题(每题2分,共20分)
1. 启动另一个 Activity 时,需要创建 Intent 并指定目标为 `______`,然后调用 `______` 方法启动。
**答案:** `Activity_B.class`,`startActivityForResult(intent)`
2. 广播接收器需要在 AndroidManifest.xml 中通过 `______` 标签配置,并指定 `______` 属性。
**答案:** `intent-filter`,`android:name="kp.adver.receiver"`
3. 发送有序广播时,需要先设置 Action 为 `______`,然后调用 `______` 方法发送。
**答案:** `intent.setAction("kp.adver.receiver")`,`sendOrderedBroadcast(intent, null)`
> [!note] 教学提示
> 有序广播(Ordered Broadcast)按照接收器的优先级依次传递,高优先级的接收器可以修改数据或中断广播传播。与之对应的普通广播(Normal Broadcast)是异步发送,所有接收器几乎同时接收。
4. 在 Android 四大组件之间传递数据时,常采用 `______` 模式,由一个组件将请求转发给另一个组件处理。
**答案:** 委托
5. 通过 ContentResolver 查询联系人时,URI 需要指定查询 `______`。
**答案:** 手机中联系人的编号为1的联系人
6. 在 Android 中执行 SQL 语句可以使用 `______` 方法。
**答案:** `execSQL`
> [!note] 教学提示
> `execSQL()` 方法用于执行无返回值的 SQL 语句(如 INSERT、UPDATE、DELETE、CREATE TABLE)。查询操作应使用 `query()` 或 `rawQuery()` 方法。
---
### 三、判断题(每题2分,共20分,正确写 T,错误写 F)
1. Android 系统是基于 Linux 内核开发的。( **F** )
2. Activity 的生命周期中,onPause() 在 Activity 完全不可见后才会被调用。( **F** )
3. Service 可以在后台长期运行,不需要用户界面。( **F** )
4. ContentProvider 是 Android 中实现跨应用数据共享的标准方式。( **T** )
5. BroadcastReceiver 可以接收系统广播和自定义广播。( **T** )
6. Android 中的 SharedPreferences 支持跨应用数据共享。( **F** )
7. SQLite 数据库支持事务操作。( **T** )
8. Intent 不能用于在 Activity 之间传递复杂对象。( **F** )
9. LinearLayout 中的子控件可以按水平或垂直方向排列。( **T** )
10. AndroidManifest.xml 文件中必须声明应用使用的所有权限。( **T** )
> [!note] 教学提示
> 第6题:`SharedPreferences` 默认只能在创建它的应用内部访问,跨应用共享需要设置 `MODE_WORLD_READABLE`(Android 4.2 后已废弃)或使用 ContentProvider。
> 第8题:Intent 完全可以传递实现了 Serializable 或 Parcelable 接口的复杂对象。
---
### 四、程序设计题(30分)
**题目:使用 SimpleAdapter 为 ListView 设置适配器,实现一个联系人列表的显示。**
**参考代码及解析:**
```java
// 第一步:准备数据源 —— 每个 Map 代表列表中一行的数据
List<Map<String, Object>> listItems = new ArrayList<>();
for (int i = 0; i < names.length; i++) {
Map<String, Object> listItem = new HashMap<>();
listItem.put("header", imageIds[i]); // 头像图片资源ID
listItem.put("personName", names[i]); // 联系人姓名
listItem.put("desc", descs[i]); // 联系人描述
listItems.add(listItem);
}
// 第二步:创建 SimpleAdapter
// 参数说明:
// this —— 当前 Context
// listItems —— 数据源(List<Map>)
// R.layout.activity_main —— 列表项的布局文件
// new String[]{...} —— Map 中的 key,指定要显示的数据
// new int[]{...} —— 布局中控件的 ID,指定数据绑定到哪个控件
SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
R.layout.activity_main,
new String[]{"personName", "header", "desc"},
new int[]{R.id.name, R.id.header, R.id.desc});
// 第三步:获取 ListView 并设置适配器
ListView listView = (ListView) findViewById(R.id.mylist);
listView.setAdapter(simpleAdapter);
```
> [!note] 教学提示
> SimpleAdapter 的核心思想是**数据映射**:将 `String[]` 数组中指定的 Map key 与 `int[]` 数组中指定的布局控件 ID 一一对应。这种映射关系使得数据绑定变得直观。SimpleAdapter 适用于列表项结构固定、数据源为 `List<Map>` 的场景。
> [!tip] 进阶思考
> 如果列表项需要更复杂的交互(如点击事件),需要配合 `OnItemClickListener` 使用。同时,如果数据量较大或列表项结构复杂,建议使用自定义 `BaseAdapter` 或 `RecyclerView.Adapter` 替代 SimpleAdapter。
---
### 五、简答题(每题5分,共30分)
**1. 简述 MV 指令与 LDR 指令的区别**
`MV`(MOV)指令用于**寄存器之间**的数据传送,操作数只能是寄存器或立即数,不能直接访问内存。例如:`MOV R0, R1` 将 R1 的值复制到 R0。
`LDR` 指令用于从**内存中读取数据**加载到寄存器,支持多种寻址方式。例如:`LDR R0, [R1]` 将 R1 指向的内存地址中的数据加载到 R0。
| 对比项 | MV(MOV) | LDR |
|--------|-----------|-----|
| 数据来源 | 寄存器/立即数 | 内存/寄存器 |
| 操作对象 | CPU 内部 | CPU 内部 + 存储器 |
| 速度 | 较快 | 较慢(需访问总线) |
---
**2. 简述 CPSR 各状态位定义及功能**
CPSR(Current Program Status Register)是 ARM 处理器的当前程序状态寄存器,32 位结构如下:
| 位域 | 名称 | 功能 |
|------|------|------|
| N (31) | 负数标志 | 运算结果为负数时置1 |
| Z (30) | 零标志 | 运算结果为零时置1 |
| C (29) | 进位标志 | 运算产生进位时置1 |
| V (28) | 溢出标志 | 运算产生有符号溢出时置1 |
| I (7) | IRQ 禁止位 | 置1时禁止 IRQ 中断 |
| F (6) | FIQ 禁止位 | 置1时禁止 FIQ 中断 |
| T (5) | Thumb 状态位 | 置1为Thumb状态,置0为ARM状态 |
| M[4:0] (0-4) | 处理器模式 | 标识当前处理器工作模式(USR/SVC/IRQ 等) |
> [!note] 教学提示
> CPSR 中的 N、Z、C、V 四个标志位是条件执行的基础。ARM 指令几乎都可以条件执行,如 `ADDEQ R0, R1, R2` 仅在 Z=1 时执行加法。
---
**3. 简述嵌入式系统定义及特点**
**定义:** 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
**主要特点:**
- **专用性强**:针对特定任务设计,软硬件可裁剪
- **实时性高**:需要在规定时间内完成响应
- **资源受限**:处理器性能、内存、存储空间有限
- **可靠性要求高**:多用于工业控制、医疗等关键领域
- **软硬件协同设计**:硬件和软件需联合优化
- **功耗敏感**:尤其在便携式设备中,低功耗是关键指标
---
**4. 简述 μC/OS-II 中与任务调度相关的函数**
μC/OS-II 提供了完整的任务管理 API:
| 函数 | 功能 | 说明 |
|------|------|------|
| `OSTaskCreate()` | 创建任务 | 分配任务栈、初始化 TCB、设置优先级 |
| `OSTaskDel()` | 删除任务 | 将任务从就绪表中移除,释放资源 |
| `OSTaskSuspend()` | 挂起任务 | 任务进入休眠态,不再参与调度 |
| `OSTaskResume()` | 恢复任务 | 将挂起的任务重新加入就绪队列 |
| `OSTimeDly()` | 延时函数 | 任务主动让出 CPU,等待指定时钟节拍后恢复 |
> [!note] 教学提示
> μC/OS-II 采用**基于优先级的抢占式调度**算法:当高优先级任务就绪时,当前运行的低优先级任务会被立即抢占。`OSTimeDly()` 是任务主动放弃 CPU 的常用方式,调用后任务进入等待状态,调度器会切换到最高优先级的就绪任务。
>
> 建议学生画出任务状态转换图加深理解:
> ```mermaid
> stateDiagram-v2
> [*] --> 就绪态: OSTaskCreate
> 就绪态 --> 运行态: 调度器选中
> 运行态 --> 就绪态: 更高优先级抢占
> 运行态 --> 等待态: OSTimeDly
> 等待态 --> 就绪态: 延时到期
> 运行态 --> 挂起态: OSTaskSuspend
> 挂起态 --> 就绪态: OSTaskResume
> 运行态 --> 删除态: OSTaskDel
> 删除态 --> [*]
> ```
---
## 关联笔记
- [[试题8]]
- [[试题10]]
Binary file not shown.
+52
View File
@@ -0,0 +1,52 @@
---
tags:
- 算法设计与分析
- 试题册
- 索引
create time: 2026-06-10 10:00
---
# 算法设计与分析试题册索引
## 概述
本文档为武汉科技大学「算法设计与分析」课程历年试题合集索引。每份试题包含完整题目及参考答案,涵盖单选、判断、填空、简答、代码分析、算法设计与编程等题型。
> [!tip] 使用建议
> 建议先通读题目尝试作答,再对照答案检查。重点关注 **动态规划**、**回溯法** 和 **分治法** 三类高频算法设计题。
## 试题目录
| 序号 | 试卷 | 题型概要 |
|:----:|------|----------|
| 1 | [[试题1]] | 单选 + 简答 + 代码分析 + 算法编程 |
| 2 | [[试题2]] | 选择 + 简答 + 程序填空 + 算法编程 |
| 3 | [[试题3]] | 单选 + 判断 + 简答 + 程序填空 + 算法编程 |
| 4 | [[试题4]] | 单选 + 判断 + 简答 + 算法编程 |
| 5 | [[试题5]] | 单选 + 判断 + 简答 + 程序填空 + 算法编程 |
## 知识点分布
```mermaid
quadrantChart
title "试题知识点覆盖"
x-axis "低频" --> "高频"
y-axis "简单" --> "困难"
quadrant-1 "回溯法与剪枝"
quadrant-2 "动态规划"
quadrant-3 "基础概念与复杂度"
quadrant-4 "贪心与分治"
"算法复杂度分析": [0.85, 0.30]
"排序算法": [0.70, 0.35]
"贪心算法": [0.65, 0.50]
"分治法": [0.60, 0.55]
"动态规划": [0.80, 0.75]
"回溯法": [0.75, 0.80]
"图搜索(BFS/DFS)": [0.70, 0.60]
"NP问题理论": [0.40, 0.65]
"算法设计综合题": [0.85, 0.85]
```
## 关联笔记
- [[算法设计与分析/README|算法设计与分析课程]]
+432
View File
@@ -0,0 +1,432 @@
---
tags:
- 算法设计与分析
- 试题
create time: 2026-06-10 10:00
---
# 试题 1 — 武汉科技大学《算法设计与分析》
## 概述
- **课程**:算法设计与分析
- **学校**:武汉科技大学
- **题型**:单选题、简答题、代码分析题、算法设计与编程题
- **知识点**:算法复杂度分析、贪心算法、分治法、动态规划、回溯法、图算法
> [!tip] 学习建议
> 本试题包含代码分析和算法设计题,建议先理解各算法的核心思想,再对照代码验证。重点关注 **n皇后回溯** 和 **最大连续子数组和** 两个经典问题。
## 正文
### 一、单选题(每题2分,共10题,20分)
**从备选的答案中选出合适的答案,并把答案标号写在答题纸中。**
1. 算法必须具备输入、输出和( )等四个特性。
- A. 可行性
- B. 程序代码
- C. 确定性
- D. 无限循环
2. 算法的复杂度包含( )两种。
- A. 空间复杂度和时间复杂度
- B. 最好复杂度和最坏复杂度
- C. 平均复杂度和最坏复杂度
- D. 最低复杂度和最高复杂度
3. 下列关于时间复杂度的说法中,一般认为哪个复杂度最高的是( )。
- A. O(logn)
- B. O(n²)
- C. O(n!)
- D. O(n)
4. 斐波那契数列的递归实现时间复杂度是( )。
- A. O(n)
- B. O(2ⁿ)
- C. O(logn)
- D. O(nlogn)
5. 在解决一个问题时,可以将问题划分成 k 个子问题,( )。
- A. 分治策略
- B. 贪心策略
- C. 动态规划策略
- D. 回溯策略
6. 哪些是图问题的优化算法可以在多项式时间实现( )。
- A. 最大流最小割算法
- B. 分支限界算法
- C. 贪心算法
- D. 广度优先算法
7. 以下关于回溯法的描述中,不正确的是( )。
- A. 回溯法一般用深度优先策略搜索解空间
- B. 回溯法适用于求解组合数较大的问题
- C. 回溯法的时间复杂度一般为 O(n!)
- D. 回溯法在问题的解空间中按深度优先搜索
8. 有一个集合有 n 个元素,如果进行所有的子集的搜索,则当 n=10 时,最多搜索到的子集树的第( )层。
- A. 3
- B. 5
- C. 7
- D. 1
9. 分治法通常基于( )策略。
- A. 递归
- B. 迭代
- C. 贪心
- D. 动态规划
10. 设有一个递归算法 `int f(int n) { if(n<=1) return 1; else return f(n-1)+f(n-2); }`,计算 f(5) 需要调用( )次。
- A. 5
- B. 10
- C. 15
- D. 以上都不对
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|------|---|---|---|---|---|---|---|---|---|---|
| 答案 | C | A | C | B | A | B | B | B | A | A |
> [!warning] 易错点
> 第4题:斐波那契递归实现的时间复杂度是 O(2ⁿ) 而非 O(n)。递归树是二叉树结构,每层展开2个分支,深度为 n,因此总调用次数为指数级。第10题 f(5) 的递归调用次数为 15 次。
> [!tip] 答题技巧
> 算法四要素:**有穷性、确定性、可行性、输入输出**。复杂度从低到高排序:O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(2ⁿ) < O(n!)。
---
### 二、简答题(每题5分,共6题,30分)
**要求:200字以内,不需配代码,不要配图。**
#### 1. 中国剩余定理问题(10分)
有一堆苹果,3个3个地数,最后余2个;5个5个地数,最后余3个;7个7个地数,最后余2个。这堆苹果至少有多少个?
**参考答案:**
这是典型的中国剩余定理(孙子定理)问题。
设苹果数为 x,则:
- x ≡ 2 (mod 3)
- x ≡ 3 (mod 5)
- x ≡ 2 (mod 7)
由条件1和条件3:x ≡ 2 (mod 3) 且 x ≡ 2 (mod 7),因为 gcd(3,7)=1,所以 x ≡ 2 (mod 21)。
即 x = 21k + 2,代入条件2:21k + 2 ≡ 3 (mod 5) → k ≡ 1 (mod 5)
最小正整数解:k = 1,x = 21×1 + 2 = **23**。
> [!note] 教学提示
> 中国剩余定理的关键在于逐步合并同余方程。先找两个模数的最小公倍数,将两个条件合并为一个,再与第三个合并。
#### 2. 晋级赛问题
N人晋级赛,每人每轮淘汰一名对手。编号为1~N人进行一轮比赛,下一轮的比赛选手的编号规律是:1和N比赛,2和N-1比赛,3和N-2比赛,……。问晋级比赛的轮次和比赛场次。
**参考答案:**
- 每轮比赛场次为 floor(N/2),晋级人数为 ceil(N/2)
- 配对规则:第 i 号与第 (N+1-i) 号对阵(对称配对)
- 总比赛场次 = N - 1(每场淘汰1人)
- 轮次 = ceil(log₂N)
#### 3. 贪心算法框架
贪心算法的框架是什么?
**参考答案:**
贪心算法基本框架:
1. 从问题的初始解出发
2. 循环执行:从候选解集中选取当前最优的候选解
3. 若加入该候选解后解仍可行,则将其加入当前解
4. 重复直到达到目标或候选集为空
```mermaid
flowchart TD
A["Start: Empty Solution"] --> B{"Candidate Set Empty?"}
B -->|"No"| C["Select Best Candidate"]
C --> D{"Solution Still Valid?"}
D -->|"Yes"| E["Add to Solution"]
E --> B
D -->|"No"| F["Discard Candidate"]
F --> B
B -->|"Yes"| G["Return Solution"]
```
> [!note] 教学提示
> 贪心法的核心性质:**贪心选择性质**(局部最优导致全局最优)和**最优子结构**。并非所有问题都适用贪心法,如0-1背包问题用贪心法得不到最优解。
#### 4. 回溯法基本思想
回溯法的基本思想是什么?
**参考答案:**
1. **解空间**:定义问题的解空间树(子集树或排列树)
2. **深度优先搜索**:从根节点出发,按DFS策略搜索解空间
3. **剪枝函数**:用约束函数和限界函数剪去不可能产生最优解的子树
4. **回溯**:当搜索到某节点不满足约束时,回退到上一个节点,尝试其他分支
```mermaid
flowchart TD
A["Root Node"] --> B["Expand Node"]
B --> C{"Constraint Satisfied?"}
C -->|"Yes"| D{"Leaf Node?"}
D -->|"Yes"| E["Record Solution"]
D -->|"No"| F["Go Deeper"]
F --> B
C -->|"No"| G["Prune & Backtrack"]
G --> H{"More Branches?"}
H -->|"Yes"| B
H -->|"No"| I["Return to Parent"]
```
#### 5. 候诊椅问题
在某医院的大厅,100个座位的候诊椅排成一排。第一个来的人选择任意一个座位坐下;后来的人要么坐在空位上,要么坐在已坐有人的旁边。当两边都有人时,这个人要坐在这两人的中间。求第100个人最多可以坐几次空位。
**参考答案:**
这是一个经典的递推/概率问题。
分析表明,第100个人最多可以坐到 **1个空位**。
#### 6. 贪心、分治、动态规划比较
请简要描述贪心算法、分治法、动态规划法的基本思想及异同。
**参考答案:**
| 特性 | 贪心法 | 分治法 | 动态规划 |
|------|--------|--------|----------|
| 核心思想 | 局部最优→全局最优 | 分解→递归→合并 | 子问题重叠→表格存储 |
| 子问题 | 不回溯 | 独立不重叠 | 重叠子问题 |
| 适用条件 | 贪心选择性质 | 可分解可合并 | 最优子结构+重叠子问题 |
```mermaid
flowchart LR
subgraph Greedy["Greedy"]
G1["Local Optimal"] --> G2["Global Optimal"]
end
subgraph Divide["Divide & Conquer"]
D1["Divide"] --> D2["Recurse"]
D2 --> D3["Merge"]
end
subgraph DP["Dynamic Programming"]
P1["Subproblems"] --> P2["Table Lookup"]
P2 --> P3["Optimal Solution"]
end
```
---
### 三、代码分析题(每题8分,共3题,24分)
**要求:300字以内。**
#### 1. n皇后问题代码分析
阅读以下 n 后问题的分析代码,指出其算法策略:
```c
int COL[20], MAIN_DIAG[40], COUNTER_DIAG[40];
int n, COUNT;
int check(int t) {
int i, j;
i = t; j = COL[t];
while (i > 0) {
if (COL[i] == j || (COL[i]-j)==i-t || (j-COL[i])==i-t)
return 0;
i--;
}
return 1;
}
void backtrack(int t) {
int i;
if (t > n) {
for (i = 1; i <= n; i++) printf("%d ", COL[i]);
printf("\n"); COUNT++;
} else {
for (i = 1; i <= n; i++) {
COL[t] = i;
if (check(t)) backtrack(t + 1);
COL[t] = 0;
}
}
}
```
**参考答案:**
**算法策略:回溯法(深度优先搜索 + 剪枝)**
- `COL[i]` 记录第 i 行皇后所在的列号
- `check(t)` 检查第 t 行放置皇后是否与前面已放置的皇后冲突(同行、同列、同对角线)
- `backtrack(t)` 递归地在第 t 行尝试放置皇后,若 t > n 则找到一个解
- **时间复杂度**:O(n!)
> [!note] 教学提示
> n皇后问题是回溯法的经典应用。剪枝函数 check() 是关键——它利用"同一列"和"同对角线"约束大幅减少搜索空间。对角线判断公式:`|COL[i]-COL[j]| == |i-j|`。
#### 2. 最大连续子数组和
阅读以下代码,判断代码实现了哪个算法分析设计原理:
```c
int MaxSum(int a[], int n) {
int sum = 0, b = 0;
for (int i = 0; i < n; i++) {
if (b > 0) b += a[i];
else b = a[i];
if (b > sum) sum = b;
}
return sum;
}
```
**参考答案:**
**算法策略:动态规划(Kadane算法)**
- 维护当前子数组和 b,若 b > 0 则继续累加,否则从当前元素重新开始
- 状态转移:`b[i] = max(a[i], b[i-1] + a[i])`
- **时间复杂度**:O(n),**空间复杂度**:O(1)
> [!tip] 关键理解
> 这是动态规划的经典应用。核心思想:如果前面的子数组和为负数,那么它对后面的结果只会产生负面影响,不如重新开始。这也是"局部最优→全局最优"的体现。
#### 3. max2函数分析
已知 max 函数,求 4 个数 a、b、c、d 中分别相邻两数的最大数,以 max 函数为基本对象,讨论 max2 函数的求解过程,写出 max2 的函数原型(C语言格式),并分析 max2 函数的时间复杂度和空间复杂度。
**参考答案:**
```c
void max2(int a, int b, int c, int d,
int *max1, int *max2, int *min1, int *min2);
```
求解过程:
1. 比较 a 和 b → max1=max(a,b), min1=min(a,b)
2. 比较 c 和 d → max2=max(c,d), min2=min(c,d)
3. 从 {max1, max2} 中选较大者为总最大值
- **时间复杂度**:O(1)(最多3次比较)
- **空间复杂度**:O(1)
---
### 四、算法设计与编程题(每题13分,共2题,26分)
#### 1. 分治法求最大两个数和最小两个数
利用分治算法求一组数据中最大的两个数和最小的两个数。
**参考答案:**
**算法策略:分治法** — 将数组分为两半,递归地在每半中找最大/最小的两个数,然后合并。
```c
// 分治法求最大两个数和最小两个数
void findMaxMin(int a[], int l, int r,
int *max1, int *max2, int *min1, int *min2) {
if (l == r) {
*max1 = *min1 = a[l];
*max2 = INT_MIN; *min2 = INT_MAX;
return;
}
if (r - l == 1) { // 基本情况:两个元素
if (a[l] > a[r]) {
*max1 = a[l]; *max2 = a[r];
*min1 = a[r]; *min2 = a[l];
} else {
*max1 = a[r]; *max2 = a[l];
*min1 = a[l]; *min2 = a[r];
}
return;
}
// 分治:递归处理左右两半
int mid = (l + r) / 2;
int lm1, lm2, rm1, rm2, ln1, ln2, rn1, rn2;
findMaxMin(a, l, mid, &lm1, &lm2, &ln1, &ln2);
findMaxMin(a, mid+1, r, &rm1, &rm2, &rn1, &rn2);
// 合并:从4个候选中选最大2个和最小2个
// ...(合并逻辑)
}
```
**时间复杂度**:T(n) = 2T(n/2) + O(1) = **O(n)**
```mermaid
flowchart TD
A["Array: a[l..r]"] --> B{"r-l <= 1?"}
B -->|"Yes"| C["Direct Compare"]
B -->|"No"| D["Divide: mid = (l+r)/2"]
D --> E["findMaxMin(l, mid)"]
D --> F["findMaxMin(mid+1, r)"]
E --> G["Merge: Select Top 2 Max & Min"]
F --> G
```
> [!note] 教学提示
> 分治法的关键是**分解**、**递归求解**、**合并**三步。本题的合并步骤需要从4个候选值中选出最大的两个和最小的两个,最多需要6次比较。
#### 2. 方阵最大路径和(动态规划)
在一个 n×n 的方阵中,填入 1, 2, 3... n² 个数字。方阵最下方有一人,此人走完 n 个方格后必须在最下方出来。任意时刻,每个人走过一方格,必须走到此方格的8个方向之一继续走。输入为 n,找出使所有数相加之和为最大的路径。
**参考答案:**
**算法策略:动态规划** — 从最后一行向上递推,每个格子的最大路径和 = 自身值 + 下方三格中的最大值。
```c
int maxPathSum(int n, int grid[n][n]) {
int dp[n][n];
for (int j = 0; j < n; j++)
dp[n-1][j] = grid[n-1][j]; // 初始化最后一行
for (int i = n-2; i >= 0; i--) {
for (int j = 0; j < n; j++) {
dp[i][j] = grid[i][j];
int maxDown = dp[i+1][j]; // 正下方
if (j > 0 && dp[i+1][j-1] > maxDown)
maxDown = dp[i+1][j-1]; // 左下方
if (j < n-1 && dp[i+1][j+1] > maxDown)
maxDown = dp[i+1][j+1]; // 右下方
dp[i][j] += maxDown;
}
}
int result = dp[0][0];
for (int j = 1; j < n; j++)
if (dp[0][0+j] > result) result = dp[0][j];
return result;
}
```
**时间复杂度**:O(n²),**空间复杂度**:O(n²)
```mermaid
flowchart TD
A["Grid n x n"] --> B["Initialize Bottom Row"]
B --> C["For i = n-2 downto 0"]
C --> D["dp[i][j] = grid[i][j] + max(down-left, down, down-right)"]
D --> E["Answer = max(dp[0][0..n-1])"]
```
> [!tip] 关键理解
> 动态规划的**状态定义**:`dp[i][j]` 表示从第 i 行第 j 列出发到最下方的最大路径和。**状态转移方程**:`dp[i][j] = grid[i][j] + max(dp[i+1][j-1], dp[i+1][j], dp[i+1][j+1])`。这是典型的"自底向上"递推。
---
## 关联笔记
- [[算法设计与分析/试题册/试题2]]
- [[算法设计与分析/试题册/试题3]]
- [[算法设计与分析/试题册/试题4]]
- [[算法设计与分析/试题册/试题5]]
+310
View File
@@ -0,0 +1,310 @@
---
tags:
- 算法设计与分析
- 试题
- 武汉科技大学
create time: 2026-06-10 10:00
---
# 试题 2 — 武汉科技大学《算法设计与分析》
## 概述
- **课程**:算法设计与分析(A)第二学期
- **学校**:武汉科技大学
- **题型**:选择题、简答题、程序填空题、算法设计与编程题
- **知识点**:NP问题理论、辗转相除法、排序算法、回溯法、贪心法、图搜索
> [!tip] 学习建议
> 本试题包含 NP 问题理论和程序填空题,建议重点掌握 **NP/NP-C/NP-hard 的定义与区别**,以及 **回溯法框架代码** 的理解。
## 正文
### 一、选择题(每题2分,共15题,30分)
**从备选的答案中选出合适的答案,并把答案标号写在答题纸中。**
1. 以下属于算法基本思想的是( )。
- A. 递归分治思想的基本思路就是自顶向下,逐步求精
- B. 用自然语言描述算法,优点是通俗易懂,缺点是容易有歧义
- C. 穷举算法能够找到问题的全局最优解
- D. 三种基本控制结构是顺序、选择、循环
2. 下列算法时间复杂度中,哪个不是常数复杂度( )。
- A. O(1)
- B. O(logn)
- C. O(n)
- D. O(nlogn)
3. 下列排序算法中时间复杂度不是 O(n²) 的是( )。
- A. 直接插入排序
- B. 冒泡排序
- C. 简单选择排序
- D. 快速排序
4. n个人同时站在一个大水龙头前面打水,以下说法不正确的是( )。
- A. 让水桶小的人先打水,可以使得每个人等待的时间总和最小
- B. 让水桶大的人先打水,可以使得每个人等待的时间总和最小
- C. 让水桶小的人先打水,可以反映出后来先打水的人的等待时间
- D. 无论怎样安排打水顺序,所有人等待时间总和都是一样
5. 设 n 为按递增排列的有序数列,折半查找的时间复杂度为( )。
- A. O(logn)
- B. O(n)
- C. O(nlogn)
- D. O(n²)
6. 小猴子有100个苹果,第一天拿走一半多一个,以后每天拿走剩余中一半多一个,10天后还剩多少个?( )
- A. 766
- B. 382
- C. 190
- D. 都不对
7. `int f(int n) { if(n<=1) return 1; else return f(n-1)+f(n-2); }` 计算 f(5) 的值是( )。
- A. 5
- B. 8
- C. 10
- D. 以上都不对
8. 以下方法中,不属于分治法基本要素的是( )。
- A. 贪心法
- B. 递归求解法
- C. 分治法
- D. 逐步求精法
9. 如果一个结点不再进一步扩展并且其所有的儿子结点都已经产生出来,则该结点应该标记为( )。
- A. 活结点
- B. 扩展结点
- C. 死结点
- D. 以上都不对
10. 用回溯法求解一个问题时,首先需要定义问题的( )。
- A. 递归空间
- B. 线性空间
- C. 二叉树
- D. 解空间
11. 图的广度优先搜索类似于树的( )遍历。
- A. 先序遍历
- B. 中序遍历
- C. 后序遍历
- D. 层次遍历
12. 合并排序属于( )。
- A. 归并排序
- B. 交换排序
- C. 选择排序
- D. 插入排序
13. 下列不是分治法基本步骤的是( )。
- A. 分解
- B. 合并
- C. 回溯
- D. 求解子问题
14. 回溯法区别于蛮力穷举搜索的主要特点是( )。
- A. 有剪枝函数
- B. 不需要剪枝
- C. 只搜索部分解空间
- D. 搜索全部解空间
15. 假设1000年有一只寿命为1年的虫子,每年交配产生两对小虫,每对第二年成熟并交配……( )年后虫子有多少只?
- A. 96
- B. 97
- C. 95
- D. 63
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | D | C | D | B | A | C | B | A | C | D | D | D | C | A | B |
> [!warning] 易错点
> 第2题:O(1) 是常数复杂度,O(logn)、O(n)、O(nlogn) 都不是。第3题:快速排序平均时间复杂度为 O(nlogn),不是 O(n²)。第6题:递推计算后剩余0个,选C"都不对"。
---
### 二、简答题(每题10分,共2题,20分)
**要求:写出详细过程,可配图。**
#### 1. NP问题、NP-C问题、NP-hard问题
回答什么是NP问题、NP-C问题、NP-hard问题。
**参考答案:**
- **P类问题**:可以在多项式时间内被确定性图灵机解决的判定问题
- **NP类问题**:可以在多项式时间内被非确定性图灵机解决的判定问题,即解可以在多项式时间内被**验证**
- **NP-C(NP完全)问题**:既是NP类问题,又是NP-hard问题的问题
- **NP-hard问题**:至少和NP-C问题一样难的问题,不一定在NP中
```mermaid
flowchart TD
subgraph P["P Class"]
P1["Polynomial Time Solvable"]
end
subgraph NP["NP Class"]
NP1["Polynomial Time Verifiable"]
NPC["NP-Complete"]
end
subgraph NPHard["NP-hard"]
NH1["At Least as Hard as NPC"]
end
P -->|"P ⊆ NP"| NP
NPC -->|"NPC = NP ∩ NP-hard"| NPHard
NPC --> NP
```
> [!question] 思考
> P vs NP 问题至今未解——如果你能证明 P=NP 或 P≠NP,那你就是百万美元克莱数学研究所千禧年大奖得主!
#### 2. 辗转相除法
简述求2个整数的最大公约数的辗转相除法。用此算法求正整数 2146 和 8100 的最大公约数。
**参考答案:**
原理:gcd(a,b) = gcd(b, a mod b),直到余数为0。
```
8100 = 2146 × 3 + 1662
2146 = 1662 × 1 + 484
1662 = 484 × 3 + 210
484 = 210 × 2 + 64
210 = 64 × 3 + 18
64 = 18 × 3 + 10
18 = 10 × 1 + 8
10 = 8 × 1 + 2
8 = 2 × 4 + 0
```
**gcd(2146, 8100) = 2**,时间复杂度 O(log(min(a,b)))
> [!tip] 答题技巧
> 辗转相除法的步骤要写完整,每一步都要写出被除数 = 除数 × 商 + 余数 的形式,直到余数为0。最后一个非零余数就是最大公约数。
---
### 三、程序填空题(每空2分,2×5=10分)
#### 1. 二分查找
```c
int Binary_Search(int *a, int low, int high, int key) {
int mid;
if (low > high) return (-1);
mid = (low + high) / 2;
if (a[mid] == key) return mid;
else if (a[mid] > key)
return Binary_Search(a, low, mid - 1, key);
else
return Binary_Search(a, (1)___, high, key);
}
```
**(1)** `low = mid + 1`
#### 2. 组合问题
```c
int a[20];
void main() {
int n=4, r=3;
a[0]=r;
(2)___; // comb(n, r)
}
void comb(int m, int r) {
int i, j;
for (i=m; i>=(3)___; i--) { // r
a[r] = i;
if (i > r)
comb((4)___, r-1); // i-1
else { /* 输出组合 */ }
}
}
```
**(2)** `comb(n, r)`  **(3)** `r`  **(4)** `i - 1`
> [!note] 教学提示
> 组合问题的递归思路:从 m 个数中选 r 个,先固定一个数,再从剩余中选 r-1 个。循环从 m 递减到 r 确保不重复。
---
### 四、算法设计与编程题(每题15分,共2题,30分)
#### 1. 马的遍历问题(回溯法)
在 m×n 的棋盘上,马处于某个方格中,每个格只能走一次,设计算法使马不重复地走过所有方格并返回原位。
**参考答案:**
**算法策略:回溯法**,马从当前位置出发,依次尝试8个方向移动。
```c
int direction[8][2] = {{1,2},{2,1},{2,-1},{1,-2},
{-1,-2},{-2,-1},{-2,1},{-1,2}};
int book[100][100] = {0};
void dfs(int x, int y, int step) {
if (step == m * n) { /* 输出结果 */ return; }
for (int k = 0; k < 8; k++) {
int tx = x + direction[k][0];
int ty = y + direction[k][1];
if (tx>=0 && tx<m && ty>=0 && ty<n && book[tx][ty]==0) {
book[tx][ty] = 1;
dfs(tx, ty, step + 1);
book[tx][ty] = 0; // 回溯
}
}
}
```
**时间复杂度**:O(8^(mn)),实际通过剪枝大幅减少
```mermaid
flowchart TD
A["Start Position (x,y)"] --> B["Try 8 Directions"]
B --> C{"Valid Move?"}
C -->|"Yes"| D["Mark & Recurse"]
D --> E{"All Cells Visited?"}
E -->|"Yes"| F["Found Solution"]
E -->|"No"| B
C -->|"No"| G["Backtrack"]
G --> B
```
#### 2. 活动安排问题(贪心法)
有 n 个活动,每个活动有开始时间和结束时间,设计贪心算法选择尽可能多的活动。
**参考答案:**
**算法策略:贪心法** — 按结束时间排序,每次选结束最早且不冲突的活动。
```c
int selectActivities(int start[], int end[], int n) {
int count = 1, lastEnd = end[0];
for (int i = 1; i < n; i++) {
if (start[i] >= lastEnd) {
count++;
lastEnd = end[i];
}
}
return count;
}
```
**时间复杂度**:O(nlogn)
> [!tip] 关键理解
> 活动安排问题是贪心法的经典应用。贪心策略:**每次选择结束时间最早的活动**,这样可以为后续活动留出最多的时间。这体现了"局部最优→全局最优"的贪心思想。
---
## 关联笔记
- [[算法设计与分析/试题册/试题1]]
- [[算法设计与分析/试题册/试题3]]
+292
View File
@@ -0,0 +1,292 @@
---
tags:
- 算法设计与分析
- 试题
- 武汉科技大学
create time: 2026-06-10 10:00
---
# 试题 3 — 武汉科技大学《算法设计与分析》
## 概述
- **课程**:算法设计与分析
- **学校**:武汉科技大学(2012级计算机学院)
- **题型**:单项选择题、判断题、简答题、程序填空题、算法设计与编程题
- **知识点**:递归复杂度、排序算法、图搜索(BFS/DFS)、动态规划、回溯法
> [!tip] 学习建议
> 本试题覆盖了算法设计的核心方法论,特别关注 **BFS与DFS的对比** 和 **动态规划的基本思想**。建议结合代码填空题加深对递归框架的理解。
## 正文
### 一、单项选择题(每题2分,共10题,20分)
**从备选的答案中选出合适的答案,并把答案标号写在答题纸中。**
1. 下列哪些不是算法的 3 要素( )。
- A. 操作
- B. 控制结构
- C. 数据结构
- D. 输入输出
2. 冒泡排序的时间复杂度为( )。
- A. O(n)
- B. O(n²)
- C. O(n³)
- D. O(nlogn)
3. 下列算法中错误的是( )。
- A. 算法的每一步骤必须有确切的含义
- B. 算法的时间复杂度与实现语言无关
- C. 对于特殊的输入,算法的时间复杂度可以是不固定的
- D. 算法的运行时间与编写程序的语言无关
4. 求 n 个数中的最小数,时间复杂度为( )。
- A. O(1)
- B. O(n)
- C. O(n²)
- D. O(nlogn)
5. 调用函数 `int fib(int n) { return (n>1 ? fib(n-1)+fib(n-2) : n); }` 时间复杂度是( )。
- A. O(n)
- B. O(n²)
- C. O(2ⁿ)
- D. 无递归调用
6. 栈是一种基于什么机制实现的数据结构?( )
- A. 先进先出
- B. 先进后出
- C. 随机存取
- D. 索引存取
7. 流程图是描述算法的常用工具,下列哪种符号表示判断( )。
- A. 圆形
- B. 椭圆形
- C. 菱形
- D. 平行四边形
8. 深度优先遍历在搜索空间树上的搜索方式为( )。
- A. 广度优先
- B. 深度优先
- C. 最小耗费优先
- D. 综合优先
9. 下述算法中正确的是( )。
- A. 广度优先遍历算法只适合于无向图
- B. 广度优先遍历算法只适合于有向图
- C. 遍历一个无向图可能需要多次调用DFS或BFS
- D. 只需一次调用DFS或BFS即可遍历一个无向图
10. 以下关于迭代法的描述中,正确的是( )。
- A. 迭代算法在逻辑上总是可以转换为与它等价的递归算法
- B. 每个递归算法在逻辑上总是可以转换为与它等价的循环结构算法
- C. 迭代算法的可靠性比递归算法好
- D. 迭代算法的执行效率一定比递归算法好
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|------|---|---|---|---|---|---|---|---|---|---|
| 答案 | D | B | C | B | C | B | C | B | C | A |
> [!warning] 易错点
> 第1题:算法三要素是**操作、控制结构、数据结构**,输入输出是算法的四个特性之一,不是三要素之一。第5题:斐波那契递归的时间复杂度是 O(2ⁿ)。第9题:无向图的连通分量可能需要多次调用BFS/DFS。
---
### 二、判断题(每题2分,共10题,20分)
**正确的在括号内填 √,错误的填 ×。**
1. 算法中的状态和步骤具有有穷性。( )
2. 一个算法应该适用于解决某类问题。( )
3. O(n²) 和 O(3n²+3) 的两个算法的时间复杂度相同。( )
4. 经验空间复杂度是指算法在执行过程中临时占用存储空间的大小。( )
5. 回溯法就是穷举法,所不同的是对一般问题回溯法比穷举法效率低。( )
6. 一个算法一般适用于一个特定类型的问题。( )
7. 动态规划适合求解具有重叠子问题性质的问题。( )
8. 贪心算法和动态规划法都用于求解最优问题,且在每一步只做一次决策。( )
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|------|---|---|---|---|---|---|---|---|
| 答案 | × | √ | √ | × | × | √ | √ | × |
> [!note] 知识点辨析
> 第1题:算法的有穷性是指算法必须在有限步骤内结束,而不是"状态和步骤具有有穷性"。第5题:回溯法通过剪枝函数避免了穷举法的盲目搜索,效率通常更高。
---
### 三、简答题(每题6分,共4题,24分)
#### 1. 层优先遍历
在该树中,如果按照层优先化 M 的编排,即节点 1 开始,依次遍历其儿子节点 2, 3, …,请依次给出遍历到的第五个节点和第八个节点的编号。
**参考答案:**
按照层优先(广度优先)遍历,第五个节点编号为 **5**,第八个节点编号为 **8**。
```mermaid
flowchart TD
A["1"] --> B["2"]
A --> C["3"]
B --> D["4"]
B --> E["5"]
C --> F["6"]
C --> G["7"]
D --> H["8"]
```
> [!tip] 答题技巧
> 层优先遍历即 BFS,使用**队列**数据结构。按层级从左到右依次访问节点,第 n 层的节点在第 n+1 层之前全部被访问。
#### 2. 背包问题的贪心步骤
用贪心算法解决背包问题的基本步骤。
**参考答案:**
1. 计算每个物品的**性价比**(价值/重量)
2. 按性价比从高到低排序
3. 依次装入背包,直到背包装满或物品用完
> [!warning] 易错点
> 贪心法只能得到分数背包问题的最优解,对于 **0-1背包问题**(每个物品只能选或不选),贪心法不能保证最优解,需要用动态规划。
#### 3. 兔子问题(斐波那契数列)
一对初生的兔子满第三个月开始生小兔子,每对兔子生完一对小兔子后……小兔子长到第三个月也会生小兔子。假设不考虑兔子死亡,请问一年中共有多少对兔子?写出递推公式。
**参考答案:**
设第 n 个月的兔子对数为 f(n):
- f(1) = 1,f(2) = 1
- f(n) = f(n-1) + f(n-2),n ≥ 3
一年后(第12个月):**f(12) = 144 对**
#### 4. 动态规划与分治法的异同
简要说明动态规划法与分治法的相似性和区别。
**参考答案:**
| 特性 | 分治法 | 动态规划 |
|------|--------|----------|
| 子问题 | 相互独立,不重叠 | 有重叠子问题 |
| 存储 | 不存储中间结果 | 表格存储中间结果 |
| 求解方向 | 自顶向下递归 | 自底向上递推或记忆化搜索 |
| 适用条件 | 可分解可合并 | 最优子结构 + 重叠子问题 |
---
### 四、程序填空题(每空2分,2×10=20分)
#### 1. 递归回溯框架
```c
try(int i) {
if (i <= 20) { // (1) 判断是否到达目标
if (check1(i) && check2(i))
output(i); // 输出结果
else
try(i+1); // 递归
}
}
check1(int x) {
for (int j = 2; j <= x-1; j++)
if (x % j == 0) return 0; // (2) 判断是否为素数
return 1;
}
```
**(1)** `i <= 20`  **(2)** `x % j == 0`
#### 2. 迷宫搜索
```c
search(int i, int j) {
for (int di = -1; di <= 1; di++)
for (int dj = -1; dj <= 1; dj++) {
if (maze[i+di][j+dj] == 1) { // (3) 可通行
maze[i+di][j+dj] = 2; // 标记已访问
search(i+di, j+dj);
}
}
maze[i][j] = 0; // 回溯
}
```
**(3)** `1`
> [!note] 教学提示
> 迷宫搜索是回溯法的典型应用。用标记数组或修改原数组来记录已访问的位置,回溯时恢复原值。
---
### 五、算法设计与编程题(每题15分,共2题,30分)
#### 1. 图的着色问题(回溯法)
图1是一个正在构造的四色地图,使用至多四种不同颜色对地图进行涂色,相同区域相邻颜色不同。
**参考答案:**
**算法策略:回溯法**,依次为每个区域着色(1-4),检查相邻区域是否同色。
```c
int data[6][6] = {0}; // 邻接矩阵
int color[6] = {0};
void tryColor(int s) {
if (s > 6) { output(); return; }
for (int i = 1; i <= 4; i++) {
color[s] = i;
if (colorSame(s) == 0) tryColor(s + 1);
color[s] = 0;
}
}
int colorSame(int s) {
for (int i = 1; i <= s-1; i++)
if (data[i][s]==1 && color[i]==color[s]) return 1;
return 0;
}
```
**时间复杂度**:O(4ⁿ)
#### 2. 流水作业调度(Johnson算法)
某厂有 m 个加工任务,在印刷车间和装订车间所需时间如下表。如何安排使加工时间最短。
| 任务 | J1 | J2 | J3 | J4 | J5 | J6 |
|------|----|----|----|----|----|-----|
| 印刷 | 3 | 12 | 5 | 2 | 9 | 11 |
| 装订 | 8 | 10 | 9 | 6 | 3 | 1 |
**参考答案:**
**Johnson算法**:找最小加工时间,若在印刷车间则排最前,若在装订车间则排最后。
最优顺序:**J4→J1→J3→J2→J5→J6**,最短加工时间:**43天**
```mermaid
flowchart LR
A["Build Time Matrix"] --> B{"Find Minimum"}
B -->|"In Row 1"| C["Place at Front"]
B -->|"In Row 2"| D["Place at End"]
C --> E["Remove & Repeat"]
D --> E
E --> B
```
---
## 关联笔记
- [[算法设计与分析/试题册/试题1]]
- [[算法设计与分析/试题册/试题2]]
+296
View File
@@ -0,0 +1,296 @@
---
tags:
- 算法设计与分析
- 试题
- 武汉科技大学
create time: 2026-06-10 10:00
---
# 试题 4 — 武汉科技大学《算法设计与分析》
## 概述
- **课程**:算法设计与分析
- **学校**:武汉科技大学(2015级计算机学院)
- **题型**:单项选择题、判断题、简答题、算法设计与编程题
- **知识点**:递归复杂度、排序算法、AlphaGo与AI、图搜索、回溯法、动态规划、贪心法
> [!tip] 学习建议
> 本试题涉及 AlphaGo 等前沿话题,建议关注算法在实际应用中的体现。重点掌握 **回溯法框架** 和 **两台机器流水作业调度(Johnson算法)**。
## 正文
### 一、单项选择题(每题2分,共15题,30分)
**从备选的答案中选出合适的答案,并把答案标号写在答题纸中。**
1. 求某个问题的递归算法如下:`f(1)=1; f(n)=Max{f(n-1), f(n-2)+1} (n>1)`,则该算法的时间复杂度 T(n) 为( )。
- A. T(n) = T(n-1) + 1
- B. T(n) = T(n-2) + T(n-1) + 1
- C. T(n) = T(n-2) + 2T(n-1) + 1
- D. T(n) = 2T(n-1) + 2T(n-2) + 1
2. 下列哪个问题的类型适合用贪心法( )。
- A. 汉诺塔问题
- B. 矩阵连乘
- C. 八皇后
- D. 最长公共子序列
3. 下列关于动态规划法的描述中,正确的是( )。
- A. 递归算法的时间复杂度一定优于动态规划法
- B. 动态规划的子问题可以不独立
- C. 动态规划法的每一步的决策结果取决于之前所有的决策
- D. 动态规划适用于具有最优子结构和重叠子问题性质的问题
4. 对长度为 n 的线性表排序,在最坏情况下,比较次数不是 n(n-1)/2 的排序方法是( )。
- A. 快速排序
- B. 冒泡排序
- C. 直接插入排序
- D. 简单选择排序
5. AlphaGo 主要使用的算法是( )。
- A. Deep Learning
- B. Deep Mind
- C. Java++
- D. C++
6. 函数 `int func(int n) { int r=0; while(n--) r++; return r; }` 的时间复杂度是( )。
- A. O(1)
- B. O(n)
- C. O(n²)
- D. 无递归调用
7. 栈是一种基于什么机制实现的数据结构?( )
- A. 先进先出
- B. 先进后出
- C. 随机存取
- D. 索引存取
8. 流程图中表示判断的符号是( )。
- A. 圆形
- B. 椭圆形
- C. 菱形
- D. 平行四边形
9. 深度优先遍历在搜索空间树上的搜索方式为( )。
- A. 广度优先
- B. 深度优先
- C. 最小耗费优先
- D. 综合优先
10. 下述算法中正确的是( )。
- A. 广度优先遍历算法只适合于无向图
- B. 广度优先遍历算法只适合于有向图
- C. 遍历一个无向图可能需要多次调用DFS或BFS
- D. 只需一次调用DFS或BFS即可遍历一个无向图
11. 以下关于迭代法的描述中,正确的是( )。
- A. 迭代算法在逻辑上总是可以转换为与它等价的递归算法
- B. 每个递归算法在逻辑上总是可以转换为与它等价的循环结构算法
- C. 迭代算法的可靠性比递归算法好
- D. 迭代算法的执行效率一定比递归算法好
12. ( )阶段是优化决策解决问题的过程。
- A. 贪心算法
- B. 动态规划
- C. 分支限界
- D. 迭代算法
13. 在算法的广度优先搜索策略中,一般采用的数据结构是( )。
14. 联欢晚会报数问题,凡是报3的人出列,编号为( )可以胜出。
- A. 27
- B. 33
- C. 48
- D. 144
15. 人工智能(AI)的英文全称是( )。
- A. Automatic Intelligence
- B. Automatic Information
- C. Artificial Intelligence
- D. Artificial Information
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | B | A | D | C | A | B | B | C | B | C | A | B | B | A | C |
> [!warning] 易错点
> 第3题:动态规划的两个关键性质是**最优子结构**和**重叠子问题**,选D。第4题:快速排序最坏情况比较次数为 O(n²),但不是恰好 n(n-1)/2。第15题:AI = Artificial Intelligence(人工智能)。
---
### 二、判断题(每题2分,共10题,20分)
**正确的在括号内填 √,错误的填 ×。**
1. 递归算法中的递归调用不能超过一定次数。( )
2. 如果有 n 阶台阶,可以一次上1阶,也可以一次上2阶,设计算法计算共有多少种上法。( )
3. 简述动态规划的基本思想步骤。( )
4. 递归算法在规模为 n 时需要递归调用自身。( )
5. 深度优先搜索算法使用队列数据结构。( )
6. 用图的顶点表示活动,用边表示活动之间的优先关系,称为 AOE 网。( )
7. 回溯法的解空间一定是树结构。( )
8. 回溯法通常使用深度优先搜索策略。( )
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|------|---|---|---|---|---|---|---|---|
| 答案 | × | √ | × | √ | × | × | √ | √ |
> [!note] 知识点辨析
> 第5题:DFS使用**栈**(或递归调用栈),BFS使用**队列**。第6题:AOE网(Activity On Edge)用**边**表示活动,顶点表示事件;AOV网(Activity On Vertex)用顶点表示活动。
---
### 三、简答题(每题10分,共2题,20分)
#### 1. 回溯法的基本框架
**参考答案:**
```c
void backtrack(int t) {
if (t > n) {
updateSolution(); // 到达叶节点,记录最优解
return;
}
for (int i = 0; i < numChoices(t); i++) {
x[t] = choice(t, i); // 做选择
if (constraint(t)) { // 剪枝判断
backtrack(t + 1); // 递归
}
// 撤销选择(回溯)
}
}
```
- **解空间**:子集树或排列树
- **搜索策略**:深度优先搜索(DFS)
- **剪枝函数**:约束函数 + 限界函数
- **时间复杂度**:最坏 O(2ⁿ) 或 O(n!)
```mermaid
flowchart TD
A["backtrack(t)"] --> B{"t > n?"}
B -->|"Yes"| C["Record Solution"]
B -->|"No"| D["For each choice i"]
D --> E["x[t] = choice(i)"]
E --> F{"constraint OK?"}
F -->|"Yes"| G["backtrack(t+1)"]
F -->|"No"| H["Prune"]
G --> D
H --> D
```
#### 2. 假币问题(分治法)
有 n 个银币,其中有一个假币(重量较轻),用天平称量找出假币。设计算法找出至少需要称多少次。
**参考答案:**
**算法策略:分治法**
将银币分为三组(尽量均分),用天平称量两组:
- 若等重 → 假币在第三组
- 若不等重 → 假币在较轻的一组
递归处理,直到只剩1个银币。
**最少称量次数**:⌈log₃n⌉ 次
> [!tip] 关键理解
> 每次称量可以将搜索范围缩小为原来的 1/3,因此需要 ⌈log₃n⌉ 次。这是分治法的经典应用——每次将问题规模缩小。
---
### 四、算法设计与编程题(每题15分,共2题,30分)
#### 1. 图的着色问题(回溯法)
使用至多四种不同颜色对地图进行涂色,要求相邻区域颜色互不相同。
**参考答案:**
```c
int n = 4; // 4种颜色
int color[100] = {0};
int graph[100][100] = {0};
void tryColor(int t) {
if (t > 6) { output(); return; }
for (int i = 1; i <= n; i++) {
color[t] = i;
if (colorSame(t) == 0) tryColor(t + 1);
color[t] = 0;
}
}
int colorSame(int s) {
for (int i = 1; i <= s-1; i++)
if (graph[i][s]==1 && color[i]==color[s]) return 1;
return 0;
}
```
**时间复杂度**:O(4ⁿ)
> [!note] 教学提示
> 图着色问题是NP-hard问题,对于小规模地图可以用回溯法暴力搜索。实际应用中常用近似算法或启发式算法。
#### 2. 两台机器流水作业调度(Johnson算法)
设有 n 个作业需要在两台机器上加工,每个作业先在机器1上加工,然后在机器2上加工。
**参考答案:**
**Johnson算法步骤:**
1. 在加工时间矩阵中找最小元素
2. 若在机器1(上行)→ 排在最前面
3. 若在机器2(下行)→ 排在最后面
4. 划掉已排定的作业,重复
**最优顺序**:J4→J1→J3→J2→J5→J6,总加工时间:**43天**
```c
int job[6][2] = {{3,8},{12,10},{5,9},{2,6},{9,3},{11,1}};
int x[6], bestx[6], bestf = 32767;
int f1 = 0, f2[7] = {0};
void tryJob(int i) {
if (i == 6) {
for (int j = 0; j < 6; j++) bestx[j] = x[j];
bestf = f2[i];
} else {
for (int j = i; j < 6; j++) {
f1 += job[x[j]][0];
f2[i] = (f2[i-1] > f1 ? f2[i-1] : f1) + job[x[j]][1];
if (f2[i] < bestf) {
swap(x[i], x[j]);
tryJob(i + 1);
swap(x[i], x[j]); // 回溯
}
f1 -= job[x[j]][0];
}
}
}
```
```mermaid
flowchart LR
A["Time Matrix"] --> B{"Find Min Element"}
B -->|"Row 1 (Machine 1)"| C["Place at Front"]
B -->|"Row 2 (Machine 2)"| D["Place at End"]
C --> E["Remove & Repeat"]
D --> E
E -->|"All Scheduled"| F["Optimal Sequence"]
```
---
## 关联笔记
- [[算法设计与分析/试题册/试题1]]
- [[算法设计与分析/试题册/试题2]]
+322
View File
@@ -0,0 +1,322 @@
---
tags:
- 算法设计与分析
- 试题
- 武汉科技大学
create time: 2026-06-10 10:00
---
# 试题 5 — 武汉科技大学《算法设计与分析》
## 概述
- **课程**:算法设计与分析
- **学校**:武汉科技大学
- **题型**:单项选择题、判断题、简答题、程序填空题、算法设计与编程题
- **知识点**:递归复杂度、排序算法、图搜索(BFS/DFS)、动态规划、回溯法、四色问题
> [!tip] 学习建议
> 本试题与试题4内容高度相似,建议对比学习。重点关注 **程序填空题** 中的递归框架,以及 **四色地图着色** 和 **流水作业调度** 两道编程题。
## 正文
### 一、单项选择题(每题2分,共15题,30分)
**从备选的答案中选出合适的答案,并把答案标号写在答题纸中。**
1. 下列哪些不是算法的 3 要素( )。
- A. 操作
- B. 控制结构
- C. 数据结构
- D. 输入输出
2. 冒泡排序的时间复杂度为( )。
- A. O(n)
- B. O(n²)
- C. O(n³)
- D. O(nlogn)
3. 下列算法中错误的是( )。
- A. 算法的每一步骤必须有确切的含义
- B. 算法的时间复杂度与实现语言无关
- C. 对于特殊的输入,算法的时间复杂度可以是不固定的
- D. 算法的运行时间与编写程序的语言无关
4. 求 n 个数中的最小数,时间复杂度为( )。
- A. O(1)
- B. O(n)
- C. O(n²)
- D. O(nlogn)
5. 调用函数 `int fib(int n) { return (n>1 ? fib(n-1)+fib(n-2) : n); }` 时间复杂度是( )。
- A. O(n)
- B. O(n²)
- C. O(2ⁿ)
- D. 无递归调用
6. 栈是一种基于什么机制实现的数据结构?( )
- A. 先进先出
- B. 先进后出
- C. 随机存取
- D. 索引存取
7. 流程图中表示判断的符号是( )。
- A. 圆形
- B. 椭圆形
- C. 菱形
- D. 平行四边形
8. 深度优先遍历在搜索空间树上的搜索方式为( )。
- A. 广度优先
- B. 深度优先
- C. 最小耗费优先
- D. 综合优先
9. 下述算法中正确的是( )。
- A. 广度优先遍历算法只适合于无向图
- B. 广度优先遍历算法只适合于有向图
- C. 遍历一个无向图可能需要多次调用DFS或BFS
- D. 只需一次调用DFS或BFS即可遍历一个无向图
10. 以下关于迭代法的描述中,正确的是( )。
- A. 迭代算法在逻辑上总是可以转换为与它等价的递归算法
- B. 每个递归算法在逻辑上总是可以转换为与它等价的循环结构算法
- C. 迭代算法的可靠性比递归算法好
- D. 迭代算法的执行效率一定比递归算法好
11. ( )阶段是优化决策解决问题的过程。
- A. 贪心算法
- B. 动态规划
- C. 分支限界
- D. 迭代算法
12. 在算法的广度优先搜索策略中,一般采用的数据结构是( )。
13. 联欢晚会报数问题,凡是报3的人出列,编号为( )可以胜出。
- A. 27
- B. 33
- C. 48
- D. 144
14. 人工智能(AI)的英文全称是( )。
- A. Automatic Intelligence
- B. Automatic Information
- C. Artificial Intelligence
- D. Artificial Information
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
|------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | D | B | C | B | C | B | C | B | C | A | B | B | A | C |
> [!warning] 易错点
> 第1题:算法三要素是**操作、控制结构、数据结构**。第5题:斐波那契递归时间复杂度 O(2ⁿ)。第9题:无向图若有多个连通分量,需要多次调用BFS/DFS。
---
### 二、判断题(每题2分,共10题,20分)
**正确的在括号内填 √,错误的填 ×。**
1. 算法中的状态和步骤具有有穷性。( )
2. 一个算法应该适用于解决某类问题。( )
3. O(n²) 和 O(3n²+3) 的两个算法的时间复杂度相同。( )
4. 经验空间复杂度是指算法在执行过程中临时占用存储空间的大小。( )
5. 回溯法就是穷举法,所不同的是对一般问题回溯法比穷举法效率低。( )
6. 一个算法一般适用于一个特定类型的问题。( )
7. 动态规划适合求解具有重叠子问题性质的问题。( )
8. 贪心算法和动态规划法都用于求解最优问题,且在每一步只做一次决策。( )
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|------|---|---|---|---|---|---|---|---|
| 答案 | × | √ | √ | × | × | √ | √ | × |
---
### 三、简答题(每题10分,共2题,20分)
#### 1. 台阶问题
如果楼板上有 s 阶台阶,每次可以上一步1阶,也可以上一步2阶,设计算法计算共有多少种上法?要求写出递推公式。
**参考答案:**
设 f(n) 为上 n 阶台阶的方法数:
- f(1) = 1,f(2) = 2
- f(n) = f(n-1) + f(n-2),n ≥ 3
> [!tip] 关键理解
> 最后一步要么上1阶(有 f(n-1) 种方法),要么上2阶(有 f(n-2) 种方法),两者相加即为总方法数。这就是斐波那契数列的变体!
#### 2. 动态规划的基本思想步骤
**参考答案:**
1. **分析最优子结构**:将原问题分解为若干子问题
2. **定义状态**:确定状态变量
3. **建立状态转移方程**:确定状态之间的递推关系
4. **计算顺序**:自底向上递推或记忆化搜索
5. **构造最优解**:回溯构造最优方案
> [!important] 关键性质
> 动态规划适用于具有**最优子结构**和**重叠子问题**性质的问题。与分治法的区别:动态规划的子问题相互依赖,需要存储中间结果。
---
### 四、程序填空题(每空2分,2×10=20分)
#### 1. 素数判定
```c
try(int i) {
if (i <= 20) {
if (check1(i) && check2(i))
output(i); // (1) 输出结果
else
try(i+1);
}
}
check1(int x) {
for (int j = 2; j <= x-1; j++)
if (x % j == 0) return 0; // (2) 判断是否为素数
return 1;
}
check2(int x) {
for (int j = 2; j <= (x-1)/2; j++)
if (x % j == 0) return 0; // (3) 进一步筛选
return 1;
}
```
**(1)** `i <= 20`  **(2)** `x % j == 0`  **(3)** `0`
#### 2. 迷宫搜索
```c
search(int i, int j) {
for (int di = -1; di <= 1; di++)
for (int dj = -1; dj <= 1; dj++) {
if (maze[i+di][j+dj] == 1) { // (4) 可通行
maze[i+di][j+dj] = 2; // 标记已访问
search(i+di, j+dj);
}
}
maze[i][j] = 0; // (5) 回溯
}
check(int i, int j) {
if (i < 0 || i >= n || j < 0 || j >= m)
flag = 0;
else if (maze[i][j] == 0)
flag = 0;
else
flag = 1; // (6) 可通行
return flag;
}
```
**(4)** `1`  **(5)** `0`  **(6)** `1`
> [!note] 教学提示
> 迷宫搜索中,`maze[i][j]` 的含义:0=未访问/障碍,1=可通行,2=已访问。回溯时将状态恢复为0。
---
### 五、算法设计与编程题(每题15分,共2题,30分)
#### 1. 四色地图着色(回溯法)
图1是一个正在构造的四色地图,使用至多四种不同颜色对地图进行涂色,相同区域相邻颜色不同。
**参考答案:**
```c
int data[6][6] = {0}; // 邻接矩阵
int color[6] = {0};
void tryColor(int s) {
if (s > 6) { output(); return; }
for (int i = 1; i <= 4; i++) {
color[s] = i;
if (colorSame(s) == 0) tryColor(s + 1);
color[s] = 0;
}
}
int colorSame(int s) {
int flag = 0;
for (int i = 1; i <= s-1; i++)
if (data[i][s]==1 && color[i]==color[s]) flag = 1;
return flag;
}
```
**时间复杂度**:O(4ⁿ)
```mermaid
flowchart TD
A["Try Region s"] --> B["For color = 1 to 4"]
B --> C{"Adjacent Same Color?"}
C -->|"No"| D["Try Next Region (s+1)"]
D --> E{"All Regions Colored?"}
E -->|"Yes"| F["Output Solution"]
E -->|"No"| B
C -->|"Yes"| G["Backtrack: Try Next Color"]
```
#### 2. 两台机器流水作业调度(Johnson算法)
某厂有6个加工任务,在印刷车间和装订车间所需时间如下:
| 任务 | J1 | J2 | J3 | J4 | J5 | J6 |
|------|----|----|----|----|----|-----|
| 印刷 | 3 | 12 | 5 | 2 | 9 | 11 |
| 装订 | 8 | 10 | 9 | 6 | 3 | 1 |
**参考答案:**
**Johnson算法**:最优顺序 **J4→J1→J3→J2→J5→J6**,最短加工时间 **43天**
```c
int job[6][2] = {{3,8},{12,10},{5,9},{2,6},{9,3},{11,1}};
int x[6], bestx[6], bestf = 32767;
int f1 = 0, f2[7] = {0};
void tryJob(int i) {
if (i == 6) {
for (int j = 0; j < 6; j++) bestx[j] = x[j];
bestf = f2[i];
} else {
for (int j = i; j < 6; j++) {
f1 += job[x[j]][0];
f2[i] = (f2[i-1] > f1 ? f2[i-1] : f1) + job[x[j]][1];
if (f2[i] < bestf) {
swap(x[i], x[j]);
tryJob(i + 1);
swap(x[i], x[j]); // 回溯
}
f1 -= job[x[j]][0];
}
}
}
```
> [!tip] Johnson算法要点
> 1. 找矩阵中最小值
> 2. 若在机器1(上行)→ 排最前
> 3. 若在机器2(下行)→ 排最后
> 4. 划掉已排作业,重复直到排完
>
> 时间复杂度:O(nlogn)
---
## 关联笔记
- [[算法设计与分析/试题册/试题1]]
- [[算法设计与分析/试题册/试题2]]
- [[算法设计与分析/试题册/试题3]]
- [[算法设计与分析/试题册/试题4]]