
人们常说:“人生就是一场游戏,我们要做的就是打怪兽,升级通关”。学习嵌入式系统也是如此。
序言
最近在APP上看到很多类似的答案推送给我。借此机会,我重新审视自己的学习过程,和自己以及大牛分享一些学习心得,希望能对大家有所启发和帮助。
本文的主要目的:
提供嵌入式学习路线图
提供不同阶段的学习建议。
推荐不同阶段的学习资料。
3000字以上,服用1周,建议收藏;码字不容易,如果有帮助,大方一点。
本文将嵌入式学习路线分为几个方面:
嵌入式基础知识
51单片机
STM32单片机
小而美丽的RTOS
ARM LINUX
在这个快节奏的时代,能静下心来耐心看完文章并不容易。
两个嵌入式基础知识
老子说:“抱之木,生于毫厘:九层台始于地基土;千里之行始于足下,基础的重要性不言而喻。
那么,如何为嵌入式路线打下坚实的基础呢?
2.1、学习内容
c语言基础
这部分主要包括几个核心知识点:三种语法结构、常用数据类型、函数、结构、指针、文件操作等等。
硬件基础知识
在这一部分,核心知识点有:电路基础知识、数字电气模块基础知识、常用电子元器件等。
数据结构
核心知识点:数组、队列、链表、栈、树、图、哈希表等。
操作系统
核心知识点:进程管理、内存管理、文件管理、输入输出管理等。
计算机工程原理
核心知识点:数据表示与操作、存储系统、指令系统、总线系统、中央处理器、输入输出系统等。
2.2、学习建议
对于C语言的基础学习,一定要注重熟练掌握,基础的扎实直接决定了我们代码的质量。
对于硬件的基础学习,要适当了解,了解一些简单的电路结构,知道常用的电子元器件。
对于数据结构学习来说,前五条是必须要学的。刚开始学的时候可能感觉不到作用,但是接触到嵌入式底层设计和算法设计的时候就会恍然大悟。
对于操作系统的学习,要重点学习它的思路,对相关知识点有个大概的了解,后续继续重点学习,RTOS和Linux都有关系。
《计算机原理》的学习可以看作是对嵌入式系统各个模块的详细讲解,会让你对嵌入式系统有一个整体的了解,每个部分都值得深入学习。
2.3、学习材料
c语言基础:推荐谭浩强版经典书籍《C语言程序设计》(第2版)。
硬件基础:大学《数电模电》本书涉及的知识足够了。
数据结构:推荐经典书籍《数据结构》 ——严为民版。
操作系统,计算机原理:我用的是0755到79000的系列书,个人感觉不错。
计算机组成、数据结构、操作系统、数据库是嵌入式或计算机入门的必备书籍,也是大学教材中包含的,是真正的基础知识。
以上可能没有全部看完,才能体会到编程的乐趣。这个基础是一个循序渐进的过程,不可能一蹴而就。新手可以先有个大概,等以后做项目的时候再把不知道的补上!
这就涉及到一个重要的学习方法:项目导向学习法。
三嵌入式初学者——51单片机
熟悉了以上基础知识(C语言基础,计算机组成,硬件基础都是必须的)之后,我们就准备敲开嵌入式世界的大门了。
介绍一下,还是推荐51单片机,当然有人会说,直接上STM32不是更好吗?
我的看法:我建议初学者用51单片机入门,因为STM32架构比51大很多,初学者一开始可能不太容易适应。
3.1、学习内容
这部分,主要是在最小的嵌入式系统中,实现各种有趣的实验。通过对51单片机的学习,我们应该做到:
软件类别:
主要知识点有:认识单片机,熟悉逻辑运算,点亮一个LED灯,按键检测,串行通信,定时器,中断等。
硬件类别:
主要知识点有:电阻元件的理解,基本模块电路的理解,时钟电路,试画51单片机原理图和PCB。
3.2、学习建议
对于软件,主要做:了解单片机,熟悉单片机GPIO的输入输出操作,掌握串行通信协议等。这些部分是任何嵌入式设备的必备技能。
对于硬件类:主要可以看懂电路图,熟悉一些简单模块的设计电路,了解Altium Designer的用法。
3.3、学习材料
51单片机:郭天祥的51单片机教程,经典,经久不衰,极力推荐。
庄子说:“水不厚,大船无力担。”这部分是嵌入式领域的基石。只有打好基础,才能养得起Linux泰坦。
四篇STM32进步文章
STM32是C51的高级版本。有了C51的基础知识,开发STM32就会得心应手。
STM32的系统架构和硬件设计相比C51增加了一个维度,这也是我推荐学习C51作为入门课程的原因。
基于STM32F407平台,可以学习一些主流的嵌入式技术,探索底层原理,轻松实现不同平台。
4.1、学习内容
基本练习
这部分主要练习的是:点亮LED灯、GPIO的输入输出操作、中断操作、UART通信、IIC通信等。
高级练习
这部分,主要练习:DMA通信,SPI通信,CAN通信,LCD显示,ADC等。
高级练习
这部分主要研究:STM32时钟架构、总线架构、电源管理、代码框架、SDIO通信、USB通信等。
4.2、学习建议
对于基本练习,主要目的是方便我们从C51过渡到STM32环境。
高级练习的话,主要练习一些通信相关的协议,可以结合一些传感器开发。
对于进阶练习,主要目的是熟悉单片机的设计框架、编程框架以及一些比较复杂的通信技术。
另外STM32会有两个版本:寄存器和库函数。建议交叉学习,理解会更深刻。
4.3、学习材料
STM32微控制器:点状原子和野火推荐使用STM32F103或STM32F407系列。
两个学校的学习资料都非常丰富,有详细的文档和完整的学习文章教程,非常适合初学者学习。
正所谓“道中无术,术中尚可,术中无止境。”要明白道与术的区别,不要本末倒置。
五个小而美丽的RTOS
RTOS是一个实时操作系统,可以理解为STM32和Linux之间的桥梁。因为它的大部分实现思想取自Linux,所以也被称为Linux的简化版。
我们常用的实时操作系统有:UCOS、VxWork、FreeRtos,还有最近几年兴起的RT-Thread。
学习这些简单的嵌入式系统,不仅可以帮助我们打下学习Linux操作系统的基础,还可以拓宽我们的职业道路。
如前所述,Ucos、FreeRtos和Rt-thread的内部设计思路都差不多,下面主要以UCOS为例。
5.1、学习内容
实时系统学习
这部分主要研究:Ucos系统的移植、多任务管理、调度算法、消息队列、信号量互斥、事件、内存管理等。
5.2、学习建议
对于实时系统的学习,除了上述核心知识点,还要结合操作系统书籍和2.1基础知识来加深理解。
5.3、学习材料
RTOS学习:还是推荐守时atom和wildfire,因为这些实时操作系统都可以基于STM32开发板开发,而且还有非常详细的文档和文章教学。
六篇ARM Linux文章
学习RTOS之后,你已经掌握了基本嵌入式系统所涉及的一半技术。也可以独立完成一些小项目或者找一份好工作,但是一定不能对自己满意。有机会一定要联系Linux。
再次:ARM Linux也是最复杂的东西。不接触Linux,永远不知道嵌入式系统的魅力。
Linux开发分为驱动开发、内核开发和应用开发,每个方向都需要数年甚至数十年的积累。
作为初学者,我们要做的就是有一个宏观的认识,扩大知识面,然后选择自己的兴趣。
6.1、学习内容
Linux基础知识
这部分主要学习:Linux常用命令、VIM学习、Linux Shell编程、Gcc编译、Makefile等。
驱动文章
这部分主要研究:内核模块编译原理、字符设备驱动框架、平台设备驱动、设备树、Pinctrl子系统、I2C子系统、中断子系统、块设备驱动框架、Bootloader等。
核心文章
这部分主要研究:系统调用、存储管理、进程管理、内存管理、文件管理等。
应用文章
这一部分主要研究:QT编程、TCP/IP协议、HTTP协议等。
6.2、学习建议
对于基础学习,刚接触Linux一般很难上手,和以前的单片机完全不同,需要一个熟悉环境的过程。
对于驱动学习来说,了解“如何在Linux环境下编写驱动”很重要。驱动的底层原理还是一样的,增加了一层一层的框架,需要我们去熟悉。
对于内核学习,以上也是系统的几个核心特性,重点是‘如何优化Linux的性能’
对于应用学习来说,以上几个方面也是基础,重点是开发什么应用,学习什么知识。没有结论。
对于Linux,有句老话叫“学Linux要三年入门,五年做Linux工程师。对于不熟悉的领域,博主不敢妄加断言。
6.3、学习材料
基础学习,推荐《王道》、《鸟哥的Linux私房菜》等入门书籍。
驱动开发,推荐《Unix环境高级编程》,《Linux设备驱动开发详解》。
内核学习,推荐《Linux内核源码详解》和《Linux Shell脚本攻略》。
对于应用程序开发,建议使用《深入理解Linux内核》和《嵌入式Linux应用开发完全手册》。
另外推荐三本Linux开发教程:正点atom,wildfire,韦东山。魏老师的课程好评,但我还是看哪个更适合我。
七份总结
全文总体学习路线:嵌入式基础学习-51单片机-STM32单片机-RTOS章节-ARM Linux
每一部分也是从学习内容、学习建议、学习资料三个方面进行,有深度、有步骤的指导。
这篇论文既是我的学习过程,也结合了一些大佬的学习和分享,不断调整和总结。如有异同,可留言讨论。
结束
审核编辑:李倩









