跳到正文
HeZzz's Notes
返回

嵌入式系统设计与应用-2025sp-回忆版

在 Github 上编辑此页

嵌入式系统设计与应用 2025 春季学期的回忆版真题整理,来源于计算机速通之家 | QQ 群号:468081841

本文连载于嵌入式系统设计与应用-2025sp-回忆版 | HeZzz.

答案来源于 GPT-5.5 和 NotebookLM,并由我校对,可能不完全准确,仅供参考。

🙇‍♂️🙇‍♂️🙇‍♂️时间仓促,有不足之处烦请及时告知。邮箱hez2z@foxmail.com 或者在 速通之家 群里 @9¾

一、简答题(共 6 题,每题 5 分)

1、简述 ARM 指令集 6 种移位操作各自的作用

LSL:逻辑左移,空出的最低有效位用 0 填充。

LSR:逻辑右移,空出的最高有效位用 0 填充。

ASL:算术左移,由于左移空出的有效位用 0 填充,因此它与 LSL 同义。

ASR:算术右移,算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用 0 填充,如果是负数用 1 填充。

ROR:循环右移,移出的字的最低有效位依次填入空出的最高有效位。

RRX:带扩展的循环右移。将寄存器的内容循环右移1位,空位用原来 C 标志位填充.

2、简述 S5PV210 中 GPIO 的作用

GPIO(General-Purpose Input/Output Ports)全称是通用编程I/O端口。它们是CPU的引脚,可以通过它们向外输出高低电平,或者读入引脚的状态,这里的状态也是通过高电平或低电平来反应的,所以GPIO接口技术可以说是CPU众多接口技术中最为简单、常用的一种。

每个GPIO端口至少需要两个寄存器:

控制和数据寄存器的每一位和GPIO的硬件引脚相对应,由控制寄存器设置每一个引脚的数据流向,数据寄存器设置引脚输出的高低电平或读取引脚上的电平。

3、请说出嵌入式系统有哪 2 种状态寄存器,它们各自有什么作用;请回答现在市面上有哪些主流的 ARM 处理器系列

ARM处理器有两类程序状态寄存器:1 个当前程序状态寄存器 CPSR 和 6 个备份程序状态寄存器 SPSR。

它们的主要功能是:

每一种处理器模式下使用专用的备份程序状态寄存器。

当特定的中断或异常发生时,处理器切换到对应的工作模式下,该模式下的备份程序状态寄存器 SPSR 保存当前程序状态寄存器 CPSR 的内容。

当异常处理程序返回时,再将其内容从备份程序状态寄存器 SPSR 回复到当前程序状态寄存器 CPSR。

目前 ARM 处理器主要分为经典系列和 Cortex 系列:

4、简述嵌入式操作系统有哪些作用;嵌入式 linux 操作系统有哪些特点

作用: 屏蔽硬件差异(补平界面):隐藏底层硬件的具体细节,为上层应用提供统一、抽象的接口,使开发者无需考虑硬件差异,专注于应用逻辑开发。

特点:

5、ARM-Linux 进程调度依据分为哪几个部分

Arm-Linux 选择最值得运行的进程时,其调度依据主要分为以下四个部分:

这些依据共同决定了哪个进程将获得 CPU 资源。既然提到了调度依据,你想进一步了解 Linux 内核中执行调度的核心函数 schedule() 的具体工作流程吗?

6、简述大端存储器组织是什么结构

在大端存储(Big-endian)模式中,数据的低地址存放的是字数据的高字节,而高地址存放的是字数据的低字节。

以 32 位字数据 0x12345678 为例,其在大端模式下的分布如下:

这种组织结构可以简记为“高对低,低对高”。与之相对的是 ARM 处理器默认常用的小端模式(低字节对低地址),需要我对比一下这两者的差异吗?


