工作
哪些轮子,值得我在求职前亲手造一遍?
本文是我对嵌入式求职所需核心能力的一次系统梳理,
重点聚焦“哪些底层机制值得亲手验证”,而非泛泛而谈。
此前有 B 站博主提到,像传感器驱动这类代码大多已有成熟实现,直接使用即可,不必逐行深究细节——毕竟重复造轮子并无必要。
但到了求职阶段,有些“轮子”却值得亲手造一造,至少要清楚它们是怎么运转的。以下是我整理的几类“必要轮子”。
🧱 1. 数据结构:小而关键
我知道 FreeRTOS 里有队列,STM32 的串口 DMA 也能自动缓存,但……
如果让我从零开始搭一个通信系统,我能快速写出一个可靠的环形缓冲区吗?
所以,这几样我决定亲手写一遍(哪怕只是 demo):
- 环形缓冲区:用于串口接收,得处理空/满、head/tail 指针,还要考虑中断安全;
- 队列 / 栈:理解任务间怎么传数据;
- 链表:FreeRTOS 的任务列表就是双向链表,看源码时不至于一脸懵;
- 状态机:解析协议、处理按键,比一堆 if-else 清晰太多。
写的时候不求完美,但至少能跑通。关键是——下次看到别人代码里的 ring buffer,我不再觉得是黑箱。
⚙️ 2. 外设驱动:必须能从 GPIO 层理解通信时序
当 I²C 偶发失败、串口数据错位、SPI 采样异常时,问题从来不在函数名里,而在时序细节中。
因此,我要求自己能用 GPIO 手搓以下基础驱动,哪怕只是验证性实现:
- Bit-Bang UART:精确控制起始位、数据位、停止位与波特率延时;
- Bit-Bang I²C:正确生成 start/stop 条件,处理 ACK/NACK,理解 clock stretching;
- Bit-Bang SPI:根据 CPOL/CPHA 配置正确的时钟极性与相位,确保数据采样点准确;
- 手动 ADC 采样:明确参考电压、采样时间、分辨率对结果的影响。
确保:当通信链路异常时,我能快速定位到是硬件、时序,还是配置问题。
🧠 3. RTOS 核心:未来学习时,这些“轮子”必须亲手摸一遍
目前我的开发仍基于裸机,尚未在项目中使用 RTOS。
但清楚知道:多数中高级嵌入式岗位要求理解 RTOS 模型,提前掌握基础概念将显著提升竞争力。
因此,我为自己定下 RTOS 学习的最小目标——不求精通内核,但以下机制必须能通过简易实现理解其本质:
- 任务调度:用 C 写一个协作式(cooperative)调度器,仅支持
yield()切换,理解任务控制块(TCB)和上下文切换的基本逻辑; - 信号量 / 互斥锁:用全局变量 + 简单状态机模拟,明白它们如何防止资源竞争;
- 消息队列:实现一个基于数组的 FIFO 队列,支持任务间传递数据指针或简单结构体;
- 时间管理:理解
delay()背后依赖的系统 tick 中断,以及如何用定时器驱动调度。
不需要手写抢占式调度或内存保护,
但必须能回答:“两个任务怎么轮流跑?”“串口被两个任务同时访问怎么办?”
—— 这些,就是我要造的“必要轮子”。
🔌 4. 协议解析:别再被“帧”吓到
以前看到 AA 05 01 12 34 AB 这种数据就慌,总觉得要靠现成库。
后来发现,大多数自定义协议,核心就是一个状态机。
所以我给自己定个小目标:
- 写一个 Modbus RTU 解析器(重点练 CRC16);
- 写一个通用串口帧解析器,支持帧头/长度/校验;
- 甚至试试用
sscanf或手动解析 JSON 片段。
关键不是多高效,而是——当我拿到一个新传感器手册,我不再害怕它的通信协议。
🔋 5. 低功耗:即使当前用不到,也必须理解的核心机制
我的毕设采用 USB 供电,未实际应用低功耗模式。
但清楚知道:绝大多数嵌入式产品依赖电池,低功耗设计是工程师的基本功。
因此,我要求自己在后续学习中掌握以下内容:
- 理解 STM32 的三种主要低功耗模式:
- Sleep 模式:CPU 停止,外设仍运行;
- Stop 模式:CPU 与大部分外设停止,SRAM 内容保留;
- Standby 模式:几乎全部断电,仅靠特定引脚或 RTC 唤醒。
- 明确各类唤醒源(RTC、EXTI、USART 等)的适用场景与配置要点;
- 掌握时钟门控(关闭未用外设时钟)与电源域控制对功耗的实际影响;
- 能根据需求选择合适的低功耗策略,例如:“为何用 Stop + RTC 唤醒,而不是 Sleep?”
不需要手写电源管理驱动,
但应该能解释:“在 XX 场景下,我会选择哪种低功耗模式,为什么?”
🚫 哪些轮子,我可以安心放过?
基于我当前的目标岗位(STM32 裸机/应用开发),以下模块可暂不深挖内核实现:
- TCP/IP 协议栈:知道 LwIP 怎么配置就行,不用手写 IP 分片;
- FATFS:会挂载 SD 卡、读写文件足矣;
- FFT / DSP 算法:CMSIS-DSP 调用熟练即可,不必推导蝶形运算;
- USB:了解 CDC 类虚拟串口怎么用,就够了。
✅ 我的原则:
如果这个模块已经有成熟、稳定的开源实现,
而我的岗位又不涉及其内核开发,
那我就信任它,用好它,但保留“必要时能看懂它”的能力。
🛠️ 我的准备方式:小而持续
我不打算一次性啃完所有内容,而是:
- 建一个私有 GitHub 仓库,叫
interview-wheels;
里面放ring_buffer.c、i2c_bitbang.c、simple_os.c……每个文件都带注释和测试用例。 - 每次只攻一个小点,比如这周搞懂环形缓冲区,下周试手 Bit-Bang I²C。
最后,送给自己一句话:
我不需要会造发动机,
但我得知道车为什么能跑,
以及——当它熄火时,我该检查哪里。
这些“轮子”,不是负担,而是我面对未知时的底气。
