嵌入式软件硬件知识点全攻略(小白版)
本文为嵌入式开发新手提供系统性的知识梳理,涵盖通信基础、常见协议、编程核心、预处理与数据结构、开发实践五大模块。通信部分详解二进制/十六进制转换、同步/异步通信、传输方式等基础概念,对比分析UART、I2C、SPI、CAN等协议特性。编程核心重点解析volatile、static等关键字作用,内存管理及指针应用。最后从预处理指令、数据结构到调试技巧,提供嵌入式开发的全流程指导,帮助读者构建完整的知
嵌入式软件硬件知识点全攻略(小白版)
嵌入式开发是硬件与软件的结合体,既要懂得电路与通信原理,也要精通 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/free
、new/delete
手动管理。
-
堆 vs 栈:
- 栈:快,但空间小。
- 堆:灵活,空间大,但速度慢且可能内存泄漏。
-
内存泄漏检测:
- C++:智能指针(
std::unique_ptr
、std::shared_ptr
)。 - 工具:Valgrind。
- C++:智能指针(
3. 指针专题
-
数组指针:指向整个数组。
-
指针数组:数组中的元素是指针。
-
函数指针:存储函数地址,实现回调。
-
指针函数:返回值为指针的函数。
-
常量指针分类:
int* const
:指针地址不可改,内容可改。const int*
:内容不可改,指针可改。const int* const
:都不可改。
四、预处理与数据结构
1. 预处理指令
- typedef:类型别名,带类型检查。
- #define:宏定义,文本替换,不做类型检查。
2. 数据结构与算法
-
直接插入排序:
- 从未排序部分取出元素,插入到已排序部分的合适位置。
- 适合小数据量排序,代码简单。
五、开发实践要点
1. 嵌入式调试
- 使用宏
#ifdef DEBUG
控制调试信息开关。 - 善用 SDK 中的寄存器宏定义简化代码。
2. 编码规范
-
防野指针:初始化为
NULL
,释放后置空。 -
前置++ 优于 后置++:减少临时对象创建。
-
字符串处理:
strlen
:返回实际字符数(不含\0
)。sizeof
:返回分配的空间大小(含\0
)。
更多推荐
所有评论(0)