嵌入式是个大筐,什么都可以往里面装,电子、机械、计算机、自动化、测控、通信、物联网……很多很多专业都和嵌入式沾边,硬件、驱动、操作系统、网络、应用、算法……很多同学越学越迷糊,越学越感觉什么也不会。
首先要记住一句话,嵌入式学习奥义:先观其广,再究其深。
然后今天给大家捋一捋,一个嵌入式工程师从0开始,到底该学什么,怎么学。
高数、英语、计算机基础,C语言程序设计……,这些基础课都是很重要的课,不要因为它们是基础课就忽视其重要性。
基础好了之后学进阶的知识才会厚积薄发,才会游刃有余。这些基础课就像是的内功,内功不行,根本就发挥不出精妙的招式,同样内功深厚,学什么都快。
我重点提几项特别需要重视的基础课:
1. 英语 大多数技术文档、官方资料都是英文的,甚至只有英文版,英语学好了,受益终身。口语不是特别重要,我建议直接搜一本Datasheet,开始啃,不管理不理解,先啃单词。推荐S2C2440的Datasheet
2. 高数 算法以及控制等都对数学上有要求,如果以后想做跟算法和控制相关的,必须好好学,如果不是也至少得及格。
3. 数电 模电 很多同学会想,我不搞硬件,我只搞软件。但是其实嵌入式这行没有办法完完全全避开硬件,即使你做软件、驱动、上层应用,也得了解基本的电路知识,不然硬件同事给你的电路图你都看不懂,根本无法沟通,对于想成为嵌入式硬件工程师的那就得好好学,多实践,自己搭建、仿真、做出实际电路练手。
C语言能力是一个嵌入式工程师最最基础的能力之一,可以说是整个嵌入式的地基(就算成为嵌入式硬件工程师,也必须有一定的C语言能力)。
地基打好了,才有上层建筑。学到什么程度?
最低条件:要对指针特别清楚、数据结构和算法:软件方向要好好学,其他方向必须过一遍。
推荐书籍
没必要全看,重在实践。
嵌入式硬件的路线其实非常明白,学各种电子知识、各类电路设计、PCB、电磁兼容……我就不赘述了,下面主要讲嵌入式软件该学什么。
学完C语言,就可以学单片机了。
先学51,你把基础课学好,就会发现51很简单。
1. 要有个开发板,学串口、中断、定时器、GPIO
2.买一些小模块,LCD显示屏、红外、舵机、超声波
3.自己搭建一下单片机最小系统
做个贪吃蛇、调温、测距什么的小东西,要多实践,多练手,51单片机开发板、教程都是大同小异,就不推荐了。
再学STM32
32裸机中的一部分和51是差不多的,比如串口、中断、定时器、GPIO,原理几乎一样,
32多了一些IIC、SPI、DMA等知识.推荐买个网上的开发板、野火、正点原子等,其实哪家都差不多,并且附带的资料也很全,也差不多。
再学实时操作系统,像ucos,freeRTOS等。
实时操作系统相比linux而言还是一个比较小、比较简单的操作系统,适合作为你入门操作系统的起点。
你可以通过它学习一下操作系统的知识,思考使用操作系统相对于裸机的优点,是不是更方便更有效率了。它里面的任务调度,信号邮箱的通信,中断、优先级的设计等等,基本是所有操作系统共有的特点。
了解它们实现的原理,对你后续linux的学习是很有好处的,跳过其实也行,不建议跳过。
了解ARM架构、ARM指令集,适当背一背知识点。推荐:《ARM体系结构与编程》杜春雷着
此时应当重点提高,拿到一款芯片和Datasheet,脱离例程,从0开始驱动一些基本模块的能力。
Linux系统
了解Linux常用命令,会一些基本的操作就行了,不需要太深入的学习每一个命令,用到的时候会去搜索就行了,推荐《鸟哥的Linux私房菜》。
Makefile
了解它的基本规则,会用Makefile就可以。不需要深入研究那些make函数,因为在工作中有现成的,看得懂就行,很偶尔才需要自己去编写一套Makefile。这个搜搜资料就能学会。
ARM裸机驱动
自己编写一下启动代码、Makefile、硬件初始化。不想成为嵌入式驱动开发也必须好好学LED、按键、中断、UART等特别常见的基础驱动。
Linux内核与驱动
u-boot的移植,linux内核的移植,根文件系统的制作、linux下的基本驱动。推荐B站上韦东山老师的视频课程(非广告),韦老师讲课很到位,很详细。
u-boot的主要功能就是:启动内核。它涉及:读取内核到内存、设置启动参数、启动内核。工作中要么不改,要么小改,除非特殊方向。
u-boot的移植,linux内核的移植,根文件系统的制作,会就行,工作以后根据工作需求,再深入
linux下的基本驱动:比如先自己写一个led灯的驱动,试试驱动的安装和卸载这些流程,然后写一写复杂点的串口的驱动,移植一些复杂点的,比如网卡驱动、LCD屏的驱动等。
按照早期驱动模型到平台设备驱动到设备树的使用,把简单驱动过一下。
会字符设备驱动其实就已经具备找工作的能力了。
在学习驱动过程中,你会越来越多的接触到内核。这时候免不了学点内核调试技术了,比如中断子系统、内核休眠与内核定时器,异步通知,内核同步机制等。
这是一个边实践,边学习的过程,初期目标也是会,不要太深入。
Linux应用
是否深入,跟你以后的工作有关,工作再深入不迟,但一些基本的应用开发编写能力是必要的:
这部分对于决心做驱动的同学是没必要的,对于决心做软件、嵌入式应用开发,还是需要学一学的。
这部分也没什么好深入讲的,C学得好学C++就很快,主要理解封装、继承、多态等面向对象特性,QT可以理解为C++的图形库。
学习C++和QT的话,推荐B站上黑马程序员的课程(非广告),讲得非常好。
嵌入式实在是太杂了,人的精力是有限的,一定要记住我开头说的那句话,先观其广,再究其深。
你的深度是在实际工作中,根据工作具体方向不断深入的。
如果是学生,在校期间踏实学习,多动手实践,多参加蓝桥杯、电赛等比赛,结识同伴、锻炼技术、增加简历,一举多得。
如果是转行至嵌入式,要保持热爱,耐得住学习的寂寞。
嵌入式这行,越干越觉得自己会的东西好少,越干越深入,这也是为什么这行并不存在35岁危机的原因,只要你脚踏实地,随着时间的积累,自身价值愈发提升。
最后助大家学有所成,升职加薪。