第二章:嵌入式系统基础

各位同学,咱们今天聊聊嵌入式系统的基础。说实话,这章内容看着多,但都是干货。我做了十几年嵌入式,发现很多新手栽跟头,就是因为基础没打牢。咱们一步步来。

2.1 嵌入式系统定义与特点

嵌入式系统是什么?说白了,就是专门干一件事的计算机系统。你手机里的芯片、汽车里的ECU、智能手表里的处理器,都是嵌入式系统。

它和我们用的PC不一样。PC是通用平台,能玩游戏、能写文档、能剪视频。嵌入式系统呢?它只干一件事,而且必须干好。比如你家的微波炉,它的芯片只负责加热、计时、转盘子,别的啥也不干。

嵌入式系统有几个核心特点,我列出来:

  • 资源受限:内存小、CPU慢、存储少。我见过一个项目,RAM只有4KB,代码得精打细算到每个字节。
  • 实时性要求高:很多系统必须在规定时间内响应。比如汽车安全气囊,碰撞后必须在几毫秒内弹出,晚一丁点都不行。
  • 功耗敏感:电池供电的设备,功耗是命门。我曾经优化过一个物联网传感器,把功耗从10mW降到0.5mW,电池寿命从3个月延长到2年。
  • 可靠性要求高:嵌入式系统往往不能重启。你想想看,心脏起搏器要是死机了,那是什么后果?
  • 软硬件紧密结合:嵌入式开发,不懂硬件寸步难行。我见过纯软件背景的同事,连GPIO和UART都分不清,调试起来那叫一个痛苦。

核心要点:嵌入式系统是“专机专用”的。它不像PC那样“万能”,但在特定任务上,它比PC更高效、更可靠、更便宜。

2.2 常见嵌入式硬件平台

硬件平台这块,我建议你重点掌握四种:ARM、MCU、DSP、FPGA。它们各有各的脾气,选型选错了,项目就凉了一半。

2.2.1 ARM

ARM不是芯片,是架构。它授权给各大厂商,比如ST、NXP、TI、高通。ARM的特点是:性能强、功耗低、生态好。

我个人习惯把ARM分成三类:

  • Cortex-M系列:主打低功耗、实时控制。比如STM32、GD32。适合做电机控制、传感器采集、物联网终端。
  • Cortex-R系列:主打实时性和可靠性。用在汽车、工业控制里。我做过一个汽车网关项目,用的就是Cortex-R4。
  • Cortex-A系列:主打高性能。比如手机里的骁龙、华为的麒麟。能跑Linux、Android。

嗯,这里要注意:选ARM芯片时,别光看主频。外设资源、封装、价格、供货周期,都得考虑。我吃过亏,选了一款芯片,结果供货周期12周,项目差点黄了。

2.2.2 MCU(微控制器)

MCU就是单片机。它把CPU、内存、外设都集成在一个芯片里。你想想看,一个芯片就能干活,多方便。

MCU的特点是:

  • 集成度高:CPU、RAM、Flash、GPIO、ADC、定时器,全在一个芯片里。
  • 成本低:几块钱到几十块钱,量大还能更便宜。
  • 开发简单:裸机就能跑,不需要复杂的外围电路。

我建议新手从MCU入手。比如STM32F103,经典款,资料多、教程多、坑也少。我当年就是从51单片机开始,然后跳到STM32,再后来才接触ARM Linux。

2.2.3 DSP(数字信号处理器)

DSP是专门处理数字信号的芯片。它擅长做数学运算,比如FFT、滤波、编解码。

DSP和MCU的区别在哪?MCU是“控制型”的,DSP是“计算型”的。举个例子:

  • MCU做电机控制:读取传感器、计算PID、输出PWM。这是控制逻辑。
  • DSP做音频处理:采集音频、做FFT、降噪、输出。这是信号处理。

我在项目中用过TI的C2000系列,做电机控制。说实话,DSP的编程思维和MCU不太一样,你得习惯用循环、用指针、用流水线优化。

2.2.4 FPGA(现场可编程门阵列)

FPGA是硬件可编程的芯片。你可以用Verilog或VHDL,自己“画”电路。它不像MCU那样跑软件,而是直接实现硬件逻辑。

FPGA的优势:

  • 并行处理:所有逻辑同时运行,速度极快。
  • 灵活性高:可以随时修改硬件设计,不用换芯片。
  • 适合做接口转换:比如把并行信号转成串行,或者做协议解析。

但FPGA也有缺点:开发难度大、功耗高、成本高。我建议,除非你需要极高的并行处理能力(比如图像处理、高速通信),否则别轻易上FPGA。

