很多人简历上写着:参与过 FreeRTOS、玩过 LVGL、看过 Linux 驱动、研究过 USB。
面试官只追问三句:
你改了哪一块?
怎么验证的?
出过什么问题,怎么定位的?
现场就哑了。
不是开源不值钱,是你把「clone 跑通」当成了「做过项目」。
嵌入式开源值得做,但有两个前提:选对类型,做够深度。
下面按「能进简历、能扛追问」的标准,把值得做的开源拆开讲。每个方向都给你:适合谁、做什么、做到哪算数、面试常问什么。
先定标准:什么叫“值得做”
面试里真正加分的开源,通常同时满足这四条:
有完整链路:从输入到输出,你能画出来 你动过代码:不是只调参、只点编译 你踩过坑:有现象、有定位、有结论 能量化:帧率、丢包率、内存、启动时间、CPU 占用,至少有一个数
只跑官方例程,简历价值接近于零。
同时开五个仓库、每个都停在点灯,也接近于零。
两大企业实战项目: (嵌入式1V1辅导,企业实战项目咨询:hualuoypiao)


项目 1:RTOS 内核向(FreeRTOS / RT-Thread / Zephyr)
适合谁: MCU、消费电子、工控、车载底层工程岗。
别停在哪: 创建两个任务、串口打印 Hello。
建议做一个完整小系统:
传感器采集任务(模拟 ADC / I2C 温湿度均可) 通信任务(UART 上报) UI/指示任务(LED 状态机) 一个日志任务
关键不是功能多,而是把调度和同步用明白。
更值的深入点(选 2~3 个做透):
队列替代全局变量:采集任务只生产,通信任务只消费 复现优先级反转:低优先级持锁,中优先级抢占,高优先级被拖死;再上互斥量看变化 栈溢出检测:故意把局部大数组塞进任务,打开 stack overflow hook,学会看 map 和 SP ISR 到任务:UART 中断只做入队/ GiveFromISR,解析放任务里
做到哪算数:
能画出任务优先级图和数据流 能说清为什么这个通信不用全局 flag 至少解决过一个真实问题:丢包、死锁倾向、栈爆、饿死
面试常问:
信号量、互斥量、队列怎么选? 中断里能不能 printf/malloc?任务栈怎么估?溢出怎么查?
简历可写口径:
基于 FreeRTOS 完成多任务采集上报系统,使用队列解耦,处理过栈溢出与 ISR 延迟问题。
项目 2:图形交互向(LVGL)
适合谁: 带屏产品、HMI、消费电子、仪表类岗位。
别停在哪: 官方 demo 换个颜色、拖两个按钮。
建议做一个“像产品”的界面:
状态页:在线/离线、电量、告警 设置页:阈值、阈值、模式 日志页:最近 20 条事件
背后接状态机,不要把业务全写在按钮回调里。
更值的深入点:
输入设备接入:触摸 / 旋转编码器 / 物理按键,做抖抖与长按 刷新性能:测 FPS,定位是渲染重、还是 SPI 刷屏慢、还是任务抢占 内存账本: LVGL 堆、字体、图片资源各占多少,超了怎么拆 多页面管理: 页面切换时释放与重建策略
做到哪算数:
能讲清:触摸事件 → 控件回调 → 状态机 → 业务动作 → 屏幕刷新 能说出一次卡顿原因和优化手段(降刷新、分区刷、减透明、图缓存) 有基本资源占用数据
面试常问:
界面卡顿怎么查? 刷屏和业务任务如何分工? 内存不够优先砍什么?
简历可写口径:
基于 LVGL 完成设备 HMI,含状态/设置/日志三页,优化过刷新卡顿并统计内存占用。
项目 3:通信协议向(TinyUSB / lwIP / MQTT-C / nanopb)
适合谁: 模组、网关、IoT、带联网能力的嵌入式岗。
别停在哪: 连上 WiFi、发一条 MQTT hello。
建议做“异常路径完整”的通信模块:
以 MQTT 为例,最小闭环应包括:
连接 / 订阅 / 发布 断线检测 自动重连(退避) 发布失败重试 主题与 payload 校验 设备侧命令解析(建议用状态机)
如果你做 TinyUSB,别只枚举成功。做 CDC 虚拟串口或 HID,把主机读写、断线重枚举、包长度边界跑通。
更值的深入点:
环形缓冲 + 协议解析:粘包、半包、错误帧丢弃 内存池:避免通信路径频繁 malloc弱网测试:拔网线、路由器重启、MQTT broker 挂掉 流量与时效: 队列堆积时如何限流、如何丢弃过期数据
做到哪算数:
能画:网卡/模组 → TCP → MQTT → 业务状态机 能讲一次真实故障:重连死循环、重复订阅、内存打满、半包解析错 有重连成功率和最长恢复时间这类数据更好
面试常问:
断网后设备怎么恢复? 为什么不用阻塞式连网拖死整个系统? 发送失败你怎么保证业务一致?
简历可写口径:
基于 MQTT-C/lwIP 完成设备远程控制链路,实现断线重连与命令解析,验证过弱网恢复。
项目 4:外设与中间层(自己抽 UART/SPI/I2C 组件)
适合谁: 绝大多数 MCU 岗。这是性价比最高的一类。
很多同学卡在 CubeMX 生成代码。
真正有区分度的,是你能否抽一层“可复用驱动组件”。
建议题目:UART + DMA + 空闲中断 + 环形缓冲
目标效果:
不定长收包 任务侧按帧取数据 超时、过载、溢出有错误码 上层不直接碰寄存器
更值的深入点:
DMA 与 Cache(M7/H7): 何时 Clean / Invalidate 环形缓冲满策略: 丢旧、丢新、阻塞,为什么这么选 零拷贝或少拷贝: 解析是否二次拷贝 可测试性: PC 端回环脚本验证丢包率
SPI/I2C 也可做同类封装:超时、重试、总线恢复(I2C 时钟脉冲解锁)。
做到哪算数:
能手绘:中断/DMA → ringbuffer → 解析任务 能解释一次溢出或丢包的根因 组件能在第二个工程里复用,而不是复制粘贴一堆寄存器代码
面试常问:
空闲中断和 DMA 怎么配合? 环形缓冲空/满怎么判断? 有 D-Cache 时为什么会“发出去是旧数据”?
简历可写口径:
设计 UART DMA 环形缓冲组件,支持不定长收包与过载保护,并在业务工程中复用。
项目 5:Linux 驱动向(字符设备 / I2C client / platform driver)
适合谁: 驱动、BSP、安卓底层、车载 Linux、模组平台岗。
别停在哪: 编译别人的模块、insmod 成功打印一句 log。
建议路径(循序渐进):
阶段 A:虚拟字符设备
open/read/write/ioctl打通copy_from_user/copy_to_user设备节点自动创建
阶段 B:真实外设
I2C 温湿度 / EEPROM 或 GPIO key + 中断
阶段 C:工程化
设备树匹配 probe/remove资源申请与释放中断上半部快速处理,下半部/工作队列做耗时逻辑
更值的深入点:
讲清用户态到内核态边界,为什么不能直接解引用用户指针 一次 probe失败定位:供电、地址、时钟、设备树拼写用 strace/dmesg证明你的调用链
做到哪算数:
能画出: app -> libc -> syscall -> fops -> 硬件能讲清至少一个真实 bug:IRQ 未清、竞争、忘 iounmap、DT 不匹配有应用层小工具配合验证,不只是内核 log
面试常问:
字符设备框架怎么走? ioctl和read/write怎么选?设备树节点和驱动如何匹配?
简历可写口径:
编写 Linux I2C 传感器驱动与用户态测试工具,完成 DT 适配与中断上报,排查过 probe 失败问题。
项目 6:系统构建向(Buildroot 最小系统 / 简易 Boot 方案)
适合谁: BSP、系统软件、想往平台方向走的人。
不适合: 还没搞定单片机基础就硬上的人(可后置)。
别停在哪: 跟着视频烧进去能开机。
建议做一个最小闭环:
Buildroot 编出可启动镜像 加入自己的应用,开机自启 裁掉无用包,记录镜像大小与启动时间变化 (进阶)理解 U-Boot 环境变量、启动参数、rootfs 类型
如果你更偏 MCU,也可以做:
自定义 Bootloader 跳转 App A/B 区 OTA 最小原型(下载、校验、切换、失败回滚)
做到哪算数:
能说清启动链:ROM → Bootloader → Kernel/App → 用户程序 能解释你为什么裁某个包、启动慢在哪一段 OTA 能讲断电保护和回滚策略
面试常问:
启动到可操作,中间经历什么? OTA 断电怎么办? 为什么设备树/启动参数改错会起不来?
这三类,不建议当“主项目”
只改 README、提无关格式 PR,就写“给 xxx 项目做过贡献” 无目标翻 Linux 内核,两周后讲不出一条调用链 五个方向各浅尝辄止,简历像展览馆
开源的价值不在仓库名有多响,在于你能不能把它变成可验证的工程能力。
怎么选:按目标岗位匹配
原则就一句:主项目只深做一个,辅项目最多再带一个。
一个可执行的 4 周节奏(按一个主项目)
第 1 周:定题与链路
选定仓库和板子,跑通最小 demo,画出数据流图。
第 2 周:产品化最小功能
做成“能演示”的闭环,而不是碎片功能。
第 3 周:主动制造并解决问题
必做一项:丢包、断连、栈溢出、probe 失败、卡顿、Cache 不一致……
把现象、定位手段、根因、修复写下来。
第 4 周:变成可面试故事
按这个结构练熟:
背景与目标 架构与关键模块 你做的最难一点 结果(最好有数据) 如果重做会怎么改进
到这里,开源才真正变成你的项目。
简历上怎么写,才不像“跟着教程”
虚的写法:
熟悉 FreeRTOS、LVGL、Linux 驱动,了解 MQTT。
稳的写法:
基于 FreeRTOS + UART DMA 环形缓冲完成采集上报;弱网下 MQTT 重连平均 X 秒恢复;LVGL 设置页切换卡顿从 XXms 降到 XXms。
差别就在于:有对象、有动作、有结果。
最后想问你一句:
你现在手里的开源,是「跑通过」,还是「能讲透一条链路 + 一个坑」?
评论区直接报你的方向:RTOS / LVGL / MQTT / 驱动 / OTA / 还在选。
夜雨聆风