专栏地址:嵌入式面经地址想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。很多人都不知道嵌入式怎么学,这一期我就简单说一下我的理解。嵌入式这个概念太广了,可能很多人认为嵌入式就是嵌入式Linux。但是其实并不仅仅只有Linux,像STM32,51单片机也属于这个范畴之内的,它们有的也可以跑协议栈,跑ucos等系统。嵌入式是有很多方向的,选择一个你觉得发展前景不错的方向,做好,做精了都会有前途。接下来,跟大家探讨一下嵌入式的一些方向,和如何去学习。我以前也是摸索着过来的,没人告诉我如何学习,也没有学习线路,所以走了很多弯路。2.1 单片机开发单片机开发在这个市场上的需求还是很大,单片机公司业绩并没有下滑,**单片机的领域在工业控制,机械控制等上面会比较多一些,当然也会涉及物联网。**单片机有8位,16位,32位的,一般8位用得比较多的就是51单片机和STM8,32位用得比较多的就是STM32。**一般学完51和STM32之后,找个单片机的工作应该是没什么问题了。**单片机的门槛不算高,但是做好也不容易。2.2 Linux应用开发很多人都不知道“Linux应用到底在做什么?”。其实应用就是在做功能,在操作系统中,因为分层的原因,把应用和驱动区分开,也是为了方便开发分工。因为单片机中基本都是驱动和功能混在一个程序中,所以转到Linux开发中,内容更加细,就整不会了。Linux应用使用到的编程语言基本就是C和C++了。所以Linux应用开发一定要掌握好C语言,大学课本中的C语言只是入门,像多线程,多进程,网络通信,还有一些其他的库都没讲到。Linux应用在市场需求上还是很多的,基本有涉及Linux开发的,都需要,它的岗位需求会比驱动多。**比如做网络设备,做路由,做POS机,做楼宇对讲等等。**薪资上一般会比单片机高。·Linux驱动开发Linux驱动开发是难度最高的,因为它涉及的方面比较多。你必须要会看原理图,datasheet,要了解许多驱动框架,然后还要能写一些应用来调试驱动。驱动入门时间是比较长的,这一块的工作机会在芯片原厂比较多,虽然一些公司也会需要,但是大部分是移植调试,对接原厂工程师等工作。驱动工程师要求高,所以薪资还是很不错的。单片机方向(1) C语言认真学习C语言。C语言在嵌入式中是重中之重,它就是你上手嵌入式的工具。大学考试不考的,在工作中却经常用到。函数指针,结构体,枚举,文件操作,共同体,宏等相关知识都是非常常用的。不仅是ANSI C,还有GUN C,所以学起来需要花些功夫。(2) 51单片机虽然现在51单片机用得越来越少,但在一些要求不高的项目中还是会用到。学习51是在打基础,对于后面学习其他芯片会有帮助。比如理解寄存器是什么,如何去看电路图,学习一些协议(I2C, SPI,串口等),学习看datasheet,这些对于后面的学习会有很大帮助。(3) STM32STM32属于ARM系列的芯片,STM32在这个市场上用得特别多的,有各种各样的系列(L0, F0, F1, F4等)。基本都大同小异,学习一种之后,其他的上手就很容易,官方基本都封装了库,我们只需要对结构体进行配置,然后调用接口函数就可以了。它有着丰富的外设资源,运行速度也比51快很多。我们一般就是学习它的外设资源( SPI, I2C,定时器,看门狗等),在这个过程中还会接触很多传感器。学完这些,找个单片机的很容易。如果要深入STM32,还可以学习UCOS, FreeRTOS等实时操作系统,这些对你以后深入理解操作系统会有很大帮助。Linux应用方向(1) Linux基本命令做Linux应用肯定要在Linux环境下开发啊,所以熟悉Linux的基本操作是应该的。装个Ubuntu系统,在上面练习shell命令,把基本的命令练熟练了。可以顺便把shell脚本学习一下,刚开始可以只练习命令即可。基本shell命令: ls cd cp rm touch mkdir echo cat mv ln chmod man等。(2) Linux C编程上面提到的C语言主要是基本的语法,在Linux下我们要涉及的就更多了。包括文件IO,多进程控制,多进程通信,多线程编程,网络编程等。掌握这些就基本算入门了,后面要深入,可以去接触一些第三方库,比如ffmpeg,log4c, openssl等。这些一般跟你所处的行业有关,比如ffmpeg一般是音视频相关的。(3) Qt编程Qt就是图形化编程,它是一些基于C++写的图形化库。它是跨平台的,所以写完的代码,只要在不同的编译器下编译,就能在不同的平台下运行。因为它是C++写的,所以要进行Qt开发需要有C++的语言基础。Qt不仅在嵌入式用得很多,现在很多PC软件也使用Qt写的,比如VirtualBox。Linux驱动方向Linux驱动的学习一般是建立在前面的基础上的。当然,学驱动也不需要你应用写得很牛,但是基本的应用你要会写,这样才能方便你调试驱动。(1)裸板程序裸板程序其实跟单片机程序没什么区别,都是直接操作寄存器。那为什么要还要学这块内容呢,其实是为了后面打个基础,因为Linux驱动就是Linux驱动框架加上操作寄存器。而且这个阶段对我们查看电路图和datasheet也会有很大帮助。(2) Uboot移植Uboot其实是属于系统层的,但是目前行业中大家都是分为底层和应用层,所以这些系统层的一般也归为底层,所以驱动工程师一般也需要做这块。Uboot的主要目标是去引导内核,当然Uboot上也会有属于自己的驱动程序(这里的驱动和内核驱动是不一样的,是独立的)。学习的过程,除了照着别人的教程一步一步移植外,还可以自己找一个其他版本的Uboot,然后自己慢慢移植,会很有趣。(3) Linux内核移植内核移植和Uboot移植差不多,都是基于具体芯片架构做移植。现在的内核越来越完善,并且芯片原厂也一直在向内核提交自己的代码,所以慢慢的,非原厂工程师对这块的移植越来越少。但是还是希望学习的过程中能自己找一个版本来进行移植,边查资料边移植,会学到很多东西。建议有时间和精力的,可以深入学习Linux内核,会对写驱动与很大帮助。(4)根文件系统制作根文件系统比较简单,嵌入式根文件系统一般都是使用busybox,一般就是配置,编译,制作,打包。它也是属于系统的。(5)字符设备驱动字符设备是最基本的,像RTC,音频,LCD都是字符设备。可不是仅仅按键,LED,虽然我们学习时都喜欢从它们开始,那是因为它们简单,不会涉及很多设备本身的知识。这样我们在学时会更注重在驱动框架本身的学习。在学习字符设备驱动的过程中,除了基本的open、read、write、ioctl、close外,还要学习并发(原子量,自旋锁,互斥体等),阻塞和非阻塞I/O,异步通知和异步I/O等等,最后还有一个很重要的就是中断。这些东西随便拧一个出来,都能学很久。像并发,阻塞,异步I/O这些在其他的设备驱动中也一样会用到,所以在这个阶段一定要好好学的。(6)驱动架构可能很多人学完字符设备驱动后,会马上继续学块设备和网络设备驱动。但我觉得这个时候去学这些是比较容易受打击的。并且我认为应该先把一种摸透,然后再去理解更复杂的,这样会提升信心,对学习更有帮助。这里说的驱动架构是"总线设备驱动"模型。一般掌握platform,spi,i2c等总线。platform是一种虚拟总线,一般控制器都是用这种总线,还有像LED,按键这种不是挂接在具体总线上的,也是用platform。这个模型的目的是为了将硬件部分分离,让驱动可以复用。这过程中我们可以将上面的字符设备驱动改为使用"总线设备驱动"模型。到此,我们基本可以应付很多传感器驱动了。(7)块设备驱动和网络设备驱动块设备一般就是存储设备,比如磁盘,MMC,FLASH等。Linux定义了大量结构体和函数接口来让我们填充调用。网络设备也是一样,Linux封装了net_device结构体,然后让我们填充注册。大量的驱动都是这样,Linux系统屏蔽了很多细节,让我们专注于设备的控制和读写。比如RTC,LCD等,我们只需要去使用rtc_device结构体就可以去注册一个RTC设备。现在的网络设备一般拆分成MAC+PHY的结构,就是主芯片有MAC控制器,然后外挂PHY芯片。像最早的DM9000是将MAC和PHY集中在一起。(8)各驱动子系统Linux内部有很多驱动子系统,比如前面说的RTC,Linux提供了RTC核心层,再比如LCD,提供了FrameBuffer等等。还有鼠标,键盘等输入(Input)子系统。每一种驱动都能啃很久,以后可能还会接触Wifi,蓝牙,USB等等。这些东西不单单需要驱动相关知识,还需要很多协议和接口相关的知识,它们的复杂之处就在于此。这些复杂的驱动等需要的时候,或者有时间的时候再慢慢深入研究。(9)设备树为什么将设备树放最后,因为你不用设备树也可以,但是自从设备树出现之后,基本上大家都在使用。所以它已经成为驱动工程师的必备技能了。Linux推出这个东西,肯定是经过深思熟虑的,我们要顺应潮流。本期先分享到这里,想要进群学习单片机编程的同学可以私信我,回复“我要入门”,与我们一起成长,喜欢的可以点个赞关注我们!嵌入式软件可以深入的东西还有很多,包括算法,数据结构,设计模式等等。不论是单片机还是Linux它们的更新是非常快的,我们也要经常去关注它们。不能原地踏步。3、嵌入式技术学习路线分享嵌入式技术是各种电子产品的核心技术,也是工业4.0、远程医疗、3D打印等新兴产业的核心技术,具有广阔的发展前景。很多计算机、电子信息类专业的学生都想把嵌入式开发作为自己的职业目标,但是因为嵌入式涉及的知识太多,太杂,太广,很多嵌入式初学者陷入嵌入式知识的海洋中,东学一点,西学一点,找不到学习的方向。 我从事嵌入式开发工作有10年,嵌入式教学工作有6年,作为过来人,给大家谈谈正确的嵌入式学习路线,供各位嵌入式初学者参考,希望对大家有所帮助。嵌入式工程师需要掌握的内容非常广泛,主要包括嵌入式软件、嵌入式硬件、以及相关行业、产品的专业知识。作为嵌入式初学者,我们不可能,也没有那么多精力把所有的知识到搞的很精通,我要学会抓住重点,学会取舍,达到一通百通,事半功倍的学习效果。首先嵌入式技术主要分为嵌入式软件和嵌入式硬件2大方向。嵌入式硬件方向嵌入式硬件工程师主要工作职责是为产品设计硬件电路原理图,设计硬件PCB板,选择合适的元器件,焊接调试硬件电路板,保证硬件电路板的可靠性、稳定性和抗干扰能力。因为现在集成电路发展迅速,大部分集成电路厂商都会提供参考电路,所以硬件电路原理图的设计相对来说比较简单,硬件工程师工作的含金量主要体现在产品的可靠性和稳定性设计、以及电磁兼容设计,这才是硬件设计工程师的含金量所在。 一个资深的嵌入式硬件工程师年薪都在10万~ 30万之间。要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频CPU、多层PCB板的设计经验。嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和分析。嵌入式软件方向嵌入式软件工程师的职责主要是根据产品的功能需求设计好软件,让硬件工作起来。嵌入式电子产品硬件部分,大部分都是相同的,核心的都是由CPU、RAM和FLASH 几大部分组成,而软件就千差万别了。产品的具体功能都是由软件来实现的,一般来讲一个产品的实现,软件设计的工作量是硬件设计的4~5倍。所以一般情况下,一个公司的软件工程师数量是硬件硬件工程师的4-5倍,嵌入式软件工程师需求比硬件工程师大很多,同时跟硬件工程师相比,嵌入式软件工程师学起来相对容易些,所以这里我重点和大家谈一下嵌入式软件工程的学习路线。4、单片机实习经历想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。每个人都避免不了从学校步入社会工作岗位这个环节,实习的时候多少都会带着一些焦虑和不安,比较工作不是在学校学习。我们在实习的时候不要带着学习的心态,要带着做事的心态。领导永远要的是结果你能给公司创造多少价值,最多只能容忍我们边学边干。我刚入职的时候总想着先看点产品手册,看些视频,和在学校读书的模式一样,先过完基础再着手项目。领导可不会给我那么多学习时间,几乎都是让我们一周内或两周内完成自己的工作。而我只有学习是做项目的经验,多少会有些迷茫。两周从学生到员工的转变过程,真的非常痛苦。没有做项目级产品的基础,又要把工作按时完成,很多东西搜索引擎又查不到,查到了也不能完全理解。第二领导看到我还没有动手。就被嫌弃了一顿。我感觉压力很大自己非常焦虑。那时候就想着能力达不到态度要端正,每天早上7点起床,8点到公司,晚上10点才下班。刚开始的前三天很痛苦,每天早上睁开眼的第一个想法就是不想上班,晚上下班回家洗完澡躺在床上睡不着,都在头疼明天该怎么办,脑海里涌现出想辞职的念头。可是想着千万别轻易放弃最起码先坚持一个月学点东西再走。就一路坚持了下来。那几天我早上坐在电脑前,搞了好久没有什么进展,感觉完了又要白白耗费一天时间,这个问题死磕到晚上下班之前都没能处理好,还是没有能够找到办法解决。很神奇的是带我的导师来了一次突然的关心,为我指点了方向。它几乎没有时间指导我,他在我心里是属于那种能力很强但是不太善于表达的大佬。经过一个星期的煎熬我坚持了下来,后来我发现在吃饱的时候休息的那几分钟大佬愿意回答我的问题或者给我一些指导。往后的时间都会提前准备一些技术问题,吃完的时候问一问,我发现经常是大佬们的一句话,就能节省我好几天的时间,工作都能正常的按时完成。然后我就请组内的人吃宵夜,然后他们就跟我分享了很多有用的经验,我才知道工作中的人际关系还是需要灌溉的啊。为了能和大佬们有共同话题,我还根据不同人的不同喜好去补了相关的知识,足球篮球方面首先就要了解现阶段最强的人和队还有大佬喜欢的球队,不能站在他的对立面,还学了王者,经常去帮他们跑腿,路上主动和他们打招呼等。我都觉得我当时的样子十足的狗腿子一个。总之,因为我们的目的是学到更多东西,所以一定要谦卑,也要坚持。很多的时候是因为没人指点,就产生了放弃的念头。现在回过头看,发现真的很感谢那一个月层出不穷的问题和领导给的压力所带来的痛苦,让我各方面的能力得到成长,之后无论面对怎样困难的技术问题,都不会轻易就放弃,只要把大家的关系处理好,很多问题出现的时候我们就会左右逢源,总能解决这个问题。通过解决问题更加平和了自己的心态和解决问题的决心。我有一个大胆的猜想当时我的领导故意给了我一个难题,让我解决不了,自己主动的去加班。
点赞 18
评论 7
全部评论

相关推荐

中国外运吉布提 汽修售后店长 25K~30K/月
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务