1. 嵌入式系统概述
嵌入式系统是以应用为中心、以计算机技术为基础、软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它是现代电子设备的核心大脑,从智能手表到工业机器人,从路由器到自动驾驶汽车,都离不开嵌入式系统的支撑。
核心定义:嵌入式系统 = 专用计算机硬件 + 固化软件(固件),完成特定任务,不提供通用计算能力。
1.1 嵌入式系统的组成
一个完整的嵌入式系统由硬件平台和软件平台两大部分构成。硬件提供物理载体,软件负责逻辑控制与数据处理。
| 层次 | 组成模块 | 典型代表 | 功能说明 |
|---|---|---|---|
| 硬件层 | 中央处理器(CPU/MPU/MCU) | ARM Cortex-A/M、RISC-V、x86 | 执行指令、运算与控制 |
| 硬件层 | 存储器 | Flash、SRAM、DDR SDRAM | 存储程序代码与运行数据 |
| 硬件层 | 外设接口 | GPIO、UART、I2C、SPI、USB | 与外部设备通信与控制 |
| 硬件层 | 电源管理 | PMIC、LDO、DC-DC | 提供稳定电压与功耗控制 |
| 软件层 | 固件/Bootloader | U-Boot、TF-A | 硬件初始化、引导操作系统 |
| 软件层 | 操作系统内核 | Linux、FreeRTOS、RT-Thread | 任务调度、资源管理、驱动框架 |
| 软件层 | 设备驱动程序 | GPIO驱动、I2C驱动、SPI驱动 | 操作硬件外设的软件接口 |
| 软件层 | 应用程序 | 用户业务逻辑代码 | 实现具体产品功能 |
1.2 嵌入式系统的特点
与通用计算机(如 PC、服务器)相比,嵌入式系统具有以下显著特征:
- 专用性强:针对特定应用场景设计,软硬件高度定制,不追求通用性。
- 资源受限:处理器性能、内存容量、存储空间通常远小于通用计算机,需要精细优化。
- 实时性要求:许多嵌入式系统必须在规定时间内对外部事件做出响应(如汽车安全气囊、工业控制)。
- 低功耗设计:电池供电设备(如 IoT 传感器、可穿戴设备)对功耗有苛刻限制。
- 高可靠性与稳定性:系统一旦部署,通常需要 7×24 小时不间断运行,故障容忍度极低。
- 软硬件协同设计:硬件选型与软件开发紧密耦合,驱动开发是软硬件交互的关键环节。
- 成本敏感:消费类电子产品对 BOM(物料清单)成本控制极为严格。
驱动开发视角:嵌入式系统的资源受限特性要求驱动代码必须高效、精简。例如,GPIO 中断处理函数应尽可能短,避免在中断上下文中执行耗时操作。
1.3 嵌入式系统的应用领域
嵌入式系统已渗透到国民经济的各个领域,以下是主要应用场景及典型产品:
| 应用领域 | 典型产品/设备 | 核心嵌入式技术 | 驱动开发关注点 |
|---|---|---|---|
| 消费电子 | 智能手机、智能手表、智能音箱、机顶盒 | SoC、Linux/Android、多媒体编解码 | 触摸屏驱动、音频驱动、电源管理驱动 |
| 工业控制 | PLC、工业机器人、数控机床、传感器节点 | 实时操作系统、现场总线、PLC 控制逻辑 | GPIO 控制、CAN 驱动、ADC 驱动 |
| 汽车电子 | ECU、ADAS 系统、车载信息娱乐系统、T-Box | QNX、AUTOSAR、Linux、功能安全 | GPIO 控制、SPI/CAN 驱动、摄像头驱动 |
| 医疗设备 | 心电监护仪、CT 扫描仪、血糖仪、呼吸机 | 高可靠性 RTOS、医疗认证、数据加密 | 传感器驱动、显示驱动、通信接口驱动 |
| 物联网(IoT) | 智能家居网关、环境监测节点、资产追踪器 | 低功耗 MCU、无线协议栈(BLE/WiFi/LoRa) | GPIO 控制、无线模块驱动、低功耗管理 |
| 航空航天与国防 | 无人机飞控、卫星载荷、雷达系统 | VxWorks、RT-Linux、抗辐射硬件 | 高可靠性驱动、冗余设计、实时中断处理 |
1.4 嵌入式系统与 Linux 驱动开发的关系
Linux 操作系统因其开源、稳定、支持广泛的特性,已成为嵌入式系统的主流选择。在嵌入式 Linux 系统中,设备驱动程序是操作系统内核与硬件外设之间的桥梁。
驱动开发的核心任务:编写内核模块,实现对硬件寄存器的读写操作,并将硬件功能以标准接口(如 /dev 设备文件、sysfs 属性文件)暴露给用户空间应用程序。
以 GPIO 控制为例,驱动开发流程通常包括:
- 硬件分析:阅读芯片手册,确定 GPIO 控制器的寄存器地址、位定义与操作时序。
- 设备树配置:在设备树(Device Tree)中描述 GPIO 控制器的硬件资源(基地址、中断号、引脚复用)。
- 驱动编写:实现 probe/remove 函数、file_operations 结构体(open/read/write/ioctl),操作 GPIO 寄存器。
- 编译与加载:使用交叉编译工具链编译驱动模块,通过 insmod/modprobe 加载到内核。
- 用户空间测试:编写应用程序通过 /dev/gpioX 或 sysfs 接口控制 GPIO 输出高低电平或读取输入状态。
// 一个极简的 GPIO 输出控制驱动框架(伪代码)
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/fs.h>
#define GPIO_PIN 17 // 假设使用 GPIO17
static int gpio_drv_open(struct inode *inode, struct file *filp) {
gpio_direction_output(GPIO_PIN, 0); // 设置为输出,初始低电平
return 0;
}
static ssize_t gpio_drv_write(struct file *filp, const char __user *buf,
size_t count, loff_t *f_pos) {
char value;
if (copy_from_user(&value, buf, 1))
return -EFAULT;
gpio_set_value(GPIO_PIN, value & 0x01); // 设置 GPIO 电平
return count;
}
static struct file_operations gpio_fops = {
.owner = THIS_MODULE,
.open = gpio_drv_open,
.write = gpio_drv_write,
};
static int __init gpio_drv_init(void) {
// 注册字符设备、申请 GPIO 资源
return 0;
}
static void __exit gpio_drv_exit(void) {
// 释放 GPIO 资源、注销设备
}
module_init(gpio_drv_init);
module_exit(gpio_drv_exit);
MODULE_LICENSE("GPL");
注意事项:实际驱动开发中,必须处理并发访问、中断上下文、电源管理、设备树匹配等复杂问题。本课程后续章节将逐一深入讲解。
1.5 本章小结
嵌入式系统是软硬件高度集成的专用计算机系统,具有专用性强、资源受限、实时性要求高等特点。其应用覆盖消费电子、工业控制、汽车电子、医疗、物联网和航空航天等关键领域。Linux 驱动开发是嵌入式系统开发的核心技能,而 GPIO 控制则是驱动开发的最佳入门实践——它涉及寄存器操作、设备树配置、内核模块编写等基础技术,是理解更复杂驱动(I2C、SPI、USB)的基石。