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驱动 操作硬件外设的软件接口
软件层 应用程序 用户业务逻辑代码 实现具体产品功能
嵌入式系统组成结构图 硬件平台 软件平台 CPU / MPU / MCU 存储器 外设接口 电源管理 Bootloader 操作系统内核 设备驱动程序 应用程序 关键说明: • 硬件层是嵌入式系统的物理基础,决定了系统的性能上限与功耗特性。 • 软件层通过驱动程序与硬件交互,Linux 内核驱动是连接硬件与应用的桥梁。 • 本课程重点:在 Linux 环境下编写 GPIO 设备驱动,实现对外部硬件的控制。

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、抗辐射硬件 高可靠性驱动、冗余设计、实时中断处理
嵌入式系统六大应用领域 嵌入式系统 Linux 驱动开发核心 消费电子 手机/手表/音箱 工业控制 PLC/机器人/传感器 汽车电子 ECU/ADAS/T-Box 医疗设备 监护仪/CT/呼吸机 物联网 IoT 智能家居/环境监测 航空航天 无人机/卫星/雷达 无论哪个领域,GPIO 都是最基础、最常用的外设接口,掌握 GPIO 驱动开发是嵌入式 Linux 开发的入门必修课。

1.4 嵌入式系统与 Linux 驱动开发的关系

Linux 操作系统因其开源、稳定、支持广泛的特性,已成为嵌入式系统的主流选择。在嵌入式 Linux 系统中,设备驱动程序是操作系统内核与硬件外设之间的桥梁。

驱动开发的核心任务:编写内核模块,实现对硬件寄存器的读写操作,并将硬件功能以标准接口(如 /dev 设备文件、sysfs 属性文件)暴露给用户空间应用程序。

以 GPIO 控制为例,驱动开发流程通常包括:

  1. 硬件分析:阅读芯片手册,确定 GPIO 控制器的寄存器地址、位定义与操作时序。
  2. 设备树配置:在设备树(Device Tree)中描述 GPIO 控制器的硬件资源(基地址、中断号、引脚复用)。
  3. 驱动编写:实现 probe/remove 函数、file_operations 结构体(open/read/write/ioctl),操作 GPIO 寄存器。
  4. 编译与加载:使用交叉编译工具链编译驱动模块,通过 insmod/modprobe 加载到内核。
  5. 用户空间测试:编写应用程序通过 /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)的基石。