核心构成:软件(语言/系统)+硬件(单片机/芯片) 学习顺序:从基础语言到系统开发,再到硬件实践 关键能力:编程基础、系统原理、硬件调试、项目实战

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 部署能力复合型):你要能把“模型 → 推理引擎 → 板端性能/功耗/延迟”讲清楚并跑出数据。

你每个阶段都要交付这三类产物:

  1. 工程仓库:可编译、可运行、README 清晰、带测试/日志/脚本

  2. 技术文档:你写的“设计文档 + 问题复盘”(比代码更能打动面试官)

  3. 性能数据:延迟、吞吐、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

  1. 先看 Block Diagram:你要知道芯片“有什么模块”,否则你不知道自己在用什么

  2. 看 Memory Map:外设基地址在哪里?寄存器属于谁?(这一步决定你能否理解“寄存器控制硬件”)

  3. 挑一个外设(比如 UART)做“从 0 到 1”

    • 看寄存器章节:Enable 位、Status 位、Interrupt 位、Baud 计算

    • 先轮询(polling)跑通,再上中断,再上 DMA

  4. 画一张“时钟树/数据流”草图

    • 时钟没开 → 外设全死;数据流不通 → 你永远在猜
  5. 对照示波器/逻辑分析仪验证时序(哪怕是便宜逻辑分析仪也行)

    • 面试时你能说出“我怎么证明确实发出 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 驱动学习路线(别一上来就写复杂驱动)

  1. 写一个 字符设备驱动(open/read/write/ioctl)——理解 file_operations

  2. 写一个 platform driver(probe/remove)——理解 Linux 驱动模型骨架

  3. 写一个 I2C/SPI 设备驱动(配合设备树)——理解总线模型

  4. 进阶:中断、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 部署路线(建议按这个顺序)

  1. 先跑通(正确性):在板端跑起来,输出对得上

  2. 再可重复(工程化):一键编译/一键部署/一键 benchmark

  3. 再优化(性能/功耗)

    • 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 强制练习规则(让你成长速度翻倍)

  1. 独立调试优先:遇到 bug 先用 gdb/日志/抓波形自证,不要先搜答案

  2. 每周一个“可展示成果”:哪怕很小,也要可运行、可演示

  3. 每个项目都要有 Benchmark:没有数据的优化 = 自嗨

  4. 坚持写“工程 README + 设计文档”:这是你面试的“第二简历”

4.3 内核源码/驱动源码怎么学才不痛苦?

  • 目标导向:你要写 I2C 驱动,就只追 i2c-core、probe 流程、regmap(别全看)

  • 路径追踪:学会用 “从 dmesg 的一行日志反推到源码路径”

  • 小步改动:先编译通过,再加日志,再改一行逻辑,再验证(避免大改崩盘)


最后:你两年内的“实习 Offer 关键指标”

如果你到大三下能做到下面 6 条,实习竞争力会非常扎实:

  1. 有 2–3 个中等复杂度项目仓库(RTOS + Linux + AI 推理各一)

  2. 会用 gdb/逻辑分析仪/基本 profiling 工具定位问题

  3. 能讲清启动链路、设备树、驱动 probe 的基本逻辑

  4. 至少写过一个完整驱动闭环(内核态 + 用户态验证)

  5. 做过端侧推理优化并给出“数据对比”

  6. 能把“为什么这么设计”讲清楚(比“我会用某库”更重要)

如果你愿意,我可以把这套路线进一步拆成 按周的任务清单(每周学习目标 + 验收点 + 推荐项目迭代顺序),并给你一份“面试自测题库”(C/RTOS/Linux/驱动/AI 部署五大模块)。