--- 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 **答案: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   B. Service   C. ContentProvider   D. BroadcastReceiver **答案:D** > [!note] 教学提示 > Android 四大组件为:**Activity**(界面)、**Service**(后台服务)、**ContentProvider**(数据共享)、**BroadcastReceiver**(广播接收)。实际上四大组件包括 Activity、Service、ContentProvider 和 BroadcastReceiver。但本题选项 D 虽然 BroadcastReceiver 本身是四大组件之一,结合答案来看,题目可能存在出题意图的偏差——请以原始试卷答案为准。**答案为 D**。 --- **4. 在 Android 中,用于完成用户界面的组件是()。** A. Activity   B. Service   C. ContentProvider   D. BroadcastReceiver **答案:A** > [!tip] 解析 > Activity 是 Android 中负责用户界面展示和交互的组件,每个 Activity 对应一个屏幕窗口。Service 用于后台任务,ContentProvider 用于数据共享,BroadcastReceiver 用于接收广播消息。 --- **5. 在 Android 7.0 中新增的权限类型是()。** A. normal   B. dangerous   C. signature   D. signatureOrSystem **答案:D** > [!tip] 解析 > 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"` **答案:D** > [!note] 教学提示 > 注意区分 `gravity` 和 `layout_gravity`: > - `gravity` 控制**控件内部内容**的对齐方式 > - `layout_gravity` 控制**控件自身**在父布局中的位置 > - `layout_centerInParent="true"` 仅在 `RelativeLayout` 中生效,使控件在父容器中水平和垂直居中 --- **7. 在 Android 中,将字符串转换为大写的方法是()。** A. convert()   B. toUpperCase()   C. equals()   D. parse() **答案:B** > [!tip] 解析 > Java 中 `String.toUpperCase()` 方法将字符串中所有字符转换为大写。`convert()` 不是标准方法,`equals()` 用于比较字符串,`parse()` 通常用于类型转换(如 `Integer.parseInt()`)。 --- **8. Android 中,使用 Intent 传递数据的主要方式有()。** A. Serializable   B. Parcelable   C. 以上都可以   D. 都不可以 **答案:C** > [!tip] 解析 > Intent 传递对象数据时,可实现 `Serializable`(Java 标准序列化,性能较低)或 `Parcelable`(Android 专用,性能更高)接口。两种方式均可使用,但 Android 推荐使用 `Parcelable`。 --- **9. 通过 ContentProvider 进行数据共享时,需要在 AndroidManifest.xml 中配置()。** A. activity   B. provider   C. service   D. receiver **答案:B** > [!note] 教学提示 > ContentProvider 必须在 `AndroidManifest.xml` 中通过 `` 标签注册,指定 `authorities`(唯一标识符)和对应的 ContentProvider 类名。 --- **10. 使用 startActivityForResult() 方法启动 Activity 后,系统回调的方法是()。** A. onActivity()   B. onPause()   C. onActivityResult()   D. onStop() **答案:C** > [!tip] 解析 > 当被启动的 Activity 执行 `setResult()` 并结束返回时,系统会回调调用方的 `onActivityResult(int requestCode, int resultCode, Intent data)` 方法,用于接收返回数据。 --- **11. 以下哪种方式可以实现两个应用程序间的数据共享?** A. SharedPreferences   B. ContentProvider   C. 文件存储   D. 以上都是 **答案:B** > [!note] 教学提示 > `SharedPreferences` 和文件存储只能在应用内部使用。跨应用数据共享的**标准方式**是 `ContentProvider`,它通过 URI 对外暴露数据接口,支持跨进程访问。 --- **12. SQLite 数据库存储的数据类型不包括()。** A. NULL   B. INTEGER   C. VARCHAR   D. BLOB **答案:C** > [!tip] 解析 > SQLite 支持的数据类型为:NULL、INTEGER、REAL、TEXT、BLOB。SQLite 使用**动态类型系统**,`VARCHAR` 虽然在建表语句中可以写,但 SQLite 内部将其视为 TEXT,不存在独立的 VARCHAR 类型。 --- **13. 可以进行分层布局的容器是()。** A. FrameLayout   B. LinearLayout   C. RelativeLayout   D. TableLayout **答案:A** > [!note] 教学提示 > `FrameLayout`(帧布局)是最简单的布局容器,它允许子元素层叠放置,后面的子元素会覆盖前面的,天然支持分层布局效果。`LinearLayout` 按线性排列,`RelativeLayout` 按相对位置排列,`TableLayout` 按表格排列。 --- **14. 下列选项中,用于获取数据库记录的语句是()。** A. rawQuery   B. select   C. query   D. delete **答案:D** > [!tip] 解析 > 在 Android 的 `SQLiteDatabase` 类中,`query()` 和 `rawQuery()` 都用于查询记录。但本题答案为 D,可能是出题角度针对特定语境。请以原始试卷为准。 --- **15. Android 中实现单例模式的正确方式是()。** A. 将构造方法设为 private   B. 将类设为 abstract   C. 使用静态工厂方法   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> listItems = new ArrayList<>(); for (int i = 0; i < names.length; i++) { Map 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) // 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` 的场景。 > [!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]]