硬件科技协会培养计划
嵌入式方向
序言
什么是嵌入式?
如果你用过电脑,那么你肯定知道操作系统,嵌入式操作系统就是一种专用的计算机操作系统。如果你还用过单片机,知道单片机是嵌入式系统的核心硬件。
那么恭喜你,已经知道嵌入式是在单片机上搭载嵌入式操作系统的专用计算机系统。
第一章:大一新生的 STM32 入门
1. 代码编写基础:C 语言基础知识
- 力荐 B 站翁恺 C 语言教程。
- 训练网站:洛谷、力扣
- 相关比赛:蓝桥杯
2. 初识 STM32:STM32标准库学习
- 官方的标准库虽然已经停止维护更新,但此教程可以快速上手 STM32,通过课程学习硬件常用外设,软件的驱动函数和库函数架构,并跟着实验了解常用传感器和驱动其他 MCU。
- STM32 入门教程-2023版 细致讲解 中文字幕_哔哩哔哩
- 学习资料下载:https://jiangxiekeji.com/download.html
- 问题解答:一些简单的问题在 CSDN 上可以得到解答,询问 AI 的答案一般不准。
3. 上手实操,锻炼编程能力
对常用外设库函数和简单传感器熟练使用,实现简单逻辑的裸机控制系统。
4. 实物制作,热门复刻
更好衔接电赛准备工作,有一定的模块调试和整合、功能逻辑设计与调整、发现并解决问题的能力,配合常用模块传感器等制作如智能小车相关的实物。
第二章:STM32 精通和初触竞赛
1. STM32 进阶:STM32 标准库学习
其实官方的 HAL 库是比标准库更简单的,目前是主流,还在更新维护。但通过这个教程不再局限于应用层,要更深入驱动层去了解外设相关寄存器以及更多的外设、外挂芯片等,这个时候不仅学习课程,更多是参考数据手册理解掌握。
2. 竞赛预热:电赛培训(全国大学生电子设计大赛)
支持自主三人分队,队内合理分配任务。团队合作在整个电赛过程中很重要,同时注重自己的能力提升,从准备比赛到参加比赛过程中有所收获。能够实现简单的控制系统,掌握 PID 算法,熟练使用 OpenMv 视觉模块,以及使用一些简单的串口调试工具。电赛的经历对每个参加电赛的硬协人都是难忘的。
3. 嵌赛准备(全国大学生嵌入式芯片与系统设计大赛)
学习使用更多的 MCU 和传感模块,接触使用规定所用 MCU 移植完成自己的作品。要有一定的创新和实践能力。嵌赛更多的是有想法有创意和把想法转换为实践的努力。
4. Protues 仿真
Protues 上手起来比较简单,是一个单片机仿真程序,在参加仿真创新比赛和平时跑仿真代码时都很常用,经常使用便能熟练掌握。
5. 更多方向:C++、Qt 上位机、PCB 开发、简易无人机等
如果你电赛失利了,那么学习 C++或者 PCB 是个错的选择,有兴趣的话还可以学部分 Qt 上位机设计。或者学习无人机相关的姿态算法,试着自己手搓一个无人机。
- 更多比赛:仿真创新比赛、计算机设计大赛、华为 ICT、物联网比赛等
参加比赛的机会和时间都很充足,但目前所学习到的东西不足以自己去拿一个较高的奖项,还是好好沉淀自己吧。
第三章:嵌入式 Linux 学习和积极备赛
1. 初识:入门 FreeRTOS
FreeRTOS 是较为主流的嵌入式操作系统,可以搭载在 STM32上配合 HAL 库开发使用,操作系统比裸机开发的 CPU 利用率更高更稳定,能实现更多复杂的逻辑。
视频教程:【正点原子】手把手教你学 FreeRTOS 实时系统_哔哩哔哩
需要配合 FreeRTOS 官方手册和正点原子的手册进行学习。
2. 嵌入式 Linux 学习
想找工作?来学嵌入式 Linux。建议先熟练掌握 FreeRTOS。
视频教程:正点原子【第一期】手把手教你学 Linux 之 Ubuntu 入门篇_哔哩哔哩
3. 积极备赛
经过一学期的比赛,对 STM32 用的更加熟悉和掌握,有更多的经验和想法,有一定能力去实现自己的想法,在比赛中获得更好的成绩。
4. 项目训练
可以在 Github、嘉立创硬件开源平台等网站寻找适合自己训练的项目,充实自己的简历和锻炼能力。
5. 实习准备
当你实现以上所有章节内容尤其是对 FreeRTOS 和嵌入式 Linux 有一定的掌握后,你可以准备自己的简历,去找实习吧。
END
嵌入式驱动开发的学习路线很简单,从裸机开发到学习 FreeRTOS 和嵌入式 Linux 两个操作系统,但想要掌握的话必须学习很多延伸知识,选项的数量在于了解的多少。知识储备是基础,代码实操是关键,解决问题的能力、团队合作的精神、打破固有思维的创新才是前进的动力。
编译器方向
序言
为什么要学编译器设计
Java 程序员熟悉的 Hibernate 和 Spring,前者用到了编译技术做 HQL 的解析,后者对注解的支持和字节码动态生成也属于编译技术。所以,如果要深入理解和用好这类工具,甚至想写这种类型的工具,会需要编译技术。而 PHP 程序员在写程序的时候,一般会用到模板引擎实现界面设计与代码的分离。模板引擎对模板进行编译,形成可执行的 PHP 代码。模板引擎可以很强大,支持条件分支、循环等语法。如果了解编译技术,会更容易掌握这些模板引擎,甚至写出更符合领域需求的模板引擎。除此之外需要用户自定义功能的软件,比如报表软件、工资管理软件等,都需要编译技术。如果你要参与编写一个基础设施类的软件,比如数据库软件、ETL 软件、大数据平台等,很多需要采用编译技术提供软件自带的语言功能,比如 SQL。这种功能无法由外部通用语言实现。而解析用户输入,防止代码注入,为前端工程师提供像 React 那样的 DSL,像 TypeScript 那样把一门语言翻译成另一门语言,像 CMake 和 Maven 那样通过配置文件来灵活工作,以及运维工程师分析日志文件等等高级别的需求,都要用到编译技术。
除了丰富的应用场景,学习编译技术对于提升程序员的竞争力也很重要。现在一些大公司在招聘程序员时,有难度的面试题都是涉及底层机制的。因为理解了底层机制,才能有更深入思考问题,以及深层次解决问题的能力,而不是只能盲目地搜索答案,从表面解决问题。而学习编译原理能让你从前端的语法维度、代码优化的维度、与硬件结合的维度几个方面,加深对计算机技术的理解,提升自己的竞争力。
所以,无论你是前端工程师、后端工程师,还是运维工程师,不论你是初级工程师还是职场老手,编译技术都能给你帮助,甚至让你提升一个级别。
第一阶段
- 学习数据结构,如:数组,链表、栈和队列,树,图等。
编译器需要处理大量的源代码,并在编译过程中生成中间代码或目标代码。因此,对于高效地存储和处理代码的数据结构的选择和设计至关重要。例如,词法分析器和语法分析器需要使用合适的数据结构来表示词法单元、语法树、符号表等。对于符号表的组织和管理,需要合适的数据结构(如哈希表、树等)来实现高效的符号查找和符号属性的管理。
- 熟练使用 C 语言,熟悉常见的算法(在 leetcode 等平台多练习),熟悉指针、内存布局等概念;理解程序的编译链接过程。
- 学习 C++,熟悉面向对象编程,了解设计模式
- 学习 Linux 操作系统及内核,学习 Linux 系统编程,学习 Linux 网络编程
- 了解一些计算机组成原理,汇编的知识
- 学习 Git 培养版本管理以及协作工作的能力,学习 GNU Make 构建工具以及 CMake 为做项目打下基础。
- 学习正则表达式。
第二和三阶段:学习编译原理以及完成自己的简单编译器设计
- 学习词法分析是编译器的第一步,它将源代码分解成一系列的词法单元(Token)。
- 语法分析是编译器的第二步,它将词法单元序列转换为语法树或抽象语法树。
- 语义分析是编译器的第三步,它对语法树或抽象语法树进行语义检查,包括类型检查、作用域检查、语法糖展开等。
- 中间代码生成是编译器的第四步,它将源代码转换为中间表示形式,例如三地址码、虚拟机代码等。
代码优化是编译器的一步重要过程,它对中间代码进行优化,以提高目标代码的性能和效率。代码优化包括常量折叠、死代码删除、循环展开、寄存器分配等技术。
代码生成是编译器的最后一步,它将优化后的中间代码转换为目标代码,例如机器码、汇编语言等形式。代码生成过程通常涉及到指令选择、寄存器分配、指令调度等技术。了解代码生成的原理和技术可以帮助编译器能够生成高效、可执行的目标代码。
除了上述基本原理外,还有一些其他的编译器相关概念和技术,如符号表管理、错误处理、优化技术(如循环优化、内联展开等)、前端和后端优化、目标代码生成等。学习这些概念和技术可以帮助深入理解编译器的工作原理和实现方式,从而能够编写高效、优化的编译器。
- 学习编译原理推荐课程
- 可以参考以下资料设计编译器
- 书籍推荐
第四阶段:深入学习
- 解析源码,深入了解自己使用的语言的编译器,阅读真实世界中编译器的源代码,跟踪它的执行过程,弄懂它的运行机制。
可以学习 Java 编译器(javac)、Java 的 JIT 编译器(Graal)、Python 编译器(CPython)、JavaScript 编译器(V8)、Julia 语言的编译器、Go 语言的编译器(gc),以及 MySQL 的编译器。
- 学习 LLVM, LLVM 为 Swift、Rust、C++、C 等多种语言提供了优化和后端的支持。
这些编译器采用了各种不同的编译技术。这些编译器,有的是编译静态类型的语言,有的是动态类型的语言;有的是即时编译(JIT),有的是提前编译(AOT);有高级语言,也有 DSL(SQL);解释执行的话,有的是用栈机(Stack Machine),有的是用寄存器机,等等。不同的语言特性,就导致了编译器采用的技术会存在各种差异,从而更加有利于开阔视野。
通过研究多种编译器,可以多次迭代对编译器的认知过程,并通过分析对比,发现这些编译器之间的异同点,探究其中的原因,激发出更多的思考,从而得到更全面的、更深入的认知。
推荐课程:编译原理实战课
FPGA 方向
序言
FPGA(现场可编程门阵列)是一种可通过编程重新配置电路结构的半导体器件,广泛应用于通信、图像处理、嵌入式系统加速等领域。与固定功能的 ASIC 芯片不同,FPGA 的灵活性使其成为硬件原型开发、算法加速和复杂逻辑实现的理想选择。学习 FPGA 不仅能加深对数字电路和计算机体系结构的理解,还能为芯片设计、异构计算等前沿领域打下坚实基础。
第一章:数字电路基础与 Verilog 入门
1. 数字电路基础学习
- 核心内容
- 计算机基本组成原理(数制转换、算术/逻辑运算、逻辑代数与逻辑函数)。
- 组合逻辑电路(编码器、译码器、多路复用器)与时序逻辑电路(触发器、计数器、状态机)
- 推荐教材
- 《数字逻辑与计算机组成》
- 《数字电子技术基础(第六版)》
- 学习方法
- 结合教材完成课后习题,通过仿真工具验证电路设计。
2. Verilog 语言入门
- 环境配置
- 安装 Vivado(Xilinx 官方工具)或 Quartus(Intel FPGA 工具),搭配 ModelSim 仿真环境。
- 学习资源
- HDLBits:在线实战平台,涵盖基础语法到复杂电路设计。
- B 站教程
- Verilog 数字系统设计教程 _ 夏宇闻(配套实验讲解)
- FPGA 入门到精通系列
- 实践目标
- 掌握模块化设计思想,熟练编写基础组合/时序逻辑代码
第二章:进阶实验与项目实战
1. 南京大学数字电路实验
- 实验平台:南京大学数字逻辑与计算机组成实验文档。
- 实验顺序建议
- 第一阶段:译码器、编码器、加法器、ALU 设计
- 第二阶段:移位寄存器、桶形移位器、有限状态机实现
- 第三阶段:基于 Verilog 的简易 CPU 设计(如单周期 MIPS)
- 目标
- 深入理解 CPU 工作原理,掌握数据通路与控制单元设计方法
2. FPGA 综合项目
- 推荐项目
- 数字时钟(含按键消抖与动态显示)
- VGA 图像显示控制器(实现基本图形输出)
- 基于 FPGA 的 PWM 调光系统(结合传感器与电机驱动)
- 拓展方向
- 结合 OpenCV 实现图像处理加速(如边缘检测算法的硬件化)
第三章:一生一芯项目与综合能力提升
1. 预学习阶段
- 核心内容
- 复习数字电路与 C 语言基础
- 掌握 Linux 系统操作(文件管理、Shell 脚本、GCC 编译链)
- 学习 Git 版本控制与 Makefile 编写
- 资源推荐
- 一生一芯预学习文档
- 《鸟哥的 Linux 私房菜》(基础学习篇)
2. 项目实践与答辩
- 流程说明
- 完成预学习后提交实验报告并参与线上答辩
- 跟随官方进度完成 RISC-V 处理器核设计(从流水线到缓存优化
- 目标
- 实现一个可运行 Linux 的 SoC 芯片,掌握全流程芯片设计方法
第四章:深入学习与拓展
1. 高级 FPGA 开发
- 方向推荐
- 高速接口设计(DDR3、PCIe、SerDes)
- 基于 HLS(高层次综合)的算法加速(如机器学习推理)
- 学习资源
- Xilinx 官方文档(UG901:Vivado 设计套件用户指南)
- 书籍《FPGA 并行编程》(通过 OpenCL 实现异构计算)
2. 比赛与实习准备
- 相关竞赛
- 全国大学生 FPGA 创新设计大赛(侧重创新性与工程实现)
- 集成电路创新创业大赛(涵盖芯片设计全流程)
- 职业方向
- 芯片前端设计工程师、FPGA 验证工程师、异构计算架构师
END
FPGA 学习是一个从理论到实践螺旋上升的过程。数字电路是根基,Verilog 是工具,项目实战是能力的试金石,而持续探索前沿技术(如开源 EDA 工具、先进制程架构)则是突破瓶颈的关键。保持对硬件的热爱,在调试中积累经验,在团队协作中拓展视野,终将成长为一名优秀的硬件工程师。