核心构成:软件(语言/系统)+硬件(单片机/芯片) 学习顺序:从基础语言到系统开发,再到硬件实践 关键能力:编程基础、系统原理、硬件调试、项目实战
C语言: 1、C语言程序设计(谭浩强) 2、C和指针 3、C专家编程 4、高质量C编程
数据结构与算法 1、大话数据结构 2、算法导论 学习建议:结合leetcode等平台刷题,将理论应用于实际问题
Linux系统与驱动 1、鸟哥的Linux私房菜 2、Linux高性能服务器编程 3、Linux内核设计与实现 4、Linux设备驱动+Linux设备驱动开发详解
C++ 1、C++ Primer 2、QT5开发实例(字典作用) 学习重点:面向对象思想、STL标准库、QT信号与槽机制
下面这份规划按“软硬结合、由浅入深、项目驱动、上限最高”设计。你可以把它当成一条 两年冲刺路线:每个阶段都要产出可展示的工程成果(GitHub/文档/视频/Benchmark),否则学习很容易“看懂了但不会做”。
0. 总目标与评价标准(先把靶心钉死)
目标 A(大三下学期拿到顶级实习):你需要具备“能独立做完一个中等复杂度嵌入式系统项目”的可信证据。
目标 B(毕业成为:底层系统开发 + AI 部署能力复合型):你要能把“模型 → 推理引擎 → 板端性能/功耗/延迟”讲清楚并跑出数据。
你每个阶段都要交付这三类产物:
-
工程仓库:可编译、可运行、README 清晰、带测试/日志/脚本
-
技术文档:你写的“设计文档 + 问题复盘”(比代码更能打动面试官)
-
性能数据:延迟、吞吐、CPU 占用、内存、功耗(哪怕粗略也要有)
1) 分阶段技术地图(Timeline)
阶段 1:夯实期(大二下)——C 从“语法”到“工程化”
核心:把 C 变成你的“武器”,不是“课内语言”。
1.1 必须掌握的 C 关键点(按优先级)
(A)内存模型与指针(决定你能不能写驱动/内核)
-
栈/堆/全局区/常量区:生命周期、可见性、对齐
-
指针四件套:
指针+数组、指针+结构体、二级指针、函数指针 -
const的真实含义(指针常量 vs 常量指针) -
volatile的使用边界(会在“寄存器控制硬件”里用到) -
内存对齐与 padding:
sizeof、结构体对齐、位域(bit-field)风险点
(B)结构体与模块化(决定你能不能做“中型工程”)
-
struct 设计:把“数据 + 操作接口”封装成模块(C 也能写出“类”的味道)
-
头文件规范:include guard、前向声明、暴露最小接口
-
多文件工程:
.h/.c的依赖关系、循环依赖的拆法
(C)工程化工具链(决定你能不能进团队)
-
编译与链接:目标文件、静态库、符号表、链接顺序
-
Makefile 必会:变量、规则、依赖、伪目标、自动化编译
-
调试:gdb(断点/单步/观察变量/回溯/条件断点)、core dump
-
基础质量:
-Wall -Wextra -Werror、AddressSanitizer、Valgrind(至少会用其中一个)
1.2 夯实期强制项目(2 个就够,但要做“像样”)
项目 P1:手写一个“可复用的日志+环形缓冲库”
-
功能:多级日志、时间戳、环形缓冲、可选落盘/串口输出
-
技术点:指针运算、边界条件、模块化接口、单元测试
项目 P2:手写一个“简化版 malloc/free(教学级)或内存池”
-
功能:固定块内存池、碎片统计、越界检测(canary)
-
技术点:内存布局、对齐、链表、调试意识
面试加分点:你能解释“碎片如何产生、怎么观测、怎么缓解”。
阶段验收(你必须达成)
-
能用 gdb 独立定位一次段错误(越界/悬空指针/重复释放)并写复盘
-
能解释链接阶段发生了什么(符号未定义、重复定义、静态库顺序)
阶段 2:突破期(大二暑假—大三上)——STM32 + FreeRTOS,建立“软硬互控”能力
核心:你要从“写代码”升级为“用寄存器驱动真实硬件 + RTOS 组织复杂系统”。
2.1 学习权重分配(别走歪)
-
硬件接口与时序(40%):GPIO、EXTI、中断、定时器、PWM、ADC、DMA、I2C/SPI/UART
-
FreeRTOS(40%):任务/优先级、队列、信号量、事件组、软件定时器、内存管理
-
工程架构(20%):驱动层/服务层/应用层分层、日志、参数管理、故障恢复
2.2 “软硬互控”实战项目(强烈建议做这一套)
项目 S1:RTOS 智能控制终端(传感采集 + 执行器闭环 + 通信)
-
硬件侧:温湿度/IMU/光照任选其二 + 电机/舵机/风扇任选其一
-
通信侧:串口命令行(CLI)+ 蓝牙/LoRa/WiFi 任选其一(起码串口要强)
-
系统侧:多任务 + DMA + 中断 + 低功耗(sleep/stop 至少会一种)
推荐的任务划分(面试官很爱问)
-
Task_Sensor: 周期采样(ADC/I2C/SPI)+ 滤波 -
Task_Control: 控制算法(PID/状态机)输出 PWM -
Task_Comm: CLI/MQTT/透传协议解析 -
Task_Log: 异步日志落地(队列 + 环形缓冲) -
ISR:只做“快进快出”,把重活丢给任务(这点非常关键)
你必须踩的“难点坑”(踩过才值钱)
-
优先级反转:互斥锁与优先级继承
-
任务栈溢出:如何估算栈、如何开启 overflow hook
-
DMA 与缓存/对齐:为什么有时候数据“看起来不更新”
-
中断与任务通信:队列/信号量的 ISR 安全 API 用法
2.3 如何通过 Datasheet/TRM 建立硬件思维(给你一套读法)
别“从第一页往后翻”,那是自杀。按这套路径走。
读芯片资料三件套:Datasheet + Reference Manual(TRM) + Board Schematic
-
先看 Block Diagram:你要知道芯片“有什么模块”,否则你不知道自己在用什么
-
看 Memory Map:外设基地址在哪里?寄存器属于谁?(这一步决定你能否理解“寄存器控制硬件”)
-
挑一个外设(比如 UART)做“从 0 到 1”
-
看寄存器章节:Enable 位、Status 位、Interrupt 位、Baud 计算
-
先轮询(polling)跑通,再上中断,再上 DMA
-
-
画一张“时钟树/数据流”草图
- 时钟没开 → 外设全死;数据流不通 → 你永远在猜
-
对照示波器/逻辑分析仪验证时序(哪怕是便宜逻辑分析仪也行)
- 面试时你能说出“我怎么证明确实发出 SPI 时钟了”,含金量极高
阶段验收
-
至少 1 个外设用“寄存器级”写过(不用 HAL 也能跑)
-
能解释:中断触发、NVIC、优先级分组的大概逻辑
阶段 3:进阶期(大三下)——嵌入式 Linux:应用层 vs 底层驱动,构建完整系统
核心:你要理解 Linux 启动链路、裁剪思路、驱动模型,这决定你“上限”。
3.1 学习权重:别只会“跑应用”
-
底层(60%):启动链路、设备树、驱动模型、内核裁剪、性能分析
-
应用(40%):多进程/多线程、IPC、网络、文件系统、部署脚本
为什么这样分配:顶级公司更缺“能把板子真正跑稳、跑快”的人。
3.2 必须打通的三件套:Bootloader → Kernel → RootFS
(A)Bootloader(理解启动链路的“第一性原理”)
-
启动顺序(典型):ROM → SPL → U-Boot → Kernel → init
-
你要搞清楚:
-
U-Boot 在干嘛(初始化 DDR、加载内核/DTB、传参)
-
环境变量、启动脚本、网络启动(tftp)
-
失败如何救砖(串口、救援模式)
-
(B)Kernel(裁剪不是“删选项”,是“围绕目标硬件和业务”)
-
最小可启动配置:CPU/SoC 支持、串口、存储、网络
-
设备树(DTB)必会:
-
compatible、reg、interrupts、clocks、pinctrl
-
驱动怎么“通过 DT 匹配并 probe”
-
-
常用调试:dmesg、sysfs、procfs、ftrace、perf(至少会两样)
(C)RootFS(你要能做出可复制的系统镜像)
-
BusyBox / Buildroot(入门最快)
-
了解 init(sysvinit/systemd 思想即可)
-
包管理/交叉编译产物如何放进 rootfs
-
OTA/升级的基本策略(A/B 分区思想了解一下)
3.3 驱动学习路线(别一上来就写复杂驱动)
-
写一个 字符设备驱动(open/read/write/ioctl)——理解 file_operations
-
写一个 platform driver(probe/remove)——理解 Linux 驱动模型骨架
-
写一个 I2C/SPI 设备驱动(配合设备树)——理解总线模型
-
进阶:中断、DMA、异步通知、poll/epoll 支持
阶段验收
-
你能从 0 用 Buildroot 生成镜像并跑起来
-
你能写一个“设备树 + 驱动 + 用户态测试程序”的闭环
阶段 4:跨越期(大四上)——AIoT:从底层视角部署与优化模型
核心:你不是“会调参的算法”,你是“能把模型在边缘端跑到指标的人”。
4.1 技术栈组合(以“可落地”为第一)
-
C++(必须):推理引擎调用、内存管理、线程/并发、性能优化
-
Python(够用即可):模型导出、量化、数据预处理脚本
-
交叉编译(必须):工具链、ABI、依赖库、部署脚本
-
推理链路(必须打通至少一条):
- PyTorch/TF → ONNX/TFLite →(CPU/NEON / GPU / NPU)推理
-
优化手段(至少会 3 个):量化 INT8、算子融合/替换、流水线并行、零拷贝、绑核/线程池
4.2 AI 部署路线(建议按这个顺序)
-
先跑通(正确性):在板端跑起来,输出对得上
-
再可重复(工程化):一键编译/一键部署/一键 benchmark
-
再优化(性能/功耗):
-
Profiling:瓶颈在预处理?在推理?在后处理?
-
量化:PTQ/QAT;精度掉了怎么定位(层级对比)
-
内存:减少 memcpy、用连续内存、复用 buffer
-
并发:采集/预处理/推理/后处理流水线化
-
4.3 你要能讲清楚的“底层关键点”
-
为什么交叉编译经常出 ABI 问题(glibc/musl、armhf/aarch64)
-
CPU 上怎么吃满 NEON/多核(线程池、算子选择、内存布局)
-
NPU/GPU delegate 的限制(支持算子、layout、精度、fallback)
-
端侧指标:延迟(P50/P99)、吞吐、功耗、温升、稳定性
2) 核心项目库(Project Portfolio)——三套“商业竞争力”项目
项目 A:基于 RTOS 的智能网关(强烈建议主打)
定位:工业物联网网关 / 智能家居中枢(“能跑、能稳、能升级”)
-
功能:多传感采集 + 协议转换(Modbus/自定义)+ MQTT 上云 + OTA
-
架构:驱动层(寄存器/外设)→ RTOS 服务层(队列/事件/定时器)→ 应用层(协议栈/业务)
-
加分项:故障自恢复(watchdog)、掉电保护、参数持久化(Flash wear leveling 思想)
面试常问的底层难点
-
中断里能做什么不能做什么?为什么?
-
队列/信号量/事件组怎么选?各自适用场景?
-
OTA 失败怎么回滚?Bootloader 怎么配合?
项目 B:基于 Linux 的视觉处理终端(应用 + 驱动结合)
定位:摄像头边缘盒子 / 视觉检测终端(“吞吐和延迟有指标”)
-
功能:摄像头采集(V4L2)→ 图像处理(OpenCV 或自写)→ 编码/推流(可选)→ Web/CLI 控制
-
底层必做:设备树配置 +(至少一个)外设驱动实践(I2C 传感器/按键/LED 都行,但要闭环)
面试常问的底层难点
-
V4L2 buffer 机制你怎么理解?怎么减少拷贝?
-
为什么会丢帧?你怎么定位(CPU、IO、调度、内存)?
-
你裁剪内核裁掉了什么?怎么证明系统更小更快?
项目 C:边缘侧深度学习推理机(AIoT 王牌项目)
定位:端侧目标检测/分类/姿态估计(“能跑出 benchmark”)
-
功能:摄像头输入 → 预处理 → 推理(ONNX/TFLite/厂商 NPU)→ 后处理 → 可视化/上报
-
必须有数据:FPS、P50/P99 延迟、CPU 占用、内存峰值、功耗(哪怕用简单方式测)
-
优化至少做两项:INT8 量化 + 流水线并行/零拷贝/绑核(任选两项,但要有对比数据)
面试常问的底层难点
-
量化为什么会掉精度?你怎么定位是哪一层导致的?
-
推理快了但端到端没变快:瓶颈可能在哪?你怎么证伪?
-
NPU 不支持某些算子怎么办(替换/拆分/fallback)?
3) 顶级专家视角提示(Expert Insights)
3.1 如何理解“软件是通过寄存器来控制硬件的”?
本质一句话:CPU 读写一段特殊的内存地址(Memory-Mapped I/O),这些地址背后不是 RAM,而是硬件电路的控制开关与状态反馈。
你写的 GPIO->ODR |= (1<<x),不是“改变量”,而是把某根引脚的输出驱动电路打开;你读 USART->SR,读到的不是“内存值”,而是 UART 状态机当前的硬件状态。
你需要形成三个直觉:
-
寄存器写入 = 对硬件状态机下命令
-
寄存器读取 = 读取硬件状态机的反馈
-
时钟/复位/中断 = 硬件行为的前置条件与触发器
这就是为什么:不会看 memory map/寄存器描述的人,很难成为强嵌入式。
3.2 为什么“底层系统开发”职业寿命和薪资上限更高?
因为底层能力解决的是 通用、长期、稀缺 的问题:
-
通用:启动链路、驱动模型、性能瓶颈、内存/并发,这些在任何产品形态都存在
-
长期:上层框架会换(N 年一代),但“硬件 + OS 约束”不会换
-
稀缺:能把系统跑稳、跑快、跑小、跑省电的人比“会写业务逻辑的人”少得多
更现实一点:公司在关键节点(量产、性能卡死、疑难故障)靠的就是底层人救火,这类岗位溢价天然更高。
3.3 AI 转型差异化策略:算法 + 底层优化结合
你要避开“卷训练/卷模型”的红海,去打“端侧落地”的蓝海。你的差异化可以这样构建:
-
懂算法的边界:知道哪些结构更适合量化、哪些算子端侧不友好
-
懂系统的代价:知道端侧瓶颈常在预处理/内存搬运/IO,不只在推理核
-
会工程闭环:能把“精度—延迟—功耗—成本”做成可权衡的方案
一句话打法:
用工程数据说话,用系统手段把模型跑进指标。
4) 学习方法论(解决“跨平台辛苦”“门槛高”)
4.1 一套高效练习闭环(每天都能执行)
“读文档 20% + 写代码 60% + 调试复盘 20%”
-
读:只读你当下要用的章节(寄存器/接口/内核子系统)
-
写:每次只做一个“可验证的最小闭环”
-
调:必须写复盘(问题现象→定位路径→根因→预防)
4.2 强制练习规则(让你成长速度翻倍)
-
独立调试优先:遇到 bug 先用 gdb/日志/抓波形自证,不要先搜答案
-
每周一个“可展示成果”:哪怕很小,也要可运行、可演示
-
每个项目都要有 Benchmark:没有数据的优化 = 自嗨
-
坚持写“工程 README + 设计文档”:这是你面试的“第二简历”
4.3 内核源码/驱动源码怎么学才不痛苦?
-
目标导向:你要写 I2C 驱动,就只追
i2c-core、probe 流程、regmap(别全看) -
路径追踪:学会用 “从 dmesg 的一行日志反推到源码路径”
-
小步改动:先编译通过,再加日志,再改一行逻辑,再验证(避免大改崩盘)
最后:你两年内的“实习 Offer 关键指标”
如果你到大三下能做到下面 6 条,实习竞争力会非常扎实:
-
有 2–3 个中等复杂度项目仓库(RTOS + Linux + AI 推理各一)
-
会用 gdb/逻辑分析仪/基本 profiling 工具定位问题
-
能讲清启动链路、设备树、驱动 probe 的基本逻辑
-
至少写过一个完整驱动闭环(内核态 + 用户态验证)
-
做过端侧推理优化并给出“数据对比”
-
能把“为什么这么设计”讲清楚(比“我会用某库”更重要)
如果你愿意,我可以把这套路线进一步拆成 按周的任务清单(每周学习目标 + 验收点 + 推荐项目迭代顺序),并给你一份“面试自测题库”(C/RTOS/Linux/驱动/AI 部署五大模块)。