写在前面
嵌入式是一个具有深度和广度的概念,设计的知识面非常广阔,如数字、电子、编程语言和通讯网络等。嵌入式开发就是指在嵌入式操作系统下进行开发。对于嵌入式系统的定义,目前一种普遍被认同的定义是:以应用为中心,以计算机技术 为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面要求严格的专用计算机系统。随着互联网及物联网技术飞速发展和普及,从各种手持的电子产品到空间探测和卫星控制系统,从家用电器到工业生产设备,在工业、军事、通信、运输、金融、医疗、气象、农业等领域,嵌入式发挥了举足轻重的作用。
行业认知
怎么学习嵌入式呢?学习嵌入式,首先要了解嵌入式的方向,如果一开始就买开发板去研究,很容易让自己一头雾水,失去信心,难以坚持下去。嵌入式涉及的内容很多,我们不可能在短时间将其都掌握,一定是需要长时间的知识积累和项目经验的总结和思考。
嵌入式大体可分为软件、硬件两个方向
1、嵌入式硬件
嵌入式硬件的学习难度较大,自学成本很高,岗位相对较少,而嵌入式软件的学习难度相对较小,尤其是应用开发,就业岗位多,薪资也不错,是一个不错的选择。对于嵌入式硬件方向,需要学习硬件电路原理图和PCB的设计、以及硬件的可靠性、稳定性和抗干扰设计。由于大部分集成电路厂商都会提供参考的电路图,硬件电路原理图的设计相对来说会比较简单,因此硬件工程师的主要技术区别体现在所设计的电路的是否稳定、可靠性和电磁兼容等方面。
学习嵌入式硬件,首先需要有一定的硬件基础。基本的电磁、物理定律,电路,数电,模电等需要了解。学会使用一种单片机,不论是8位、16位或者是32位,学习单片机接口的应用,像UART、IIC、SPI、USB、CAN、RS232、RS485等协议。应当熟练使用一种原理图PCB绘制软件,目前常用的软件有Altium Designer、PADS等,只要掌握其中的一款即可。熟练掌握各种元器件的原理及电气特性,并依据此综合特性、成本、供应等各个方面进行器件选型。有一定的英文基础,会看各种芯片的数据手册(datasheet),会使用翻译软件看懂也是可以的。还要有良好的动手能力,熟练使用各种调试仪器如万用表、示波器、逻辑分析仪等,还要会使用EMC测试仪器如雷击浪涌发生器、脉冲群发生器、静电枪等。
2、嵌入式软件
对于嵌入式软件方向可以具体分为三类,分别是嵌入式驱动工程师、嵌入式系统工程师和嵌入式应用工程师。
嵌入式驱动工程师一般是指Linux驱动开发工程师,负责编写和移植各厂商的芯片驱动,因此对硬件的接口协议和操作系统的知识要求很高,门槛相当高;
嵌入式系统工程师主要负责编写固件,根据不同平台移植操作系统、优化系统,需要熟悉操作系统的组成与调度,门槛也很高,主要看项目经验;
嵌入式应用工程师主要负责编写业务逻辑,调用驱动接口控制设备,在软件开发过程中涉及的内容范围非常广,主要使用C语言和C++开发,需掌握计算机网络、操作系统、多线程、数据库和通信协议等知识。同时嵌入式应用工程师也是各大公司里需求量最大,门槛较低的一个职位。从就业的角度出发,对于有一定计算机基础的朋友而已,如果你想入行嵌入式行业,嵌入式应用软件开发可能是比较好的选择,没有之二。
只需要掌握C语言、操作系统基础、数据结构和算法基础、Linux系统编程、C++与STL、Qt界面开发,然后有针对性地背下相关的八股文,就可以在很大程度上应付秋招面试中的理论考察了。
如果你从来没有接触过嵌入式,建议你买一块51单片机开发板、STM32开发板,跟着B站各路大神认真学习课程,把相关的实验项目代码跑一遍,能够让你对嵌入式系统有一个深刻的了解。当然有人带那是最好不过,但千里马常有而伯乐不常有,你可以把自己当做自己的伯乐,相信自己,贵在坚持!
学习路线
嵌入式开发设计的知识面较广,了解知识框架,系统性的学习非常重要,以下是笔者提供的一份学习路线,如今互联网发达,相关课程在各大网络平台均有开源,资源丰富。
一、编程基础
1、C语言
需要掌握基本数据类型、运算符和表达式、数组、指针、函数、结构体、联合体、枚举、位运算等知识。其中重点掌握数组、指针、结构体、联合体和位运算,它们在实际产品开发中应用广泛,也是面试中的常考察的知识点。可以先在网上搜索C语言的常见面试题进行学习和总结,学习C语言推荐《C Primer Plus》,认真学习其底层原理。B站推荐华清远见的《C语言程序设计》和千锋教育的《C语言程序设计》。
2、数据结构和算法基础
重点掌握数组、链表、队列、栈和二叉树等数据结构。对于经典的算法,一定要有自己的理解并且学会手撕,需要重点掌握的有冒泡排序、选择排序、插入排序、归并排序、快速排序、二分查找算法,面试很有可能让你手撕代码或者问你某个算法的时间复杂度。推荐阅读《大话数据结构》,再做大量练习,加深对数据结构的理解。
3、操作系统基础
建议通读一本操作系统教材,把常规的概念理解清楚,书籍推荐《深入理解计算机系统》。
二、Linux应用开发
Linux软件开发需要掌握Linux开发环境的搭建、基本的Linux命令、文件IO和标准IO操作、进程控制、进程间通信、多线程编程、网络编程等,书籍推荐《鸟哥的Linux私房菜》。
1、C++与STL
推荐书籍《C++ Primer Plus》,在嵌入式在面试中对STL的理论考察点不会太多,这里根据各路大神的面试经历了解到,在面试中可以引导面试官去考察vector和list方面的内容,尤其是vector,能学多深就学多深,其他容器可以不懂,但vector一定要会!
2、QT界面开发
在有一定的C++基础之下,建议学习Qt框架,框架并不困难,有C++基础的话上手会很快,可以增加你的就业面,因为很多嵌入式项目和军工、医疗设备项目都有提到Qt框架。此外,不少研究生的研究方向与图像处理、点云处理相关,会接触到OpenCV、PCL这些库的使用,我们其实可以和Qt结合起来做一个相对完整的软件项目。若是要做些算法,像OpenCV这样的计算机开源视觉库可以用心学学,可以尝试着做做学校、商店、公司等都会使用到的人脸识别系统,笔者这里给各位朋友提供一份OpenCV学习文档——> https://opencv.org ,大家可以先尝试着在Linux上使用C++调用OpenCV实现人脸识别,自己做一个简单的人脸识别系统也是不错的想法。有条件的话,可以录制一下项目的工作视频和实验图片,在线上面试的时候,以PPT形式来介绍自己的科研经历。Qt学习中,需要重点掌握信号和槽、事件循环机制、对象树等。课程推荐传智教育的Qt从入门到实战。
3、补充
①在学习C++过程中,还可以接触一些C++单元测试框架,比如Google Test。Google Test是由Google开源的C++单元测试框架,简称gtest。
②FreeRTOS,全称Free Real Time Operating System,即免费的实时操作系统。相比于常见的Windows,MacOS,Linux等操作系统,实时操作系统(RTOS)是一种轻量级的操作系统,适用于嵌入式硬件中,用于解决单片机类裸机轮询方式在处理多个任务时的实时性不高的问题。
如果你有一定单片机开发基础,建议掌握它,可以提高你的竞争力。关于FreeRTOS的文档资料,推荐韦东山的freeRTOS教程。
③ROS,全称Robot Operating System,即机器人操作系统。它一个通信框架,如今已经广泛应用于机械臂、移动底盘、无人机、无人车等许多种类的机器人上。如果你以后想去机器人公司工作,掌握ROS是一个加分项。在这里我推荐Autolabor的ROS教程。
④SQLite是一个基于C语言编写的关系型数据库管理系统,是一个程序库。与许多其他的数据库系统不同,它是被嵌入到终端程序中的。SQLite作为嵌入式数据库软件, 可以说是部署得最广泛的数据库引擎,已经被一些浏览器、操作系统和嵌入式系统(如手机)广泛使用。
推荐教程SQLite教程。
⑤嘉立创EDA,一款基于浏览器的免费电路板设计软件,在线绘制原理图、仿真、PCB软件,学习PCB设计,可以关注微信公众号嘉立创EDA,有不少开源的硬件工程可以参考学习。
结语
无论何时,就业形势永远是复杂的,ChatGPT4 已经问世,AI迅速发展,我们能做的就是跟上时代节奏,抓住机遇勇敢面对挑战,如今大环境骤变,新的一百年充满着为什么,我们无法改变它,我们能做的只有尽量适应它然后调整自己,这可能听起来很残酷,但这是真的。心灵鸡汤听听就好,但内心应当提高觉悟,努力学习不断提高自身能力,提高竞争力是关键。加油吧,各位!请保持热爱,如果有喜欢的东西,那就努力去争取!