📘 项目参考:0voice/EmbeddedSoftwareLearn
作者:一个正在搬砖的嵌入式工程师
嵌入式是一个“软硬结合、注重实战”的领域,而 C 语言就是这个世界的“通用语言”。本文围绕开源项目 EmbeddedSoftwareLearn 中 C语言部分内容,结合个人实战经历,对嵌入式 C 学习做一份系统化梳理。
📌 为什么嵌入式开发一定要学好 C 语言?
- MCU 底层驱动 90% 都是 C 语言实现的(GPIO、串口、SPI、定时器...)
- FreeRTOS、uC/OS、裸机框架等也都高度依赖 C
- 很多芯片 SDK 就是 “一堆 C 文件 + 头文件”
如果你目标是搞清 STM32/ESP32/鸿蒙 LiteOS 等平台,C 是你绕不开的第一关卡。
🧭 基础知识模块一览
以下内容结构参考 GitHub 开源仓库并按“开发者实用性”重新排序,干货为主👇:
1. 基础语法与关键字
你需要彻底搞清楚这些关键字的语义:
const int a = 10;
volatile int flag;
static int counter = 0;
extern int shared_var;
typedef struct {
int id;
char name[20];
} Device;
✅ 建议练习:
- 用
typedef封装结构体 - 区分
const和#define差异 - 测试
volatile在中断标志位中的使用
2. 指针核心机制(调试基础)
指针是 C 语言的灵魂,也是嵌入式开发者的修罗场。
没学懂指针,你会陷入“程序崩溃、调不动”的噩梦。
重点掌握:
- 一维指针、指针数组、数组指针、函数指针
- 使用
malloc/free管理堆内存
✅ 常见 Bug:
char *str = "hello"; // 只读内存,不能改
char str[] = "hello"; // 栈空间,可修改
3. 内存管理(栈 vs 堆)
| 特性 | 栈 | 堆 |
|---|---|---|
| 分配方式 | 编译器自动 | 手动分配 |
| 生命周期 | 随函数结束 | 手动释放 |
| 常见问题 | 栈溢出 | 内存泄漏、野指针 |
✅ 推荐练习:
- 编写
my_malloc_wrapper()包装malloc并打印分配日志 - 使用
valgrind或heap_4.c查看内存使用情况(RTOS 项目中)
4. 结构体 + 位运算(驱动开发核心)
你在写裸机驱动时 100% 会用到结构体 + 位运算。
typedef struct {
uint8_t EN : 1;
uint8_t MODE : 3;
uint8_t RST : 4;
} CTRL_REG_t;
CTRL_REG_t *reg = (CTRL_REG_t *)0x40021000;
reg->EN = 1;
✅ 理解目标:
- 位运算实现寄存器读写
- 位域控制不同的硬件功能
|=,&=,^=,~的组合使用
5. 排序算法(训练指针 + 数组操作)
虽然嵌入式不以算法见长,但排序算法能显著训练你对数组/内存的控制力。
建议掌握:
- 冒泡排序(基本结构)
- 快排(指针交换 + 递归)
- 堆排(理解结构 +模拟堆)
🧨 实战中最容易踩的坑(必读)
❌ 没初始化指针就使用
int *p;
*p = 10; // Boom! 崩溃警告
❌ malloc 后没判断空指针
char *buf = malloc(128);
if (!buf) {
// 应该判断
}
❌ 函数传值与传引用搞混
void swap(int a, int b) // 错了
void swap(int *a, int *b) // 正确
💡 实用练手建议
✅ 提升 C 语言能力最有效的方法是“边学边做项目”。
初级练习建议:
- 写结构体数组排序函数
- 模拟
memcpy函数 - 定义一个“设备”结构体并用函数操作它
进阶项目推荐:
- 实现一个简易 UART 环形缓冲区(TX/RX)
- 模拟寄存器配置函数:
gpio_set_mode(uint32_t pin, GPIO_MODE mode);
📌 嵌入式开发者成长路径(基于 C 语言的技能模型)
| 能力等级 | 技能点 |
|---|---|
| 初级 | 熟练语法 + 能调指针 |
| 中级 | 编写模块化结构体 + 裸机驱动 |
| 高级 | 封装 BSP、RTOS 驱动、中断管理 |
| 架构 | 设计系统接口 + 多线程调度架构 |
🧠 项目资源推荐(强烈建议 star 收藏)
仓库地址 👉 0voice/EmbeddedSoftwareLearn
该仓库包含:
- C语言基础 + 位操作
- 外设驱动(GPIO/UART/SPI/I2C)
- FreeRTOS基础
- 多平台移植指南(STM32、ESP32、鸿蒙等)
不怕写得多,只怕“写而不思”。C 语言在嵌入式中的价值体现在稳定性、模块化、控制力三方面。