这两天跟新同事讨论了“软硬结合”的问题,这就不得不提到嵌入式系统

做为实体人机交互的重要支撑,嵌入式系统还是要了解一哈。


嵌入式系统概述

定义嵌入式系统及其特点

引用百度:嵌入式系统由硬件和软件组成.是能够独立进行运作的器件。其软件内容只包括软件运行环境及其操作系统。硬件内容包括信号处理器存储器、通信模块等在内的多方面的内容。相比于一般的计算机处理系统而言,嵌入式系统存在较大的差异性, 它不能实现大容量的存储功能,因为没有与之相匹配的大容量介质,大部分采用的存储介质有E-PROMEEPROM 等, 软件部分以API编程接口作为开发平台的核心。

简言之:嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪的专业系统。其核心特点包括:

  • 专用性强:通常针对特定应用设计
  • 资源受限:CPU性能、内存容量、存储空间有限
  • 实时性要求:大多数需要及时响应外部事件
  • 高可靠性:长期稳定运行不宕机
  • 低功耗:特别是电池供电设备

常见应用领域

  1. 消费电子:智能手机、智能手表、智能家居设备
  2. 工业控制:PLC、工业机器人、CNC机床
  3. 医疗设备:心电监护仪、胰岛素泵、MRI设备
  4. 汽车电子:ECU、ADAS、车载信息娱乐系统
  5. 物联网:智能传感器、网关设备

硬件与软件的基本组成

  • 硬件部分
    • 处理器核心(MCU/MPU)
    • 存储器(Flash、RAM)
    • 输入/输出接口
    • 电源管理模块
  • 软件部分
    • 引导程序(Bootloader)
    • 实时操作系统(可选)
    • 设备驱动
    • 应用程序

嵌入式系统硬件基础

微控制器(MCU)与微处理器(MPU)的区别

特性 MCU MPU
设计目标 控制 数据处理
集成度 高(内置RAM/Flash) 低(需外接存储器)
功耗 低(μA级) 较高(mA级)
典型应用 简单控制设备 复杂计算设备

常见硬件平台

  1. ARM Cortex-M系列:STM32、NXP Kinetis
    • M0/M0+:超低功耗
    • M3/M4:平衡性能与功耗
    • M7:高性能
  2. AVR系列:Arduino使用的ATmega328P
  3. ESP32:集成WiFi/蓝牙的物联网平台
  4. RISC-V架构:新兴的开源指令集架构

传感器、外设与接口

  • 常见传感器
    • 温度传感器(DS18B20)
    • 加速度计(MPU6050)
    • 环境光传感器(BH1750)
  • 标准接口
    • GPIO:最基础的数字输入输出
    • UART:异步串行通信(115200bps常见波特率)
    • I2C:两线制串行总线(SCL时钟线,SDA数据线)
    • SPI:全双工高速同步串行接口(主从模式)

嵌入式开发环境搭建

开发工具链介绍

完整的嵌入式开发工具链包括:

  1. 编辑器:代码编写(VS Code、Eclipse)
  2. 编译器:源码转机器码(GCC ARM Embedded)
  3. 链接器:组合目标文件
  4. 调试器:程序调试(GDB)
  5. 烧录工具:将程序写入芯片

常见开发环境

  1. Keil MDK
    • ARM官方推荐IDE
    • 完善的调试功能
    • 商业软件(有免费版本限制)
  2. IAR Embedded Workbench
    • 高度优化的编译器
    • 支持多种架构
  3. PlatformIO
    • 跨平台开源工具
    • 支持多种开发板
  4. Arduino IDE
    • 初学者友好
    • 丰富的库支持

硬件仿真与调试工具

  1. J-Link
    • SEGGER公司出品
    • 支持多种ARM芯片
    • 高速调试接口
  2. ST-Link
    • STM32专用调试器
    • 成本低廉
  3. 逻辑分析仪(Saleae):
    • 捕获和分析数字信号
    • 协议解码(I2C、SPI等)

嵌入式编程基础

C/C++在嵌入式开发中的重要性

  • C语言优势
    • 接近硬件的高效性
    • 较小的运行时开销
    • 丰富的嵌入式开发经验积累
  • C++应用
    • 面向对象特性
    • 模板等高级特性
    • 现代嵌入式系统逐渐采用

附:有同学问为啥不用python,主要有三方面原因:

实时性不足
Python是解释型语言,执行效率远低于C/C++等编译型语言。嵌入式系统通常需要微秒级响应,而Python的垃圾回收机制和动态类型检查会引入不可预测的延迟。

资源占用过高
典型嵌入式设备(如STM32)仅有几十KB RAM,而Python解释器本身就需要数MB内存。MicroPython虽经优化,仍需要至少256KB ROM和16KB RAM。

