嵌入式软件硬件知识点全攻略(小白版)

嵌入式开发是硬件与软件的结合体,既要懂得电路与通信原理,也要精通 C/C++ 编程与调试技巧。很多新手学了一段时间会有困惑:知识零散、缺乏系统框架,遇到问题容易卡壳。
本文将从 通信基础 → 常见协议 → 编程核心 → 预处理与数据结构 → 开发实践 这五大模块帮你梳理重点知识,读完后你将有一张清晰的“知识地图”。


一、通信基础

通信是嵌入式系统的生命线,所有外设交互都离不开数据传输。

1. 二进制与十六进制转换

  • 二进制(Base 2):计算机底层使用的语言,只有 0 和 1。
  • 十六进制(Base 16):书写简洁,每 4 位二进制可以表示成 1 位十六进制。
  • 转换技巧
    例:1101 0110 二进制 → D6 十六进制。
    方法:每 4 位二进制分组 → 查十六进制表。

应用场景:调试串口数据、查看寄存器值时,大多以十六进制显示。


2. 同步通信 vs 异步通信

  • 同步通信

    • 发收双方使用同一个时钟信号。
    • 数据按时钟节拍逐位发送,不需要起止位。
    • 优点:稳定、速度快。
    • 缺点:需要额外的时钟线。
  • 异步通信

    • 发收双方各有独立时钟。
    • 通过 起始位停止位 标识数据帧开始和结束。
    • 优点:省线,不依赖共享时钟。
    • 缺点:传输效率略低。

3. 串行 / 并行传输

  • 串行:一根数据线一次传输 1 位,成本低,适合远距离。
  • 并行:多根数据线同时传输多位,速度快,但易受干扰,成本高。

4. 单工 / 半双工 / 全双工

  • 单工:数据单向流动(例:广播)。
  • 半双工:双向传输,但同一时刻只能一方发(例:对讲机)。
  • 全双工:双向同时传输(例:电话)。

二、常见通信协议

1. UART(异步串行)

  • 仅需 TX(发送)RX(接收) 两根线。
  • 起始位和停止位确保数据帧完整性。
  • 速度一般(如 115200bps)。

2. I2C(同步串行)

  • 两线制:SCL(时钟)SDA(数据)
  • 主从架构,支持多主机。
  • 速率:标准模式(100kbps)、快速模式(400kbps)、高速模式(3.4Mbps)。
  • 常用于连接传感器、EEPROM 等低速外设。

3. SPI(同步串行)

  • 四线制:MOSI(主发从收)MISO(主收从发)SCK(时钟)CS(片选)
  • 高速全双工,速率可达数十 Mbps。
  • 常用于 Flash 存储、显示屏。

4. CAN 总线

  • 使用差分信号(CAN_H、CAN_L),抗干扰能力强。

  • 具备仲裁机制,多节点通信无冲突。

  • 广泛应用于汽车电子、工业自动化。

  • 帧格式:

    • 标准帧:11 位 ID
    • 扩展帧:29 位 ID

5. 协议对比表

协议 线数 同/异步 速率 工作模式 抗干扰 成本
UART 2 异步 半双工 一般
I2C 2 同步 半双工 一般
SPI 4 同步 全双工 一般
CAN 2 同步 中高 半双工

三、C/C++ 编程核心

1. 关键字作用

  • volatile:防止编译器优化,用于中断标志、硬件寄存器、共享变量。

  • static

    • 函数内变量:生命周期延长到程序结束。
    • 文件内变量/函数:作用域限制在当前文件。
  • extern “C”:以 C 语言方式编译,避免 C++ 名称修饰,常用于 C/C++ 混合开发。

  • const:定义不可修改常量,可修饰变量、参数、返回值。


2. 内存管理

  • 分配方式

    • 静态存储区:全局、静态变量。
    • 栈:局部变量,自动回收。
    • 堆:malloc/freenew/delete 手动管理。
  • 堆 vs 栈

    • 栈:快,但空间小。
    • 堆:灵活,空间大,但速度慢且可能内存泄漏。
  • 内存泄漏检测

    • C++:智能指针(std::unique_ptrstd::shared_ptr)。
    • 工具:Valgrind。

3. 指针专题

  • 数组指针:指向整个数组。

  • 指针数组:数组中的元素是指针。

  • 函数指针:存储函数地址,实现回调。

  • 指针函数:返回值为指针的函数。

  • 常量指针分类

    • int* const:指针地址不可改,内容可改。
    • const int*:内容不可改,指针可改。
    • const int* const:都不可改。

四、预处理与数据结构

1. 预处理指令

  • typedef:类型别名,带类型检查。
  • #define:宏定义,文本替换,不做类型检查。

2. 数据结构与算法

  • 直接插入排序

    • 从未排序部分取出元素,插入到已排序部分的合适位置。
    • 适合小数据量排序,代码简单。

五、开发实践要点

1. 嵌入式调试

  • 使用宏 #ifdef DEBUG 控制调试信息开关。
  • 善用 SDK 中的寄存器宏定义简化代码。

2. 编码规范

  • 防野指针:初始化为 NULL,释放后置空。

  • 前置++ 优于 后置++:减少临时对象创建。

  • 字符串处理

    • strlen:返回实际字符数(不含 \0)。
    • sizeof:返回分配的空间大小(含 \0)。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