平台 核心优势 典型应用 开发难度
ARM 性能功耗平衡 手机、平板、网关 中等
MCU 集成度高、成本低 家电、传感器、电机控制
DSP 数字信号处理 音频、雷达、通信
FPGA 并行处理、灵活 图像处理、高速通信 很高

选型建议:新手先玩MCU,比如STM32。等熟悉了嵌入式开发流程,再考虑ARM Linux或DSP。FPGA可以等有项目需求时再学,别一上来就啃。

2.3 嵌入式软件架构

软件架构,说白了就是代码怎么组织、任务怎么调度。嵌入式软件架构有三种主流方案:裸机、RTOS、Linux。

2.3.1 裸机(前后台系统)

裸机就是没有操作系统。代码在一个大循环里跑,轮询检查各种事件。

裸机的结构很简单:

void main(void)
{
    // 初始化
    SystemInit();
    GPIO_Init();
    Timer_Init();
    
    // 主循环
    while(1)
    {
        // 处理任务1
        Task1();
        // 处理任务2
        Task2();
        // 处理任务3
        Task3();
    }
}

裸机的优点:简单、直接、资源占用少。缺点:实时性差、任务多了容易乱。

我建议:任务少于5个、实时性要求不高的项目,用裸机就够了。比如一个温度采集器,每秒读一次温度,显示在LCD上,裸机完全能搞定。

2.3.2 RTOS(实时操作系统)

RTOS是有操作系统的,但它很轻量。常见的RTOS有FreeRTOS、uC/OS、RT-Thread。

RTOS的核心是任务调度。你可以创建多个任务,每个任务有自己的优先级。RTOS会根据优先级和事件,自动切换任务。

举个例子:

void Task_LED(void *pvParameters)
{
    while(1)
    {
        GPIO_Toggle(LED_PIN);
        vTaskDelay(500);  // 延时500ms
    }
}

void Task_UART(void *pvParameters)
{
    while(1)
    {
        if(UART_DataReady())
        {
            Process_UART_Data();
        }
        vTaskDelay(10);  // 每10ms检查一次
    }
}

RTOS的好处:

  • 实时性好:高优先级任务能及时响应。
  • 模块化:每个任务独立,代码好维护。
  • 资源管理:有信号量、消息队列、互斥锁等机制。

我曾经在一个项目中,用裸机写了20多个任务,结果代码乱成一锅粥。后来换成FreeRTOS,每个任务独立,调试起来轻松多了。

避坑指南:RTOS不是万能的。任务太多、优先级设置不合理,会导致“优先级反转”或“死锁”。我曾经因为一个信号量没释放,导致整个系统卡死,查了三天才找到原因。

2.3.3 Linux

嵌入式Linux,就是把Linux系统移植到嵌入式设备上。它功能强大,但资源消耗也大。

Linux适合:

  • 需要复杂网络功能:比如路由器、网关。
  • 需要图形界面:比如智能终端、HMI。
  • 需要文件系统:比如存储大量数据。

但Linux也有缺点:启动慢、实时性差、开发复杂。我建议,除非你的项目需要Linux的生态(比如网络协议栈、文件系统、图形库),否则别上Linux

架构 资源占用 实时性 开发复杂度 适用场景
裸机 极低 简单控制、传感器
RTOS 多任务、实时控制
Linux 一般 复杂系统、网络应用

2.4 嵌入式开发流程概览

嵌入式开发,不是上来就写代码。它有一套完整的流程。我把它总结成6步:

  1. 需求分析:搞清楚要做什么。功能、性能、成本、功耗、接口,都得明确。
  2. 方案设计:选芯片、选架构、选外设。这一步决定了项目的成败。
  3. 硬件设计:画原理图、画PCB、打板、焊接、调试。
  4. 软件设计:写驱动、写应用、写协议栈。
  5. 联调测试:软硬件一起调。我见过最惨的情况,硬件焊好了,软件烧进去,板子不工作。结果发现是电源没焊好。
  6. 量产维护:写生产测试程序、写文档、处理售后问题。

嗯,这里要注意:需求分析阶段,一定要和客户反复确认。我吃过亏,客户说“随便做做”,结果做完了,他说“这不是我要的”。后来我学乖了,需求文档写清楚,签字确认,再开工。

我的建议:新手别急着写代码。先花30%的时间做方案设计,30%的时间做硬件,30%的时间写软件,10%的时间测试。很多人反过来,上来就写代码,结果后面改来改去,反而更慢。

好了,第二章的内容就这些。嵌入式系统的基础,说白了就是:知道它是什么、有哪些平台、用什么软件架构、怎么开发。这些概念搞清楚了,后面学起来就顺了。

下一章,咱们聊聊需求分析。那可是嵌入式开发的“地基”,地基没打好,楼盖得再高也得塌。