二、看语句写作用(共 5 题,每题 2 分)

  1. MRS R1,CPSR

    作用:将当前程序状态寄存器 CPSR 的内容读出,并送入寄存器 R1

    详细说明:

    • MRS 的全称可以理解为 Move PSR to Register,即“把状态寄存器内容送到通用寄存器”。
    • 常见用法是:
      • MRS Rd, CPSR
      • MRS Rd, SPSR
    • 也就是说,它的作用是“读状态寄存器”。
    • 这里的 CPSR 是当前程序状态寄存器,里面保存了:
      • 条件标志位;
      • 中断允许/禁止位;
      • 当前处理器工作模式等信息。
    • 在这条语句里:
      • R1 是目标寄存器;
      • CPSR 是源操作数。
    • 因此这句话的具体作用就是:
      • 把当前 CPSR 的值读出来,保存到 R1 中,方便后续查看、修改或恢复处理器状态。
  2. ORR R1,[R1,#1]

    作用:对 R1 的内容按位或上常数 1,并将结果保存回 R1

    详细说明:

    • ORR 是按位或指令,作用是对两个操作数逐位进行逻辑或运算。
    • 常见用法是:
      • ORR Rd, Rn, Operand2
    • 它表示:
      • Rd = Rn OR Operand2
    • 本题这条语句按常见考试写法应理解为:
      • ORR R1, R1, #1
    • 其中:
      • R1 原本保存一个数值;
      • #1 表示立即数 1。
    • 因为 1 的二进制最低位是 1,所以把 R11 做按位或之后,会产生这样的效果:
      • R1 的最低位被强制置为 1;
      • 其他位保持原值不变。
    • 因此在这里,这条语句的具体作用就是:
      • R1 的最低位置 1,再把结果写回 R1
    • 这种写法常用于:
      • 设置某个控制位;
      • 打开某个标志位;
      • 对寄存器进行位操作配置。
  3. MSR CPSR,R1

    作用:将寄存器 R1 中的内容写回当前程序状态寄存器 CPSR

    详细说明:

    • MSR 的全称可以理解为 Move to Status Register,即“把数据写入状态寄存器”。
    • 常见用法是:
      • MSR CPSR, Rm
      • MSR SPSR, Rm
    • 它和上一题的 MRS 正好相对:
      • MRS 是把状态寄存器读到通用寄存器;
      • MSR 是把通用寄存器内容写回状态寄存器。
    • 在这条语句里:
      • R1 中保存着准备写入的状态值;
      • CPSR 是被修改的目标状态寄存器。
    • 因此这条语句的具体作用就是:
      • R1 中的内容写入 CPSR,从而恢复或改变当前处理器状态。
    • 它通常可用于:
      • 恢复先前保存的状态;
      • 修改中断使能位;
      • 改变条件标志位;
      • 切换处理器模式。
  4. BLX FUNC1

    作用:带链接跳转到子程序 FUNC1 执行,并可根据目标状态切换指令集状态。

    详细说明:

    • BLX 可以拆开理解:
      • BL 是 Branch with Link,表示“带返回地址保存的跳转”;
      • X 表示在跳转时还可能发生指令集状态切换。
    • 常见用法是:
      • BLX label
      • BLX Rm
    • 它的核心作用有两个:
      • 跳转到目标子程序执行;
      • 把返回地址保存到 LR(即 R14)中。
    • 这样子程序执行完后,就可以通过 BX LR 等方式返回调用点。
    • 与普通 B 指令不同:
      • B 只是单纯跳转;
      • BLX 既跳转又保存返回地址,还可能切换 ARM/Thumb 状态。
    • 在这里,这条语句的具体作用就是:
      • 调用子程序 FUNC1
      • 同时把当前下一条指令地址保存到 LR 中;
      • 如有需要还会切换到目标函数对应的指令集状态执行。
  5. STRH R4,[R1,R2]!

    作用:将寄存器 R4 的低 16 位数据作为半字存入由 R1 + R2 形成的内存地址中,并把更新后的地址写回 R1

    详细说明:

    • STRH 是 Store Register Halfword,表示“存储半字”。
    • 半字的长度是 16 位,也就是 2 个字节。
    • 常见用法是:
      • STRH Rd, [Rn]
      • STRH Rd, [Rn, #offset]
      • STRH Rd, [Rn, Rm]!
    • 本题中的 [R1, R2]! 属于基址加偏移寻址,并带写回功能:
      • 有效地址 = R1 + R2
      • ! 表示写回,即访存后把新地址写回基址寄存器
    • 在这条语句里:
      • 被存入内存的数据来自 R4 的低 16 位;
      • 存储地址由 R1 + R2 计算得到;
      • 执行完后 R1 会更新为 R1 + R2
    • 因此它的具体作用可以分成三步理解:
      1. 先计算目标地址 R1 + R2
      2. R4 的低 16 位写到该地址中;
      3. 再把这个更新后的地址写回 R1
    • 这种写法常用于:
      • 数组或缓冲区访问;
      • 连续写入多个半字数据;
      • 带指针自增效果的存储操作。

三、程序题(共 2 题,第一题 5 分,第二题 12 分)

1、给你一段冒泡排序程序挖空,让你填 5 个空

题目:无符号数据字块存储在 0x400004,无符号数据字块数目字存储在 0x400000

(回忆者注:别问我为什么要用这么复杂的表述方法,我当初看了半天才看懂这是讲的什么,你们也必须感受我的痛苦!/(ㄒ oㄒ)/~~)

代码如下

AREA  SORT,CODE,READONLY
ENTRY
START
MOV  R1,#0x400000
LP     SUBS  R1,R1,#1
       BEQ  EXIT
       MOV  R7,R1
       LDR  R0,= [填空 1]
LP1    LDR  R2,[R0],#4
       LDR  R3,[R0]
       CMP  R2,R3
       [填空 2]
       [填空 3]
       SUBS R7,R7,#1
       BNE  [填空 4]
       B  [填空 5]
EXIT   END

答案

详细说明:

这道题本质上是在考:

  1. 冒泡排序的基本思想;
  2. ARM 汇编中的循环结构;
  3. 条件执行指令;
  4. 数组顺序访问时的地址更新方式。

程序整体功能

这段程序的作用是:
对存放在内存中的一组无符号数进行冒泡排序。

每条关键语句的作用

MOV R1, #0x400000
SUBS R1, R1, #1
BEQ EXIT
MOV R7, R1
LDR R0, =0x400004

为什么填空 1 是 0x400004

因为题目已经说明:

所以 R0 要指向第一个数据单元,填:

LDR R2, [R0], #4
LDR R3, [R0]

因此,这两句合起来的作用是:

CMP R2, R3

为什么填空 2 是 STRLO R3, [R0,#-4]

[R0,#-4] 的含义是:

所以:

表示:

也就是说:

为什么填空 3 是 STRLO R2, [R0]

这句与上一句配合完成交换:

所以:

表示:

这样两句一起就完成了相邻两个元素的交换。

为什么填空 4 是 LP1

SUBS R7, R7, #1
BNE LP1

因此填空 4 应该是:

表示继续做下一次相邻元素比较。

为什么填空 5 是 LP

当内层循环结束后,说明一趟冒泡完成了。
此时应返回外层循环,开始下一趟扫描。

所以:

表示回到外层循环入口继续执行。

因此填空 5 应该是:

这段程序的执行逻辑

可以按下面顺序理解:

  1. 外层循环控制总共要做多少趟冒泡;
  2. 每一趟开始时,把数组首地址重新装入 R0
  3. 内层循环每次取出两个相邻元素:
    • 前一个放入 R2
    • 后一个放入 R3
  4. 比较 R2R3
  5. 如果需要交换,就把它们写回相反的位置;
  6. 内层循环结束后,完成一趟冒泡;
  7. 外层循环继续,直到所有数据有序。

考场可直接写的简洁版

这段程序实现的是冒泡排序。
0x400000 存数据个数,0x400004 开始存数据内容,所以填空 1 为 0x400004
程序每次取出两个相邻元素到 R2R3 中比较,若满足交换条件,则用 STRLO R3,[R0,#-4]STRLO R2,[R0] 交换两者位置,所以填空 2、3 如上。
内层循环结束后跳回 LP1 继续比较,因此填空 4 为 LP1;一趟结束后返回外层循环 LP,因此填空 5 为 LP

2. 给定一个初始地址为 0x400000 的有 100 个单元的有符号字符串,要求将字符串内部所有的所有大写字母转为小写字母,其他字符不变;(要求使用汇编语言)

参考答案:

AREA FUNC1, CODE, READONLY
ENTRY
START
    LDR   R0, =0x400000      ; R0 指向字符串首地址
    MOV   R1, #100           ; R1 作为循环计数器
    MOV   R2, #'A'           ; 大写字母下界
    MOV   R3, #'Z'           ; 大写字母上界
    MOV   R5, #32            ; 'a' - 'A' = 32

LOOP
    LDRB  R4, [R0]           ; 读当前字符
    CMP   R4, R2
    BLT   NEXT               ; 小于 'A',不是大写字母
    CMP   R4, R3
    BGT   NEXT               ; 大于 'Z',不是大写字母
    ADD   R4, R4, R5         ; 转为小写
    STRB  R4, [R0]           ; 写回原地址

NEXT
    ADD   R0, R0, #1         ; 指向下一个字符
    SUBS  R1, R1, #1         ; 计数减 1
    BNE   LOOP               ; 未处理完则继续

STOP
    B     STOP
END

详细说明:

这道题主要考查:

  1. 字符串逐字节访问;
  2. ASCII 码范围判断;
  3. ARM 中 LDRBSTRB 的使用;
  4. 用循环处理固定长度数组。

程序整体功能

题目要求:

因此整个程序的思路是:

  1. 用一个寄存器保存字符串首地址;
  2. 用一个计数器记录还剩多少字符没处理;
  3. 每次读出 1 个字节;
  4. 判断这个字节是否在 'A''Z' 之间;
  5. 如果是,就加上 32 变成小写;
  6. 写回原地址;
  7. 指针后移,继续处理下一个字符。

每条关键语句的作用

LDR R0, =0x400000
MOV R1, #100
MOV R2, #'A'
MOV R3, #'Z'
MOV R5, #32
LDRB R4, [R0]

这句的作用是:

CMP R4, R2
BLT NEXT
CMP R4, R3
BGT NEXT

因此这两次比较合起来就在判断:

ADD R4, R4, R5

例如:

STRB R4, [R0]
ADD R0, R0, #1
SUBS R1, R1, #1
BNE LOOP

程序执行逻辑

整段程序可以概括为:

  1. 初始化指针、计数器和比较边界;
  2. 每次读入一个字符;
  3. 判断它是不是大写字母;
  4. 如果是,就转成小写并写回;
  5. 如果不是,就原样跳过;
  6. 指针后移,继续处理;
  7. 共处理 100 次后结束。

为什么要用 LDRB/STRB

因为这里处理的是“字符串”,本质上是字符数组。

如果误用 LDR/STR,就会按 4 字节读写,破坏字符串内容。

为什么判断范围是 A~Z

因为题目要求只把大写字母转成小写,其他字符不变。
所以必须先判断该字符是否属于大写字母区间:

只有处在这个区间内的字符才执行加 32 转换。

回顾

本题可用循环逐字节扫描字符串实现。
先令 R0 指向 0x400000R1=100 作为计数器,再以 R2='A'R3='Z' 作为判断区间。
循环中用 LDRB 读取当前字符,若字符在 A~Z 范围内,则执行 ADD R4, R4, #32 将其转为小写,再用 STRB 写回;否则保持不变。
每次处理完后 R0 加 1,R1 减 1,直到 100 个字符全部处理完成。


四、回答题(共 4 题,每题 5 分)

1、简述嵌入式系统硬件基本结构;简述嵌入式系统软件的基本结构

根据提供的资料,嵌入式系统的硬件与软件基本结构如下:

1. 硬件基本结构

嵌入式硬件以嵌入式处理器为中心,通过数据线、地址线和控制信号连接以下核心部件:

2. 软件基本结构

嵌入式软件通常由四个层面组成,从底层到高层依次为:

对于复杂的系统(如 ARM-Linux),还会包含 BootLoader 作为开机程序,负责为操作系统准备软硬件环境。

2、请说出 BootLoader 的作用

BootLoader 是嵌入式系统的开机引导程序,其核心作用是为操作系统或后续程序的运行准备好软硬件环境

具体职责包括:

它在功能上对应于通用 PC 中的 BIOS,是系统加电复位后 CPU 执行的第一段程序。

3、请简要说明嵌入式协同设计开发流程

flowchart TD
    A[系统定义] --> B[可行性分析]
    B --> C[需求分析]
    C --> D[系统总体设计]
    D --> E[硬件设计]
    D --> F[软件设计]
    E --> G[硬件测试]
    F --> H[软件测试]
    G --> I[软硬件集成、测试]
    H --> I
    I --> J{符合要求}
    J -- 是 --> K([开发结束])
    J -- 否 --> D

嵌入式协同设计开发流程是一个迭代的过程,主要包括以下阶段:

  1. 前期准备
    • 系统定义:提出目标系统的初步方案。
    • 可行性分析:论证技术与经济上的实现可能。
    • 需求分析:确立系统必须满足的功能与性能指标。
  2. 核心决策
    • 系统总体设计:这是整个流程的分水岭。在此阶段进行软硬件划分(确定功能由电路还是代码实现)、处理器选型及操作系统选择。
  3. 并行设计与单元测试
    • 硬件/软件设计:根据划分结果,两个团队独立且并行地开展工作。
    • 硬件/软件测试:分别对设计出的单板或程序进行初步的功能验证。
  4. 集成与反馈
    • 软硬件集成、测试:将两者结合,对整个产品进行全面的集成测试
    • 符合要求判断:若测试通过,则开发结束;若不符合要求,流程将**回溯到“系统总体设计”**重新调整划分或方案。

这种流程的特点是“先划分、后独立开发”。你想了解现代协同设计是如何通过“系统级仿真建模”来减少最后一步回溯风险的吗?

4、简述 ARM-Linux 系统调用原理及其作用

ARM-Linux 系统调用是连接用户空间与内核空间的桥梁,其原理与作用如下:

1. 系统调用原理

2. 系统调用的作用


在 Github 上编辑此页
分享这篇资料:

下一篇
嵌入式系统设计与应用-2026sp-期中