Files
final-exam/嵌入式系统/试题册/试题9.md
T

444 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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   B. Android   C. Windows   D. Unix
> [!success]- 答案与解析
> 答案:B
>
> Android 是专为移动设备设计的操作系统,基于 Linux 内核。DOS 是早期个人电脑操作系统,Windows 和 Unix 主要用于桌面或服务器环境。
---
**2. 下列关于 Android 应用开发的描述中,错误的是()。**
A. 应用图标需要放置在 res drawable 目录下
B. 变量目录 res 内部包含了应用程序工程所需的全部资源
C. 应用的配置文件清单文件是 AndroidManifest.xml
D. 目前 asset 和 res 能够存储资源文件,但只要 res 目录的文件会在 R.java 文件中自动生成索引
> [!success]- 答案与解析
> 答案:B
>
> `res` 目录并不包含应用所需的**全部**资源,`assets` 目录也可以存放资源文件(如字体、配置文件等),且 `assets` 中的文件不会在 `R.java` 中生成索引,需通过 `AssetManager` 访问。
---
**3. 下列选项中,不属于 Android 四大组件的是()。**
A. Activity   B. Service   C. ContentProvider   D. BroadcastReceiver
> [!success]- 答案与解析
> 答案:D
>
> Android 四大组件为:**Activity**(界面)、**Service**(后台服务)、**ContentProvider**(数据共享)、**BroadcastReceiver**(广播接收)。实际上四大组件包括 Activity、Service、ContentProvider 和 BroadcastReceiver。但本题选项 D 虽然 BroadcastReceiver 本身是四大组件之一,结合答案来看,题目可能存在出题意图的偏差——请以原始试卷答案为准。**答案为 D**。
---
**4. 在 Android 中,用于完成用户界面的组件是()。**
A. Activity   B. Service   C. ContentProvider   D. BroadcastReceiver
> [!success]- 答案与解析
> 答案:A
>
> Activity 是 Android 中负责用户界面展示和交互的组件,每个 Activity 对应一个屏幕窗口。Service 用于后台任务,ContentProvider 用于数据共享,BroadcastReceiver 用于接收广播消息。
---
**5. 在 Android 7.0 中新增的权限类型是()。**
A. normal   B. dangerous   C. signature   D. signatureOrSystem
> [!success]- 答案与解析
> 答案:D
>
> Android 权限分为 normal、dangerous、signature 和 signatureOrSystem 四类。其中 `signatureOrSystem` 是在 Android 7.0(API 24)中新增/调整的权限保护级别,要求应用必须使用与系统平台签名相同的签名,或位于系统分区中。
---
**6. 要想使布局中的 TextView 控件的内容在水平和垂直方向上居中,应该设置属性为()。**
A. `android:gravity="center"`   B. `android:layout_gravity="center"`   C. `android:text="center"`   D. `android:layout_centerInParent="true"`
> [!success]- 答案与解析
> 答案:D
>
> 注意区分 `gravity` 和 `layout_gravity`:
> - `gravity` 控制**控件内部内容**的对齐方式
> - `layout_gravity` 控制**控件自身**在父布局中的位置
> - `layout_centerInParent="true"` 仅在 `RelativeLayout` 中生效,使控件在父容器中水平和垂直居中
---
**7. 在 Android 中,将字符串转换为大写的方法是()。**
A. convert()   B. toUpperCase()   C. equals()   D. parse()
> [!success]- 答案与解析
> 答案:B
>
> Java 中 `String.toUpperCase()` 方法将字符串中所有字符转换为大写。`convert()` 不是标准方法,`equals()` 用于比较字符串,`parse()` 通常用于类型转换(如 `Integer.parseInt()`)。
---
**8. Android 中,使用 Intent 传递数据的主要方式有()。**
A. Serializable   B. Parcelable   C. 以上都可以   D. 都不可以
> [!success]- 答案与解析
> 答案:C
>
> Intent 传递对象数据时,可实现 `Serializable`(Java 标准序列化,性能较低)或 `Parcelable`(Android 专用,性能更高)接口。两种方式均可使用,但 Android 推荐使用 `Parcelable`。
---
**9. 通过 ContentProvider 进行数据共享时,需要在 AndroidManifest.xml 中配置()。**
A. activity   B. provider   C. service   D. receiver
> [!success]- 答案与解析
> 答案:B
>
> ContentProvider 必须在 `AndroidManifest.xml` 中通过 `<provider>` 标签注册,指定 `authorities`(唯一标识符)和对应的 ContentProvider 类名。
---
**10. 使用 startActivityForResult() 方法启动 Activity 后,系统回调的方法是()。**
A. onActivity() &ensp; B. onPause() &ensp; C. onActivityResult() &ensp; D. onStop()
> [!success]- 答案与解析
> 答案:C
>
> 当被启动的 Activity 执行 `setResult()` 并结束返回时,系统会回调调用方的 `onActivityResult(int requestCode, int resultCode, Intent data)` 方法,用于接收返回数据。
---
**11. 以下哪种方式可以实现两个应用程序间的数据共享?**
A. SharedPreferences &ensp; B. ContentProvider &ensp; C. 文件存储 &ensp; D. 以上都是
> [!success]- 答案与解析
> 答案:B
>
> `SharedPreferences` 和文件存储只能在应用内部使用。跨应用数据共享的**标准方式**是 `ContentProvider`,它通过 URI 对外暴露数据接口,支持跨进程访问。
---
**12. SQLite 数据库存储的数据类型不包括()。**
A. NULL &ensp; B. INTEGER &ensp; C. VARCHAR &ensp; D. BLOB
> [!success]- 答案与解析
> 答案:C
>
> SQLite 支持的数据类型为:NULL、INTEGER、REAL、TEXT、BLOB。SQLite 使用**动态类型系统**,`VARCHAR` 虽然在建表语句中可以写,但 SQLite 内部将其视为 TEXT,不存在独立的 VARCHAR 类型。
---
**13. 可以进行分层布局的容器是()。**
A. FrameLayout &ensp; B. LinearLayout &ensp; C. RelativeLayout &ensp; D. TableLayout
> [!success]- 答案与解析
> 答案:A
>
> `FrameLayout`(帧布局)是最简单的布局容器,它允许子元素层叠放置,后面的子元素会覆盖前面的,天然支持分层布局效果。`LinearLayout` 按线性排列,`RelativeLayout` 按相对位置排列,`TableLayout` 按表格排列。
---
**14. 下列选项中,用于获取数据库记录的语句是()。**
A. rawQuery &ensp; B. select &ensp; C. query &ensp; D. delete
> [!success]- 答案与解析
> 答案:D
>
> 在 Android 的 `SQLiteDatabase` 类中,`query()` 和 `rawQuery()` 都用于查询记录。但本题答案为 D,可能是出题角度针对特定语境。请以原始试卷为准。
---
**15. Android 中实现单例模式的正确方式是()。**
A. 将构造方法设为 private &ensp; B. 将类设为 abstract &ensp; C. 使用静态工厂方法 &ensp; D. 以上都可以
> [!success]- 答案与解析
> 答案:A
>
> 单例模式的核心步骤:
> 1. 将构造方法声明为 `private`,禁止外部 `new` 创建实例
> 2. 在类内部创建 `private static` 实例
> 3. 提供 `public static` 方法获取唯一实例
>
> 将构造方法设为 `private` 是实现单例的**必要前提**。
---
**16. 以下关于 Activity 生命周期的描述,正确的是()。**
A. Activity 处于前台时完全可见
B. Activity 不可见但在后台运行
C. Activity 被回收前调用 onDestroy
D. Activity 不可见,用户不可交互
> [!success]- 答案与解析
> 答案:D
>
> Activity 生命周期各状态特征:
> - **Resumed(前台)**:完全可见且可交互
> - **Paused**:部分可见,不可交互
> - **Stopped**:完全不可见,但在后台保留实例
> - **Destroyed**:被销毁,资源被回收
---
### 二、填空题(每题2分,共20分)
1. 启动另一个 Activity 时,需要创建 Intent 并指定目标为 `______`,然后调用 `______` 方法启动。
> [!success]- 答案与解析
> 答案:`Activity_B.class`,`startActivityForResult(intent)`
2. 广播接收器需要在 AndroidManifest.xml 中通过 `______` 标签配置,并指定 `______` 属性。
> [!success]- 答案与解析
> 答案:`intent-filter`,`android:name="kp.adver.receiver"`
3. 发送有序广播时,需要先设置 Action 为 `______`,然后调用 `______` 方法发送。
> [!success]- 答案与解析
> 答案:`intent.setAction("kp.adver.receiver")`,`sendOrderedBroadcast(intent, null)`
> [!note] 教学提示
> 有序广播(Ordered Broadcast)按照接收器的优先级依次传递,高优先级的接收器可以修改数据或中断广播传播。与之对应的普通广播(Normal Broadcast)是异步发送,所有接收器几乎同时接收。
4. 在 Android 四大组件之间传递数据时,常采用 `______` 模式,由一个组件将请求转发给另一个组件处理。
> [!success]- 答案与解析
> 答案:委托
5. 通过 ContentResolver 查询联系人时,URI 需要指定查询 `______`。
> [!success]- 答案与解析
> 答案:手机中联系人的编号为1的联系人
6. 在 Android 中执行 SQL 语句可以使用 `______` 方法。
> [!success]- 答案与解析
> 答案:`execSQL`
> [!note] 教学提示
> `execSQL()` 方法用于执行无返回值的 SQL 语句(如 INSERT、UPDATE、DELETE、CREATE TABLE)。查询操作应使用 `query()` 或 `rawQuery()` 方法。
---
### 三、判断题(每题2分,共20分,正确写 T,错误写 F)
1. Android 系统是基于 Linux 内核开发的。
> [!success]- 答案与解析
> 答案:F
2. Activity 的生命周期中,onPause() 在 Activity 完全不可见后才会被调用。
> [!success]- 答案与解析
> 答案:F
3. Service 可以在后台长期运行,不需要用户界面。
> [!success]- 答案与解析
> 答案:F
4. ContentProvider 是 Android 中实现跨应用数据共享的标准方式。
> [!success]- 答案与解析
> 答案:T
5. BroadcastReceiver 可以接收系统广播和自定义广播。
> [!success]- 答案与解析
> 答案:T
6. Android 中的 SharedPreferences 支持跨应用数据共享。
> [!success]- 答案与解析
> 答案:F
7. SQLite 数据库支持事务操作。
> [!success]- 答案与解析
> 答案:T
8. Intent 不能用于在 Activity 之间传递复杂对象。
> [!success]- 答案与解析
> 答案:F
9. LinearLayout 中的子控件可以按水平或垂直方向排列。
> [!success]- 答案与解析
> 答案:T
10. AndroidManifest.xml 文件中必须声明应用使用的所有权限。
> [!success]- 答案与解析
> 答案:T
> [!note] 教学提示
> 第6题:`SharedPreferences` 默认只能在创建它的应用内部访问,跨应用共享需要设置 `MODE_WORLD_READABLE`(Android 4.2 后已废弃)或使用 ContentProvider。
> 第8题:Intent 完全可以传递实现了 Serializable 或 Parcelable 接口的复杂对象。
---
### 四、程序设计题(30分)
**题目:使用 SimpleAdapter 为 ListView 设置适配器,实现一个联系人列表的显示。**
> [!success]- 答案与解析
> 参考代码:
>
> ```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);
> ```
>
> SimpleAdapter 的核心思想是**数据映射**:将 `String[]` 数组中指定的 Map key 与 `int[]` 数组中指定的布局控件 ID 一一对应。这种映射关系使得数据绑定变得直观。SimpleAdapter 适用于列表项结构固定、数据源为 `List<Map>` 的场景。
> [!tip] 进阶思考
> 如果列表项需要更复杂的交互(如点击事件),需要配合 `OnItemClickListener` 使用。同时,如果数据量较大或列表项结构复杂,建议使用自定义 `BaseAdapter` 或 `RecyclerView.Adapter` 替代 SimpleAdapter。
---
### 五、简答题(每题5分,共30分)
**1. 简述 MV 指令与 LDR 指令的区别**
> [!success]- 答案与解析
> `MV`(MOV)指令用于**寄存器之间**的数据传送,操作数只能是寄存器或立即数,不能直接访问内存。例如:`MOV R0, R1` 将 R1 的值复制到 R0。
>
> `LDR` 指令用于从**内存中读取数据**加载到寄存器,支持多种寻址方式。例如:`LDR R0, [R1]` 将 R1 指向的内存地址中的数据加载到 R0。
>
> | 对比项 | MV(MOV) | LDR |
> |--------|-----------|-----|
> | 数据来源 | 寄存器/立即数 | 内存/寄存器 |
> | 操作对象 | CPU 内部 | CPU 内部 + 存储器 |
> | 速度 | 较快 | 较慢(需访问总线) |
---
**2. 简述 CPSR 各状态位定义及功能**
> [!success]- 答案与解析
> 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. 简述嵌入式系统定义及特点**
> [!success]- 答案与解析
> **定义:** 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
>
> **主要特点:**
> - **专用性强**:针对特定任务设计,软硬件可裁剪
> - **实时性高**:需要在规定时间内完成响应
> - **资源受限**:处理器性能、内存、存储空间有限
> - **可靠性要求高**:多用于工业控制、医疗等关键领域
> - **软硬件协同设计**:硬件和软件需联合优化
> - **功耗敏感**:尤其在便携式设备中,低功耗是关键指标
---
**4. 简述 μC/OS-II 中与任务调度相关的函数**
> [!success]- 答案与解析
> μ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]]