第1章 嵌入式系统概述
各位同学,咱们这门课讲的是BSP移植和内核裁剪。在动手之前,我觉得有必要先把嵌入式系统这个老本行聊透。你想想看,如果连系统长什么样、由什么组成、有什么脾气都不清楚,后面做移植和裁剪就容易跑偏。
我刚开始做嵌入式那会儿,也犯过这种错——拿到一块开发板就急着改代码,结果连Flash分区都没搞明白,折腾了两周才发现是启动方式选错了。嗯,从那以后我养成了一个习惯:先花半天把系统架构理清楚,再动手。
1.1 嵌入式系统定义
嵌入式系统,说白了就是以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系统。它被嵌入到某个设备或系统中,完成特定的功能。
跟咱们平时用的PC不一样。PC是通用平台,你可以今天写文档、明天打游戏、后天剪视频。嵌入式系统呢?它只干一件事——比如路由器只管转发数据包,智能手表只管监测心率,汽车ECU只管控制喷油量。
核心特征:专用性、嵌入性、可裁剪性、实时性要求。
我在项目中遇到过最典型的例子:一个工业数据采集器,CPU主频只有200MHz,RAM 64MB,Flash 128MB。就这点资源,要跑TCP/IP协议栈、Modbus通信、本地存储、LCD显示。你说PC能干这事吗?能,但成本、功耗、体积全都不对。这就是嵌入式存在的意义。
1.2 嵌入式系统组成
一个完整的嵌入式系统,由四大部分组成。我习惯把它们分成“硬件四件套”和“软件四层楼”。
硬件部分
| 组件 | 说明 | 常见例子 |
|---|---|---|
| 嵌入式处理器 | 系统的核心,负责运算和控制 | ARM Cortex-A/M/R、RISC-V、MIPS、x86 |
| 存储器 | 存放程序代码和数据 | Flash、SRAM、SDRAM、DDR、EEPROM |
| 外设接口 | 与外部设备通信的通道 | UART、I2C、SPI、USB、Ethernet、GPIO |
| 电源管理 | 提供稳定供电,控制功耗 | PMIC、LDO、DC-DC、电池管理 |
软件部分
- 应用层:用户直接面对的软件功能,比如GUI界面、通信协议、控制算法。
- 操作系统层:管理硬件资源、提供任务调度、文件系统、网络协议栈。咱们这门课的主角——Linux内核就在这一层。
- 中间件层:介于OS和应用之间,比如数据库、图形引擎、加密库。
- BSP/驱动层:直接跟硬件打交道,把CPU、内存、外设抽象成操作系统能理解的接口。这就是咱们BSP工程师的主战场。
我的经验:做BSP移植时,最容易被忽略的是电源管理部分。很多开发板参考设计只给了基本供电,但量产产品对功耗有硬指标。我建议在系统设计阶段就把PMIC的驱动和调试验证纳入计划,不然后面改起来很痛苦。
1.3 嵌入式系统特点
嵌入式系统跟通用系统比,有几个非常鲜明的特点。我列出来,大家对照着理解。
- 资源受限:CPU主频低、内存小、存储空间有限。你想想看,一个家用路由器可能只有16MB Flash、64MB RAM,却要跑完整的Linux系统。
- 实时性要求:很多嵌入式系统必须在规定时间内响应外部事件。比如汽车安全气囊,从碰撞到弹出必须在毫秒级完成。
- 功耗敏感:电池供电的设备,功耗直接决定续航。我做过一个手持设备项目,因为驱动层没做好休眠唤醒,待机电流多了5mA,结果续航从7天掉到3天——被产品经理追着骂了一周。
- 可靠性高:很多嵌入式系统部署后不能重启、不能蓝屏。比如医疗设备、工业控制器,一跑就是几年。
- 专用性强:软硬件紧密耦合,针对特定应用场景优化。同一个芯片,用在智能家居和用在工业控制上,BSP和内核配置可能完全不同。
- 开发环境特殊:交叉编译、JTAG调试、逻辑分析仪、示波器——这些工具是嵌入式工程师的日常。
避坑指南:我曾经在一个项目中,因为忽略了“资源受限”这个特点,把完整版Linux内核直接编译进去,结果内核镜像就占了8MB,而Flash总共才16MB。后来老老实实做内核裁剪,把不需要的驱动、文件系统、网络协议全砍掉,最终内核压缩后只有1.2MB。所以,资源受限不是口号,是每行代码都要面对的现实。
1.4 主流嵌入式操作系统对比
嵌入式操作系统种类很多,选型直接影响BSP移植和内核裁剪的策略。我整理了一个对比表,方便大家快速了解。
| 操作系统 | 内核类型 | 实时性 | 资源需求 | 典型应用 | BSP移植难度 |
|---|---|---|---|---|---|
| Linux | 宏内核 | 软实时(RT补丁可硬实时) | 较高(RAM≥32MB,Flash≥4MB) | 路由器、NAS、工业平板、智能座舱 | 中等 |
| RT-Thread | 微内核+组件化 | 硬实时 | 低(RAM≥2KB,Flash≥4KB) | IoT终端、传感器、智能家电 | 低 |
| FreeRTOS | 实时内核 | 硬实时 | 极低(RAM≥几百字节) | MCU项目、电机控制、可穿戴 | 低 |
| VxWorks | 实时内核 | 硬实时 | 中等 | 航空航天、军工、工业控制 | 高 |
| μC/OS-II/III | 实时内核 | 硬实时 | 低 | 教学、简单控制、医疗设备 | 低 |
我个人最常用的是Linux和RT-Thread。Linux生态丰富、驱动多、社区活跃,适合功能复杂的系统。RT-Thread轻量、实时性好、组件化设计,适合资源受限的IoT设备。
选型时我一般会问自己三个问题:
- 系统需要多强的实时性?——硬实时选RTOS,软实时Linux也能扛。
- 硬件资源有多少?——RAM小于4MB就别硬上Linux了。
- 团队熟悉什么?——没人会VxWorks就别硬选,出了问题没人能救。
关于BSP移植:不管选哪个OS,BSP移植的核心思路是相通的——把CPU初始化、时钟、中断、定时器、串口、GPIO这些底层硬件抽象出来,让操作系统能“认识”这块板子。咱们这门课以Linux为主线,但很多方法可以迁移到其他OS上。
本章知识体系
下面这张图把本章的核心内容串起来了。我建议你保存下来,后面学BSP移植和内核裁剪时,随时回来对照。
这张图把嵌入式系统的定义、组成、特点和主流OS对比串成了一个整体。后面咱们讲BSP移植时,会反复回到“系统组成”这个分支——尤其是处理器、存储器、外设接口这三块。内核裁剪则跟“系统特点”里的资源受限、实时性、功耗敏感紧密相关。
好了,第一章就到这里。内容不多,但都是基础中的基础。把这些概念吃透了,后面咱们动手做BSP移植和内核裁剪时,你就能理解每一步到底在干什么、为什么要这么干。