如果不是平台提醒,我都不知道我已经写了三年博客了,真的很快,平台建议我写一篇分享文,我刚好也有点感慨,那就献丑简单聊几句吧。
2019年夏天我来到了深圳,在这里正式开启了嵌入式开发之路,那个时候虽然在学校做过不少项目,也参加过很多竞赛,实习的时候也学了很多东西。但是想真正做好一个产品,仅凭这些是不够的。于是在那段最艰难的岁月,我白天上班,晚上学习,,因为很多东西不懂,但是又不能拖项目的进度,所以哪怕是上下班路上我也经常在思考问题,思考那些在开发中遇到的问题,也在网上疯狂的查阅资料。那段时间很累,但是很充实。
也是在那个时候,我创建了这个账号,写下了第一篇博客,一开始写博客只是单纯想着记录自己的学习过程,总结经验,也为了加强记忆,提醒自己不要忘记曾经踩过的坑,但后来事情似乎慢慢的变了…
这一年我只写了寥寥几篇博客,而且访问量也一般般,直到年底发布了一篇关于光照传感器的博客,那一篇博客收到非常多的收藏和私信,也很多人询问一些他们在开发中遇到的问题,那时候我才知道,原来同路人何其多,很多初学者也走上了我走过的路。回想一下过去,我从前不也是那个在论坛上面寻求帮助的小白吗?那时的我也在前辈那里学到了不少,现在该轮到我为后来者撑伞了,或许这也是一种“传承”吧。至此,写博客的初衷已经悄然改变,我不单单是记录自己的经历,也想为更多的后来者引路。
虽然我不是什么大神,但是我觉得我走过的路很多人也正在走,所以我觉得有必要分享一下我这几年的所得,希望能帮后面的人少走些弯路。
PS:这些都是我自己的一些见解,请理性看待,不喜勿喷。
自身情况:
先大概说说我自己的一些情况吧。大学,平平无奇,但是参加了很多电子类竞赛。实习是在一家小公司,最开始是做硬件(因为本身我学的是硬件),后来软硬件都做(软件除了学校教的51,其他都是自学)。来深圳之后去过小公司,中型公司,也去过世界五百强的企业,现在正考虑转到另外一家五百强企业。简单的来讲就是啥都干过,特别是在小公司,那真的是啥事都做,不过好处是你可以了解到更多与产品研发相关的东西,以后如果想自己创业的话绝对用的上。
嵌入式软件开发的路线:
嵌入式开发大体上可以分成MCU和Linux两大类,然后两大类里面又可以细分成多个子类。
1、MCU一般就是围绕单片机做开发,这个细分比较多,比如做外设驱动的,做应用开发的,跑操作系统的等等,用到的MCU也是五花八门,很多很杂而且这些细分也不一定是独立的,很多可能是会交叉出现,特别是小公司,基本就是全栈都做。然后除了这些细分还有行业的细分,比如做显示的,做音频的,做控制的等等。如果是刚入门不久的话不着急选方向,各个方向都可以去尝试一下,然后可以选择某些方向继续深入,积累行业相关经验。这对你的能力提升以及全局观会有帮助,公司从来都不缺技术人员,缺的是能够统筹各种技术的人员。你如果只会一门技术,那顶多是一颗螺丝钉,还可能是随时可以替代的那种,除非你在这个方向上到达了一个非常高的台阶。
2、 Linux大体上可以分成应用和驱动两大类,应用的话就是类似于电脑手机软件,在Linux系统下做一些应用程序,相对于单片机开发而言更偏向于软件,很多时候可以脱离硬件来调试,因为这个Linux不像单片机那样直接操作寄存器,Linux一般是通过底层传上来的接口来间接控制底层驱动,而单片机更依赖于硬件,调试的时候不仅仅要看软件,也要检查硬件是否正常,有时候会调的很累。最后是Linux的驱动开发,这个我觉得可能是嵌入式开发的天花板了吧,Linux底层涉及到的东西真的是太多了,你需要懂很多,软件、硬件、架构等等,这些你至少都得了解一点。
单片机更适合用于那些功能较为单一,稳定性要求强,启动速度快,成本要求低的产品,而Linux设备则用于高端一点的产品,但是成本会高很多,而且开关机都是需要较长时间的,稳定性也不好说,毕竟整套系统的东西太多了,更容易产生bug,因为东西多了你就比较难保证所有模块都能正常运行。
这些路线具体怎么选,还是看个人的喜好吧,职业无分贵贱,任何一门职业只要能做到顶点,那都是非常厉害的。
自学路线:
我的学习路线挺坎坷的,你们看看就行了,不要学。
1、硬件开发(PCBA),我本身是学硬件的,但是说实话,在学校学的东西都太浅了,实际上硬件懂的不多,但是对于嵌软开发是足够了。
2、单片机软件开发,包括51、stm32、stm8,主要以stm32为主,项目的内容基本都是控一些外设,比如各种传感器,显示屏等等,这个阶段是我停留时间最长的一个阶段,因为你想把驱动搞得很熟的话是需要大量的调试经验的,很多东西看着原理很简单,但是实际上手又是另外一回事了,你可能会遇到各种各样奇葩的问题,有软件的问题也有硬件的。但是当你熟练掌握一种单片机以后,换成任何一款单片机,你都能非常快的上手,因为原理其实都是差不多的。
3、单片机操作系统,包括RT-thread、FreeRTOS,从单片机裸机到操作系统,这不仅仅是架构的改变,也是思维的改变,裸机代码更偏向于底层,很多东西都是可以盘根问底的,可以溯源到寄存器的操作。但是上了操作系统之后你更多的是在做应用的开发,很多底层的接口你不会去管它是怎么实现的,因为底层套了很多层壳,虽然也能盘根问底,但是没有这个必要,当然了,如果时间和精力足够的话,可以去深入了解。另外,操作系统是有线程,进程这些的,这与裸机的操作是不同的,也正是因为这些,在处理复杂的应用时会比裸机操作方便很多,运行的效率也更高。
4、其他MCU的开发,自动芯片价格暴涨之后,很多国产IC的替代方案应运而生,我也接触和使用过很多,比如GD32、乐鑫ESP系列、Arduino、沁恒CH32V系列、STC32等等,就还是我之前说过的那句话,当你熟练掌握一个单片机之后,换成其他MCU,很快就能完成移植和开发调试。这些MCU的调试经验算是一种查漏补缺吧,因为不同的MCU架构和使用上还是有差别,通过比对你可能会对MCU的运行逻辑了解的更加透彻。
5、Linux应用开发,Linux相比于单片机而言性能上要更加高端,单片机更多的用于控制,对于大量数据的复杂运算是很难做的,因为硬件的性能摆在那,无论是内存容量还是CPU的运算能力都是不够的,而Linux则可以运行较为复杂的算法,比如图像处理,音频处理等等。
6、Linux驱动开发,这部分我觉得是嵌入式开发里面最难的一个,我现在也是在摸索阶段,而且可能需要很长的一段时间来探索学习。
心得:
从硬件开发到单片机裸机开发,到操作系统的运用,最后转入Linux,我这个历程可以说是一言难尽,因为我一开始也不知道自己想做什么,能做什么,只是见一步走一步,最后从一步一步走出了迷茫期,走向了Linux方向,其实如果一开始就明确目标的话,完全是可以跳过单片机,直接从Linux开始上手的。但是我也不后悔,我觉得现在学到的这些东西都很有用,我也热爱我这个职业,我只是希望同学们能少走一些弯路。
从入门到现在不知不觉几年过去了,这几年挺累的,中间还有很长一段时间没发过博客,那是因为真的累了。但日常的记录和总结还是有的,只是没有时间去整理发文,因为我不想发一些没质量的文章(这篇除外哈)。
这几年下来,我觉得总结是一个好习惯,不一定说要写成文章,只要能帮助你记忆,或者很方便的能够查阅到就行了,因为只有你记住了才是你的经验,也是你提升能力的重要因素,如果记不住那就等于没有。你能记住的坑越多,以后遇到了相同或者类似的问题时,就越不容易采坑。
最后,我建议大家还是可以尝试一下写博客的,当你尝试着用一篇文章去教会一个不懂的人,你就会发现,你需要了解更多的细节,需要对整个问题了解的更加透彻,才能给人讲明白的,这其实也是一个查漏补缺的过程。
好了,今天的分享就到这里吧,感觉好像说了很多又好像啥都没说,你们就当我是在感慨过去吧,感谢耐心看完的同学,祝各位一路顺风,我们顶峰相见。