我2011年毕业于三流本科学校,大学学的是电子信息工程。 毕业后通过人脉进入了这个行业的公司,做硬件开发。 我在大学里几乎没有学习,我所做的一切就是玩耍。 其实现在想起来,大学真的很有趣。 只是遗憾大学毕业时没有考研,没有考公务员。
回到正题,我学习很差。 刚进公司的时候我什么都不懂。 我不知道简单的上拉和下拉电阻的含义。 我不知道晶体管用的是什么开关插座。 我记得我们领导当时说过一句话:你们是我见过最差的研发基础。 接下来的四年里,我在这家公司工作了,我也逐渐适应了工作。 不得不说,应届毕业生真是充满活力。 我还要感谢自己当时的努力和付出。 慢慢的基本上我也熟悉了硬件开发。 我还可以独立设计电路,制作独立的MCU系统,独立的画板等等,所以我想说,每个对电子行业感兴趣的人,不要怕基础差。 只要你开始有了工作,并且有学习的意愿,一切都会慢慢的熟悉起来,上手的。
从2011年到2014年,我在一家公司工作了四年。 公司属于国有企业第三产业,工资不高。 但公司管理层级清晰,文件严格按照9000标准执行。 公司各部门也依赖文件。 在沟通方面,部门确实非常融洽。 有老人,也有年轻人。 每个人都一起工作。 基本没有什么内心挣扎,工作很轻松。 我经常有时间听他们一起讲古代历史,讲山。 现在的公司档案很乱。 采购BOM与生产BOM完全不一致。 研发没有BOM备份。 原人离开后,原文件就找不到了。 负责研发的老板直接绕过研发经理,和具体的研发人员对话。 感觉研发经理就好像我只是一个杂工,但是研发经理上个月辞职了; 现在公司研发人员并不多,而且几个项目同时进行。 领导只会压榨你的时间,推动你的进步。 对此我想说的是,如果你是应届毕业生,我建议你选择规模较大、管理相对成熟的公司。 即使你没有小公司那么全面的技术,你得到的也是一个管理模式头脑和一个体系。 研发体系和起点不会让你进入职场时失望,但也可能会让你后续的工作感觉很不理想,就像我现在一样。
应该去大公司还是小公司?
我去年9月份辞职,然后搬到了一个相对陌生的城市发展自己的事业。 说实话,我是因为我的伴侣喜欢这个城市,才来到这里的。 刚辞职的时候,我找到了一家物联网公司。 因为理解不深入,工作一个月就辞职了。 那次辞职是赤裸裸的辞职。 辞职后我的压力很大。 我一直在寻找工作并找到了真正合适的工作。 这份工作只能在这个行业。 其实从2014年初开始,我就对硬件开发的工作有些厌倦了。后来迫于生活的压力,又临近过年,原来市里的一家世界500强公司录用了我,我暂时回到原来的城市工作,我和伙伴暂时分居两地。 进了500强公司后,我确实觉得和小公司不一样,但说实话,大公司的人际关系太复杂了。 这比我想象的要复杂。 一个根本不懂研发的人来管理研发。 不懂电路的人做电路设计,刚毕业的人就敢用DSP写的程序做小批量。 唉,我们不谈这个了。 今年3月,我再次辞职,因为我觉得我和伴侣在不同的城市。 然而,我也错过了一次在大公司晋升的机会。 那时候如果我成为一家大公司的全职员工,我可以自己负责电路开发(其他人都是我不懂),但我也不后悔。 看看他们那些低级官员,一个个都疯了。
辞职后,我开始了新的求职过程。 大约一个月后我找到了现在的工作。 我辞职了,像剩女找对象一样找工作。 我会慢慢降低自己的要求,然后就来到了现在的公司。 公司有10多名研发人员,但PC太多。 共有5人从事MCU和产品硬件工作。 目前的感觉是,公司的管理特别混乱。 没有完整的产品研发-生产体系。 开发的新产品出货速度太快,导致后期维护量巨大。 制作也很混乱。 如果选矿厂生产 100 台,则至少会生产 100 台。 超过40台就会出现问题。 刚才领导过来催时间。 研发这边的领导也是个笑话。 他只知道怎么推,不看具体的工作数量和质量。 文件管理如此混乱。 说真的,老板一想起来就叫你出这个文件,第二天又叫你出那份文件。 真的很烦人。
在这个行业工作的时间越长,你就越会明白,如果你想在这个行业继续下去,你要么自己有好的项目可以做,要么有兴趣,要么遇到一个让你想追随的好领导。
关于选择工作,我个人觉得毕业后如果有机会进大公司,就一定要进大公司。 系统的公司可以给你系统的培训,给你一个整体的工作思路。 当然,小公司比小公司好。 如果你做任何杂事,你肯定会学到很多东西,但绝对不利于你的长远发展。
谈论招聘
自2012年以来,我一直看到人们谈论如何学习嵌入式。
微控制器ARM Linux C汇编C++ QT驱动讲这些话。
不知道是培训机构的影响还是其他什么。
一大群新手开发爱好者迷失在Linux驱动开发、Bootloader移植、QT移植中? 这是非常令人心碎的。
如果你是学生,如果你是即将转入嵌入式开发岗位的兄弟。
在Linux环境下,编写一些C代码并实现一些数据结构,练习基本语法和算法。
调用open read ioctrl,然后写一些进程线程和网络,做成一个工程。
扎实扎实的基础是我们在招聘初级工程师时最看重的。
软硬兼备,无后顾之忧
据网友光华巨石介绍,“嵌入式软件工程师需要双手熟练!” 嵌入式软件编程与PC软件开发明显不同,它与硬件密切相关。 想要写好嵌入式软件代码,必须了解所使用的MCU的硬件特性以及各个外围电路和接口电路的原理。 不仅要深入了解MCU核心架构的知识,是否支持浮点处理器/DSP,是否支持协处理器和指令数据缓存。
还需要了解MCU的编程模型、各种存储器的地址空间分配及其访问效率。 除了MCU之外,还要了解各种电路知识,哪里需要下拉,哪里需要滤波电路,哪里需要。 隔离,必须添加抑制装置等。
为什么我们需要了解这个水平?
1、软硬件结合,更好地实现用户需求。 例如输入捕捉,如果是通过上升沿或者下降沿来捕捉,添加不合适的滤波电容会导致边缘损坏,而不添加滤波电容则会被各种空间干扰产生的杂波所困。
如果硬件工程师安装了不合适的电容的电路,导致边沿之间的位宽失真,偶尔会出现数据异常的故障。 如果硬件工程师安装了没有电容的电路,导致软件无法正常工作。 工程师必须进行软件过滤,使得代码变得复杂且难以理解。 你怪谁?
2.方便定位bug。 爱因斯坦曾经说过:“提出问题往往比解决问题更重要,因为解决问题可能只是一种数学或实验技能,同时提出新问题、新可能性和新想法。从角度看待老问题需要创造性的想象力和标志着科学的真正进步。”
研究硬件电路可以帮助软件工程师想出更多解决问题的思路,发现更多导致bug的可能性。 一般来说,遇到bug时,对硬件了解甚少的软件工程师只做代码层面的工作,很少询问硬件方面的问题。 最后,他们不假思索地设计了极其尴尬的代码来迎合蹩脚的硬件。 ,只要稍微改变一下硬件设计,就可以轻松优雅地完成代码设计。
3. 如果你有很多技能,不要压倒自己。 向别人寻求帮助比向自己寻求帮助更好。 当我们对硬件电路设计产生疑惑的时候,如果我们悄悄拿起烙铁,飞一根线,换一个元件,验证一下我们的想法,然后挺直身子,拿着板子,自信满满地去找硬件工程师,不是吗?算是万事顺利,还帮个忙?
如果你只是抱着板子,心软,一脸胆怯的去找硬件工程师,一场口水战在所难免。 不说血雨腥风,最后硬件工程师硬着头皮给你调整了电路。 它确实解决了问题。 如果你的想法错了,那不是自找麻烦吗? 我只是去工作挣点钱养家糊口。 做一个好老人,和同事们一起玩得开心,真是太好了。 你们吵架又辛苦,为什么还要来这里?
然而,实践中嵌入式开发所需的知识体系和技能80%实际上与硬件平台相关。 例如,计算机系统原理、编程技巧、程序编译和链接、对Linux内核、设备模型、驱动架构、项目管理等的理解。
对于真正和硬件平台相关的事情,比如驱动开发,上面的框架是独立于平台的。 下面针对各个硬件平台的适配部分,可能和硬件平台有关,比如寄存器配置、开发板硬件配置等。对于嵌入式工程师,尤其是驱动开发工程师,工作后你会发现,与应用开发相比,实际要写的代码量很少,往往只需要改几行代码。 但往往这几行代码需要你有深厚的背景知识:硬件知识、通信协议、芯片和开发平台资源的掌握、Linux内核架构、设备模型、驱动框架的理解。 这些是嵌入式工程师的技能。 核心竞争力。
如果你看到很多广告以开发板或者平台为噱头,以能拿多少薪水作为升职,你心里应该有这样的意识。 这是一种促销。 薪资根据你自己的水平和市场情况来决定。 虽然面试时HR对自己水平的评价会出现一些误差,但你一定要相信时间会证明你的真正价值,不断提高你的知识水平。 技能是必经之路。 真正的技术需要花时间去吸收、积累、消化、内化成自己的知识体系和技能。 外在的心灵鸡汤或者高煮的老鸭汤只能让你暂时热情,制造暂时的幻想,而不能真正提高你的技能。
学嵌入式≠学ARM≠学开发板
王立涛介绍,很多嵌入式初学者认为学习嵌入式就是学习ARM、学习开发板。 买一块开发板,然后在上面“移植”u-boot和Linux内核,然后用busybox制作根文件系统,就大功告成了! 我感觉我可以出去找工作了。 这其实有些片面:首先,ARM是一种CPU架构,就像PC上的X86架构一样。 你见过有人在Windows下学习C/C++编程、MFC编程、网络编程、Internet编程吗? 你有没有说过你正在学习X86? ? 当然,不可否认的是,嵌入式平台的多样性和硬件的可定制性,要求我们在嵌入式平台上开发应用程序和驱动程序之前,首先要构建平台,就像我们在Windows下安装操作系统一样。 但这只是我们学习嵌入式开发的第一步。
其次,关于系统的“移植”,很多人在玩过开发板后,都会在简历上写上移植过u-boot、Linux内核……其实,这种写法也有些缺陷。 真正的移植,把一个u-boot或者Linux内核移植到一个新的芯片或者开发板上,不是一个人能做的事情,而是一个团队才能做的事情。 时钟、DDR和存储可能涉及各种模块。 哪里出了问题,每个模块的负责人都需要去调试。 有时甚至可能是芯片的bug,或者是硬件开发板的bug,这就需要我们用软件来解决。 ,要避免这个坑,这就需要我们在短时间内,甚至一两天的时间内解决这个问题,并且需要各个模块的专家团队共同努力才能完成。 所以,我们所说的“移植”,其实就像是在Windows下安装一个操作系统,按照步骤完成安装。 当然,通过这个过程,我们可以加深对嵌入式系统的理解,但首先我们要知道的是,我们“移植”的系统是芯片公司团队制作的系统镜像。 我们所做的只是配置、编译、安装甚至升级这些基本操作。 这些环境只是我们学习嵌入式开发的一个平台,万里长征才刚刚完成了第一步。
嵌入式技术变得越来越复杂,一颗SOC芯片上集成的模块也越来越多。 以手机为例。 对于一个典型的嵌入式产品,我们看看上面集成了多少个模块:触摸屏、LCD、USB、WiFi、4G等无线通信、音视频编解码器IP、DDR、存储控制器、3D/2D加速、GPS、指纹识别、NFC、DMA、G-sensor以及各种传感器……可以说,现在手机的复杂程度和硬件配置已经超过了我们的台式电脑。 再加上不断增加的硬件和软件,比如Linux内核,光是内核代码就超过1000万行,每天更新的速度超过了你的学习进度。 你能学会嵌入式技术的所有知识和技能吗?
在早期的PC时代,我们知道只有少数几家公司能够量产X86 CPU,其中包括Intel、AMD和VIA。 然而嵌入式时代就不一样了。 ARM的IP授权模式导致了数百家不同芯片制造商的出现。 不同的SOC平台和开发板让人眼花缭乱。 针对不同行业需求定制的SOC平台如雨后春笋般涌现:手机芯片、平板芯片、视频安防、物联网、汽车电子、工业控制,甚至人工智能AI芯片……,可以去ARCH Linux内核看看有多少个CPU架构,然后去arch/arm看看有多少个开发平台。 这些只是已添加到内核主线的平台。 算上尚未加入Linux内核主线的各个平台,数量其实更多。
众多的芯片架构和不同的开发板平台我们应该如何学习呢?
嵌入式和PC的概念正变得越来越模糊。 英特尔推出了X86架构CPU和嵌入式产品,例如平板电脑。 ARM也开始进军服务器和笔记本领域。 无论什么CPU架构,ARM、X86、MIPS、PowerPC,还有最近火热的物联网芯片,无论是嵌入式产品、PC、还是服务器,其底层本质都没有改变,都是计算机原理和系统架构。 ,都是冯诺依曼的计算机架构和图灵原型的各种实现。
日益复杂的软硬件系统对于嵌入式工程师或学习者来说是一个挑战。 这对我们自身的知识和技能提出了更新的要求。 在早期的51单片机时代,我们可以使用面包板或者自己画PCB,制作开发板,然后在上面开发软件。 所有的软件和硬件都是自己做的。 现在SOC平台越来越复杂,基本上不可能一个人全部搞定,把所有的软件和硬件都搞定,这也导致需要分工合作才能完成。 首先,软件和硬件分工合作,各司其职,各自精通自己的领域,然后软件和硬件整合,协同开发。 第三,在软件方面,嵌入式软件越来越复杂。 Linux内核有超过1000万行,android源代码下载占用了几GB的空间。 比如android需要分为BSP工程师、Linux内核工程师、驱动工程师、android中间层开发工程师、APP开发工程师。 对于一个Linux内核来说,也是需要分工的,各个模块也分:USB子系统、音频子系统、视频编解码器、Linux内核的文件系统……如果你精通其中一个模块,工资就高了。绝对不是问题。
对于嵌入式学习者来说,我们应该学什么,或者如何学? 为了提高自己的职场竞争力,或者对于一个新手来说,如何通过自学达到公司的用人标准和技术要求,并找到自己想要的工作呢?
首先,你必须学会如何做减法。 从实际出发,必须有这样的认识:我不可能精通所有嵌入式技术,要学会坚持,设定合理、现实的小目标。 很多人喜欢那种不切实际的广告轰炸式营销,击中某个心理弱点、某个G点,顿时兴奋起来。 越来越浓的心灵鸡汤并不能解决我们生存的现实。 很多人,包括我在内,都喜欢在学习的时候给自己制定各种路线、计划、时间表。 计划是带着如此多的激情、如此热情、如此兴奋而无法入睡的。 计划宏大而充实,仿佛成功在望。 但往往不切实际,往往在前期,遇到各种困难、各种陷阱、各种拖延导致无法坚持下去,最后消亡。 然后继续制定下一个宏伟计划,继续死去,生活周而复始,日复一日。 环顾我们的人生,真正做出成绩的人,都是那些立足现实、能够一路坚持、日复一日的人。 有时你会发现你并不认为他们很聪明。
其次,保持兴趣,说白了就是坚持。 我见过很多人想学嵌入式,花了很多钱买了开发板。 他们充满激情。 过段时间再看过去,我就不用再担心了。 嵌入式开发难,难在什么地方? 主要在于开发环境的搭建和软件调试。 与在Windows上使用VC开发程序不同,集成开发环境已经全部帮你做好了,包括各种断点、单步、查看堆栈、寄存器、内存窗口等。 嵌入式就不一样了,硬件环境搭建会遇到各种各样的问题,各种电脑兼容性问题,各种莫名其妙的问题,有时候真的让人抓狂,时间长了,学习的热情慢慢的疲惫了,就再也不想学习了。 这没什么大不了的。 更严重的是,很多人在学习嵌入式技术时都会遇到挫折,这往往会伤害人的自信心。 他们觉得自己能力不行,智商不够,不适合这份工作,留下了心理阴影。 对于个人学习者来说,买了开发板,如果不买配套的万用表、示波器等调试设备,就会束手无策,无法解决硬件问题。 其实我们完全可以利用其他平台来进行我们的研究和学习,比如QEMU,一个可以模拟开发板的开源软件。 利用这个开源软件,我们可以在电脑上虚拟出一个世界上流行的开发板,然后运行u-boot、Linux内核,在这个模拟的开发板上挂载根文件系统,使用与开发相同的源代码板,运行效果与真实开发板相同。 而且,使用QEMU的好处是“硬件”永远不会出错,这可以让我们避开各种硬件坑,腾出更多的精力去研究嵌入式软件的各种架构、编程技巧、内核驱动等。 ……,这些都是嵌入式工程师的核心竞争力,需要大量的时间来积累、适应、提高。 把大量时间花在一个不应该属于学习范围的硬件bug或者硬件环境不兼容上是不划算的,因为以后你进入公司后,如果遇到同样的问题,找个硬件工程师,半分钟帮你解决。 因此,选择一个理想的嵌入式学习平台非常重要,尤其是对于初学者来说。
最后,要保持学习的深度,刻意练习。 不要让自己永远停留在学习的舒适区,要学会挑战自己,不断拓展自己的知识边界,完善自己的知识体系和技能。 很多人买了一顿饭,按照教程“移植”了u-boot、Linux内核,做了根文件系统,然后就陷入了迷茫:下一步做什么? 学习什么? 我想学但是感觉不能深入。 我东翻西翻,看看这个,看看那个,时间不知不觉就过去了。 其实学习嵌入式,基础的嵌入式知识和理论学习还是有必要的。 许多人主张边做边学、在项目中学习、通过实践来获得真知。 当然,这也是一种方法,但是也有缺点,那就是学习不系统,很多有心人还是要后期回来补课,提高自己的知识体系和技能。 很多人玩开发板,烧写镜像,偷偷摸摸的玩,但是你知道其背后的原理吗? 你知道如何下载JTAG吗? Jlink和JTAG有什么区别? 为什么我的 PC 上需要安装 JTAG 软件而不需要安装 Jlink? 程序是如何编译和链接的? 为什么内核映像要下载内存中的某个地址? 我可以更改地址吗? 为什么我们编写的程序必须运行在操作系统环境中? 你能写一个在ARM开发板的裸机环境下运行的程序吗? 只有深入思考这些问题,你才会对嵌入式有更深的理解,超越平台,无所不知。