硬件操作限制
Python缺乏对寄存器级操作的直接支持。嵌入式开发常需精确控制内存地址、中断向量表等底层硬件资源,而C的指针操作和汇编嵌入能力更适合此类任务。

所以python虽然在通用编程领域应用广泛,但在嵌入式系统开发中远不如c++来的好使。


基本编程结构

  1. 寄存器操作
    // 设置GPIOA第5引脚为输出
    GPIOA->MODER &= ~(0x3 << (5 * 2));  // 清除原有配置
    GPIOA->MODER |= (0x1 << (5 * 2));   // 设置为输出模式
    

  2. 中断处理
    void EXTI0_IRQHandler(void) {
        if(EXTI->PR & EXTI_PR_PR0) {
            // 中断处理代码
            EXTI->PR = EXTI_PR_PR0;  // 清除中断标志
        }
    }
    

  3. 定时器配置
    • 定时器工作模式(PWM、输入捕获等)
    • 预分频器和自动重装载值计算

实时操作系统(RTOS)简介

RTOS核心组件:

  • 任务调度:优先级抢占式调度
  • 同步机制:信号量、互斥量
  • 通信机制:消息队列、邮箱
  • 内存管理:动态内存分配

常见RTOS比较:

RTOS 特点 适用场景
FreeRTOS 开源、社区支持好 资源受限设备
RT-Thread 国产、组件丰富 物联网设备
μC/OS 商业级、认证完善 工业控制

常见外设驱动开发

GPIO输入输出控制

  1. 输出模式
    • 推挽输出:强驱动能力
    • 开漏输出:需要上拉电阻
  2. 输入模式
    • 浮空输入:用于数字信号
    • 上拉/下拉输入:确定默认电平

ADC/DAC数据采集与输出

  • ADC关键参数
    • 分辨率(8/10/12/16位)
    • 采样速率(1Msps等)
    • 参考电压(内部/外部)
  • DAC应用
    • 波形生成
    • 电压控制

PWM波形生成与电机控制

  • PWM参数
    • 频率(1kHz-20kHz常见)
    • 占空比(0-100%)
  • 电机控制应用
    • 直流电机速度控制
    • 步进电机细分驱动

通信协议实现

  1. UART
    • 波特率匹配
    • 奇偶校验设置
  2. I2C
    • 7/10位地址
    • 时钟拉伸处理
  3. SPI
    • 模式设置(CPOL/CPHA)
    • 片选信号管理

嵌入式系统调试与优化

调试方法

  1. 断点调试
    • 硬件断点(数量有限)
    • 软件断点(修改指令)
  2. 日志输出
    • UART打印调试信息
    • RTT(Real Time Transfer)技术
  3. 硬件监测
    • 电流表监测功耗
    • 示波器观察信号

功耗优化策略

  1. 低功耗模式
    • 睡眠模式(保留RAM)
    • 停机模式(仅RTC运行)
    • 待机模式(最低功耗)
  2. 时钟管理
    • 动态调整主频
    • 关闭未用外设时钟

代码大小与执行效率优化

  1. 空间优化
    • 使用-Os编译选项
    • 移除未用代码段
  2. 速度优化
    • 内联关键函数
    • 循环展开
    • 使用查表法替代计算

实战项目示例

LED闪烁与按键输入(基础项目)

实现步骤

  1. 配置GPIO为输出模式(LED)
  2. 配置GPIO为输入模式(按键)
  3. 实现简单去抖算法
  4. 编写主循环控制逻辑

传感器数据采集与显示(中级项目)

典型流程

  1. 初始化I2C/SPI接口
  2. 配置传感器工作模式
  3. 定时读取传感器数据
  4. 通过LCD或串口输出数据
  5. 实现数据滤波算法

无线通信与物联网应用(进阶项目)

实现方案

  1. 选择无线模块(ESP32/WiFi、nRF52/BLE)
  2. 实现通信协议(MQTT/CoAP)
  3. 设计数据加密方案
  4. 开发云端对接接口

学习资源与进阶方向

推荐资源

  1. 书籍
    • 《嵌入式系统设计与实现》
    • 《ARM Cortex-M3/M4权威指南》
  2. 在线课程
    • Coursera嵌入式专项课程
    • 慕课网STM32实战系列
  3. 技术社区
    • 电子工程世界
    • GitHub嵌入式开源项目

开发板推荐

  1. 入门级
    • Arduino Uno
    • STM32F103C8T6最小系统板
  2. 进阶级
    • STM32F407 Discovery Kit
    • ESP32 DevKitC
  3. 专业级
    • NXP i.MX RT系列开发板
    • Xilinx Zynq FPGA开发板

扩展学习路径

  1. 嵌入式Linux
    • 构建根文件系统
    • 设备驱动开发
    • 系统裁剪优化
  2. FPGA开发
    • Verilog/VHDL基础
    • 数字电路设计
    • SoC系统集成

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