说说我自己的情况。
专业:电子信息科学与技术
大一学了C语言(好家伙,那老师教到指针就跑了),C语言估计入门都算不上。好在大一就参加了电子设计大赛的培训,起码keil这软件开发环境熟悉了,点个LED,搞个电机啥的问题不大。(那时候还没学电路数电,我连高低电平都不知道是啥)
大二学了电路,而模电数电是疫情期间学的。懂得都懂,疫情期间大伙的学习“形式”我就不戳穿了。
大三才开设单片机这么课程,而由于大一的时候玩过单片机,觉得好容易上手,课程设计什么的一人全包哈哈。
随后开始考虑职业规划了,要不就走嵌入式这条路吧。
于是顺势自己掏钱买了个stm32的板子,在这里打个广告。
**普中的板子便宜,配件又多,挺适合学生党的。**个人是买了普中的板子学stm32,资料去正点原子找,普中视频看不懂就看火哥的视频,还不懂就去正点原子论坛问问题。
stm32学了一段时间,自己也搞了一些小项目。
大三下学期终于开嵌入式这门课了,可惜不是搞Linux的方向的。课程设计也是用我自己买的stm32板子嘎嘎乱杀,顺势还收点小钱把其它组的也做了。
此外,还开设了实时操作系统系统这门课。好家伙,搭上UCOS II实时操作系统后,我又多了好多个中断,爽歪歪。
可惜的是,我买的stm32f1的板子主频才72MHz,flash才512k。分几个任务就紧张起来了,再上个gui界面,卡得要命啦。
幸亏开这门课的老师所属的那个学院有stm32f4的板子,我死皮赖脸地去借来耍耍。简直爽炸了好不,主频超过一百Mhz,跑gui界面起飞,屏幕又大。搞个指纹解锁,再搞个滑条控制呼吸灯亮度,简直不要太爽。可惜老师只借我几节课…
大四的时候,以为学院会开Linux课程的,没想到只开了微机原理(别问,问了我也不知道学院为什么这么晚才开微机原理)。当然啦,我那时候也在准备考研,无论开什么, 都不可能去听课的了。
现在春招在找工作。考研数学考寄了,调剂也不好调,有点难受。面了几家公司,也拿到一些offer。大多数都是叫我跑MCU或者搞个实时操作系统等之类的。很少有要搞Linux底层启动的要我,毕竟我没怎么学。
好了,不扯远了。
我不知道你什么专业,反正我专业是软件硬件都得学,信号通信也得学。
嵌入式很庞大,有走硬件的,也有走软件的。
(1)如果你只是停留在51这地方,那你大概率只能找单片机相关的工作了,还有自动化那边的PLC也能搞;
(2)如果你再往上走一个层次,接触到一些ARM,比如stm32,那你可以往嵌入式开发走,很多公司的产品都可能会用到stm32,或者即便用不到,你懂得用stm32,再跳去用其它也不会太难。
(3)如果你再再往上走一个层次,接触到操作系统,特别是Linux这些开源系统,可以搞底层驱动,也可以搞应用层开发。
再再再往上走的话,噢,我还没到那个层次,我不知道了。
一起学Linux吧,我毕业设计就要用到Linux。
收藏比点赞还多啊…
目前我已经签了工作,想分享一下一些求职经历吧。大部分都是和嵌入式相关的。
学历:双非一本
准确来讲是某省里面非985非211非双一流的高校中排第一的高校(疯狂狗头)。
个人技能:
C语言单片机编程,上位机编程,VHDL硬件描述语言,EDA,嵌入式开发(比较熟悉STM32,STM8,51),实时操作系统 UCOSII,图形界面GUI开发(LVGL),数据库搭建,具有基本的电路,数电,模电基础。
好像大概就这些吧,搭建编程环境还有仿真软件就Keil,IAR,AD,Proteus,Multisim,MATLAB,SQL Server,Quartus,visual studio这些吧。
我们这专业啊,很蓝的啦。学得东西就是这么多这么杂,不然也大家也不会挤破头皮想读研究生。
秋招参加的面试:
TCL(通过)
我当时在准备考研,辅导员要求考研的也要投简历,我就随便投了TCL。
面试意外的通过了,也算是人生第一个offer,当时有点感动哈哈。但觉得随意签一个保底也有点草率,备研也没有精力在秋招找更好的了,所以没有打算签。
不得不说TCL的面试过程真的很舒服,我记得去年9月份的时候,我还在图书馆复习专业课。突然就接到TCL的面试电话,由于这是我第一次面试,没经验。我马上赶回寝室搜索一些TCL的面试经验。
下午就带着忐忑的心情去面试。和我一起的还有另一个人,不过他比较难受,因为我在他前面先面试,结果面试官面了我快一个小时,他估计等困了哈哈。
面试过程一直和面试官谈笑风生,哪怕问你问题,你回答不出来都是微笑着引导你回答。个人感觉主要是想看你有没有这种方面的思考能力,重在培养你而不是想社招那样找个完备工作能力的人吧。
挺满意的一次面试。对哦,TCL的HR面要英文自我介绍的哈哈,当时我打哈哈就蒙混过去了,确实自己也没咋准备。
春招参加的面试:
1.广州——邦普电脑技术开发——软件工程师(通过)
这是我春招第一家面试的公司。总体来说面试体验非常差。一共有三轮,笔试一般,需要看得懂寄存器操作,技术面还好,最多算得上是压力面。后面的HR面简直要命。
技术面问题:
①说一说你是怎么调试单片机程序的。
②说一下你对spi协议的理解。
③说一下你编写实时操作系统和裸机的程序有什么不同的地方。
④说一下你对昨天笔试的题目理解。
⑤说一下stmf4和f1官方库函数的理解,你觉得和你自己编写的代码有什么不同。
…(还有很多,不太记得了。反正给人的感觉就是一直在逼问你,直到你回答不出来为止。一个问题我回答了4种方案还在逼问我,就比较难受。)
HR面:HR面体验非常差,问你很多和大学不相关的东西,比如你高中在哪读?是重点班还是普通班?高考成绩多少?数学多少?语文多少?英语多少?理综多少?你为什么不选择复读?
还问了一些很隐私放问题,你父母在哪工作?什么职位?你家里有多少人?还问一个奇奇怪怪的问题,你为什么不考虑创业?(我要创业我还来面试?)
最后HR得出一个非常非常之“精妙”的回复:经过和你的交流,我得出一个结论。你给我的感觉就是你在大学里一事无成。(一谈薪资就这?PUA起来了?)
如果不怕烦,也不怕PUA的话可以去面试这家公司。我个人认为HR给应聘者的感觉也多多少少带上部分公司的工作氛围,具体工作氛围咋样我不清楚。面试的时候我也问过HR:“我在网上法案里面找到2018年(反正16-18年之间)你们公司未经员工的意见直接把员工的办公东西搬出去并且强制没收钥匙。”
——————2022.5.30编
2.深圳——古瑞瓦特——软件工程师(简历不通过)
这家公司是做新能源的,具体啥方向我忘了。我投的是软件工程师的岗位,笔试题目好像有叫我画buck电路,反正就那电源电路那些东西,还有一些编程题目,有递归类型的题目。有点久远了,忘了很多。
现在想来就有点离谱,我舍友投的是硬件工程师的岗位,他有题目不会做,我帮他做了一些。最后反倒他拿了offer,我得到的通知是简历不通过…
可能是我太菜了,或者是公司的软件工程师锁HC了?
反正算是挺懵逼的一次投简历…
——————2022.7.28编
3.深圳——正浩创新科技——机器人嵌入式软件工程师(面试不通过)
这个面试巨难,对于我来讲太难了。
给的钱确实多,月薪18K(官网上面就是这样写的,具体多少我没到问的那一步)
我只到了第二个环节,第一个环节是笔试,笔试有一定难度。前面的都是选择填空题,后面的需要你在线编程,然后跑代码。嗯,两道这样的题目。一道是冒泡,另一道是二分法。
笔试轻松通过,面试真的是地狱。
问的问题就像把你当成工作四五年那样,问你做项目要考虑什么,叫你解释操作系统原理,解释堆和栈,说一下你简历上的项目的某一部分的知识。反正问的问题基本都是我平时没怎么留意的…
自我感觉只能回答6,7成。结果也是预料之中,面试没通过。
还是太菜了。
——————2022.7.28编
4.珠海——格力——电控软件工程师(通过)
5.深圳——比亚迪——BMS软件工程师(通过)
6.广州——深南电路——工艺工程师(我都不知道通没通过)
7.广东——南方电网——通信类(报名搞错了)
8.深圳——理邦精密仪器——软件工程师(简历不通过)
9.惠州——九联科技——嵌入式工程师(通过)
10.东莞——立讯精密——研发工程师(通过)
11.珠海——艾派克——嵌入式工程师(累了,不想面试了)
12.深圳——XXXX国企——嵌入式工程师(已签)
13.广东——中广核——技术支持类(被耍了)
14.广东——中国电信——偏软硬岗位(笔试未通过)
15.广东——中国移动——偏软硬岗位(三面后等通知)
16.广东——事业编制——符合专业的岗位(等待考试通知…)
有空再写写面试经历吧,有需要的小伙伴自取。
2022年5月5号
后续写的面试经验仅仅代表个人主观意见,真实情况咋样仁者见仁,智者见智了。
只谈面试经历,不谈薪资敏感问题。
电子类专业还是进实验室会好很多,隔壁班实验室的大哥大三的时候联发科就来挖人了,真的太猛了吧(╥﹏╥)。
2022年7月28号
23届的学弟学妹,找工作咋说呢。说难也不难,说容易也不容易。
只能说想找到自己能力对应薪资的工作确实要上心一些。
秋招找到的概率会比春招大很多,不考研的同学赶紧找啦,考研的也别放弃考研,春招还是能找到工作的。
最近很忙,入职好多事情都要办。有时间再继续写面试经历。
https://www.zhihu.com/question/521302931
想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。很多人都不知道嵌入式怎么学,这一期我就简单说一下我的理解。嵌入式这个概念太广了,可能很多人认为嵌入式就是嵌入式Linux。但是其实并不仅仅只有Linux,像STM32,51单片机也属于这个范畴之内的,它们有的也可以跑协议栈,跑ucos等系统。
嵌入式是有很多方向的,选择一个你觉得发展前景不错的方向,做好,做精了都会有前途。接下来,跟大家探讨一下嵌入式的一些方向,和如何去学习。我以前也是摸索着过来的,没人告诉我如何学习,也没有学习线路,所以走了很多弯路。
嵌入式方向
单片机开发在这个市场上的需求还是很大,单片机公司业绩并没有下滑,**单片机的领域在工业控制,机械控制等上面会比较多一些,当然也会涉及物联网。**单片机有8位,16位,32位的,一般8位用得比较多的就是51单片机和STM8,32位用得比较多的就是STM32。**一般学完51和STM32之后,找个单片机的工作应该是没什么问题了。**单片机的门槛不算高,但是做好也不容易。
很多人都不知道“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) STM32
STM32属于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它们的更新是非常快的,我们也要经常去关注它们。不能原地踏步。
https://blog.csdn.net/mrhjlong/article/details/51456060?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-51456060-blog-106409695.pc_relevant_multi_platform_whitelistv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-51456060-blog-106409695.pc_relevant_multi_platform_whitelistv4&utm_relevant_index=6
嵌入式技术是各种电子产品的核心技术,也是工业4.0、远程医疗、3D打印等新兴产业的核心技术,具有广阔的发展前景。很多计算机、电子信息类专业的学生都想把嵌入式开发作为自己的职业目标,但是因为嵌入式涉及的知识太多,太杂,太广,很多嵌入式初学者陷入嵌入式知识的海洋中,东学一点,西学一点,找不到学习的方向。 我从事嵌入式开发工作有10年,嵌入式教学工作有6年,作为过来人,给大家谈谈正确的嵌入式学习路线,供各位嵌入式初学者参考,希望对大家有所帮助。
嵌入式工程师需要掌握的内容非常广泛,主要包括嵌入式软件、嵌入式硬件、以及相关行业、产品的专业知识。作为嵌入式初学者,我们不可能,也没有那么多精力把所有的知识到搞的很精通,我要学会抓住重点,学会取舍,达到一通百通,事半功倍的学习效果。
首先嵌入式技术主要分为嵌入式软件和嵌入式硬件2大方向。
嵌入式硬件方向
嵌入式硬件工程师主要工作职责是为产品设计硬件电路原理图,设计硬件PCB板,选择合适的元器件,焊接调试硬件电路板,保证硬件电路板的可靠性、稳定性和抗干扰能力。因为现在集成电路发展迅速,大部分集成电路厂商都会提供参考电路,所以硬件电路原理图的设计相对来说比较简单,硬件工程师工作的含金量主要体现在产品的可靠性和稳定性设计、以及电磁兼容设计,这才是硬件设计工程师的含金量所在。 一个资深的嵌入式硬件工程师年薪都在10万~ 30万之间。
要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频CPU、多层PCB板的设计经验。嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和分析。
嵌入式软件方向
嵌入式软件工程师的职责主要是根据产品的功能需求设计好软件,让硬件工作起来。嵌入式电子产品硬件部分,大部分都是相同的,核心的都是由CPU、RAM和FLASH 几大部分组成,而软件就千差万别了。产品的具体功能都是由软件来实现的,一般来讲一个产品的实现,软件设计的工作量是硬件设计的4~5倍。所以一般情况下,一个公司的软件工程师数量是硬件硬件工程师的4-5倍,嵌入式软件工程师需求比硬件工程师大很多,同时跟硬件工程师相比,嵌入式软件工程师学起来相对容易些,所以这里我重点和大家谈一下嵌入式软件工程的学习路线。
想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。每个人都避免不了从学校步入社会工作岗位这个环节,实习的时候多少都会带着一些焦虑和不安,比较工作不是在学校学习。我们在实习的时候不要带着学习的心态,要带着做事的心态。领导永远要的是结果你能给公司创造多少价值,最多只能容忍我们边学边干。
我刚入职的时候总想着先看点产品手册,看些视频,和在学校读书的模式一样,先过完基础再着手项目。领导可不会给我那么多学习时间,几乎都是让我们一周内或两周内完成自己的工作。而我只有学习是做项目的经验,多少会有些迷茫。两周从学生到员工的转变过程,真的非常痛苦。没有做项目级产品的基础,又要把工作按时完成,很多东西搜索引擎又查不到,查到了也不能完全理解。第二天领导看到我还没有动手。就被嫌弃了一顿。我感觉压力很大自己非常焦虑。
那时候就想着能力达不到态度要端正,每天早上7点起床,8点到公司,晚上10点才下班。刚开始的前三天很痛苦,每天早上睁开眼的第一个想法就是不想上班,晚上下班回家洗完澡躺在床上睡不着,都在头疼明天该怎么办,脑海里涌现出想辞职的念头。可是想着千万别轻易放弃最起码先坚持一个月学点东西再走。就一路坚持了下来。
那几天我早上坐在电脑前,搞了好久没有什么进展,感觉完了又要白白耗费一天时间,这个问题死磕到晚上下班之前都没能处理好,还是没有能够找到办法解决。很神奇的是带我的导师来了一次突然的关心,为我指点了方向。它几乎没有时间指导我,他在我心里是属于那种能力很强但是不太善于表达的大佬。
经过一个星期的煎熬我坚持了下来,后来我发现在吃饱的时候休息的那几分钟大佬愿意回答我的问题或者给我一些指导。往后的时间都会提前准备一些技术问题,吃完的时候问一问,我发现经常是大佬们的一句话,就能节省我好几天的时间,工作都能正常的按时完成。然后我就请组内的人吃宵夜,然后他们就跟我分享了很多有用的经验,我才知道工作中的人际关系还是需要灌溉的啊。
为了能和大佬们有共同话题,我还根据不同人的不同喜好去补了相关的知识,足球篮球方面首先就要了解现阶段最强的人和队还有大佬喜欢的球队,不能站在他的对立面,还学了王者,经常去帮他们跑腿,路上主动和他们打招呼等。我都觉得我当时的样子十足的狗腿子一个。总之,因为我们的目的是学到更多东西,所以一定要谦卑,也要坚持。很多的时候是因为没人指点,就产生了放弃的念头。
现在回过头看,发现真的很感谢那一个月层出不穷的问题和领导给的压力所带来的痛苦,让我各方面的能力得到成长,之后无论面对怎样困难的技术问题,都不会轻易就放弃,只要把大家的关系处理好,很多问题出现的时候我们就会左右逢源,总能解决这个问题。通过解决问题更加平和了自己的心态和解决问题的决心。我有一个大胆的猜想当时我的领导故意给了我一个难题,让我解决不了,自己主动的去加班。
作者:嵌入式系统开发
链接:https://zhuanlan.zhihu.com/p/343931694
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
普通一本(本硕),嵌入式软件开发岗,收到小米、联发科、浙江大华、汇川技术、英威腾、上能电气、富士康、格力offer。最高28w,最低减半。以下开始讲述一些我找工作的经验,希望对大家有帮助(觉得有帮助的,记得点个赞关注走一波,谢谢大家)。一、简历篇(1)个人联系方式简历的话要把电话,email这些重要的信息放到显眼的位置,方便联系。(2)技能掌握熟悉、精通等词汇慎用(精通应届生就不要用了)了解的话适用于只是看过一点书,只是一种浅尝辄止的感觉,比如你只是通过刷了刷面经,了解了一些数据库的面试常见的问题,那么这种就应该用了解。(3)荣誉奖励奖学金,优秀干部,竞赛获奖,paper啥的都往上怼,多多益善。(4)项目项目篇很重要,基本面试的第一个环节都是扣你的项目。项目一定要准备1到2个亮点(难点),就是你曾经做项目遇到什么问题,如何解决的,解决思路和方法面试官很喜欢听。做过项目或者有实习经历的,面试很容易成功,因为你是确确实实做过东西,而不是瞎编的。问项目过程中,一般会先问你这个项目是干什么的,什么产品或者什么功能。整体代码框架分为几层,你主要做什么。是单独开发还是和同事一起开发,遇到过什么问题,如何解决的。二、简历投递篇(1)官方网申学历不好的,不建议这走这条路,容易被刷,985/211也有一定几率被刷。(2)内推关注 “牛客网- 互联网求职神器和备考学习平台” 的内推信息,都是真实可靠的,虽然不一定免笔试,但是可以保证你简历不被刷。微信公众好“ 互联派 ”也有很多内推的信息,值得关注。(3)内推完之后的添加个人信息强推“ 牛客网简历助手 助手介绍_牛客简历助手-简历一次填写,N网闪填__”牛客网爽的一批,谁用谁知道,你填写完牛客网的简历助手,进来其它求职网站的时候,可以把插件调出来,如果调不出来,多点几下,自己摸索哈。这样可以省时省力,不用每个公司都把自己的简历写一遍。(3)我基本上投了100份简历,有这个岗位的大公司我都投了个遍。混到了40个笔试机会,所以基本上所有嵌入式方面的题目我全部都见过了。你也可以海投,一般笔试时间不会冲突,我九月份每天都有笔试,十月份也有十几场笔试。三、笔试面试篇提前批:一般公司的提前批是免笔试的,这个机会一定要抓住,提前批不耽误正常网申流程,相当于多了一次机会。(其实你每次应聘都是会有记录的,现在的面试官可以看到你所有的过往的面试记录,但我觉得影响不大,你这次能过和上次没过还是取决于你自己的实力,能不能打动面试官)(提前批每年六七月就开始了,一定要注意,很早的)笔试:就算你内推成功了,也会有极大可能笔试。其实笔试题吧,你把《程序员面试宝典》《剑指offer》刷一刷,杭电OJ刷一刷,然后把字符串变换、队列和栈、双线链表的插入等基本数据结构会写,问题不大,然后感觉这些公司的笔试题也就那么回事。面试:面试这个就看平时积累了。电话面试视频面试其实还是有一定操作空间的,现场面全凭自己实力。所以你自己简历上面的项目和技能,不可以瞎编,一定是自己做过,了解技术框架和技术细节。HR面试:一顿跪舔就行,就是你们公司真好,你自己罗列个123哪里好;女朋友,有也说没有(也可以说有,女朋友就在xx公司的地方上班/上学,很近);父母不干涉决定;薪资,互联网的普遍薪资就行(适用于第一份offer,以及非常想去的公司)。总之就是求生欲强一些。四、笔试面试题目嵌入式其实是一个知识比较杂乱的岗位,软件你要懂,硬件你也要懂;底层要懂,做应用开发的话上层也要懂。第一章进程线程的基本概念1、什么是进程,线程,有什么区别2、多进程、多线程的优缺点3、什么时候用进程,什么时候用线程4、多进程、多线程同步(通讯)的方法5、进程线程的状态转换图 。什么时候阻塞,什么时候就绪6、父进程、子进程的关系以及区别7、什么是进程上下文、中断上下文8、一个进程可以创建多少线程,和什么有关9、进程间通讯:(1)管道/无名管道(2)信号(3)共享内存(4)消息队列(5)信号量(6)socket注意:临界区则是一种概念,指的是访问公共资源的程序片段,并不是一种通信方式。10、线程通讯(锁):(1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁第二章C/C++面试题1、new和malloc的区别2、 malloc的底层实现3、在1G内存的计算机中能否malloc(1.2G)?为什么?4、指针与引用的相同和区别;如何相互转换?5、C语言检索内存情况,内存分配的方式6 、extern”C” 的作用7、头文件声明时加extern定义时不要加,因为extern可以多次声明,但只有一个定义8、重写memcpy()函数需要注意哪些问题,(strcat strncat strcmp strcpy)哪些函数会导致内存溢出9、 char和int之间的转换;10 、static的用法(定义和用途)static静态变量,只初始化一次11 、const的用法(定义和用途)12、const常量和#define的区别(编译阶段、安全性、内存占用等)13 、volatile作用和用法14、有常量指针 指针常量 常量引用 没有 引用常量15、变量的作用域(全局变量和局部变量)16、sizeof 与strlen (字符串,数组)17、经典的sizeof(struct)和内存对齐(一字节对齐)18、const * char 与 const char *19、inline函数20、内存四区,什么变量分别存储在什么区域,堆上还是栈上。第三章网络编程1 、TCP、UDP的区别2 、TCP、UDP的优缺点3 、TCP UDP适用场景4、 TCP为什么是可靠连接5、OSI典型网络模型,简单说说有哪些;6、三次握手、四次挥手第四章常见算法1、各种排序算法的时间空间复杂度、稳定性2、各种排序算法什么时候有最好情况、最坏情况(尤其是快排)3、冒泡排序4、选择排序5、插入排序6、希尔排序7、归并排序8、快速排序9、二分法查找的原理第五章Linux操作系统常见面试题1、 Linux内核的组成部分2、用户空间与内核通信方式有哪些?3、系统调用read()/write(),内核具体做了哪些事情4、系统调用与普通函数调用的区别5、内核态,用户态的区别6、 bootloader内核 、根文件的关系7 、Bootloader启动过程:8、 linux下检查内存状态的命令1、大小端的区别以及各自的优点,哪种时候用。(判断大小端的三种方式)2 、一个程序从开始运行到结束的完整过程(四个过程)3、什么是堆,栈,内存泄漏和内存溢出?4、堆和栈的区别5、死锁的原因、条件6、硬链接与软链接的区别;7、虚拟内存,虚拟地址与物理地址的转换8、计算机中,32bit与64bit有什么区别9、中断和异常的区别10、中断怎么发生,中断处理流程11、 Linux 操作系统挂起、休眠、关机相关命令12、编译优化选项 -o13、在有数据cache情况下,DMA数据链路为:外设-DMA-DDR-cache-CPU,CPU需要对cache做什么操作,才可以得到数据14、linux中改变文件属性的命令:chmod15、linux中查找文件中匹配字符串的命令:grep第六章 单片机常见面试题1、ROM与RAM2、 IO口工作方式:上拉输入 下拉输入 推挽输出 开漏输出3、请说明总线接口USRT、I2C、USB的异同点(串/并、速度、全/半双工、总线拓扑等)4、I2C协议时序图5、单片机的SP指针始终指向:栈顶6、I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。7、FIQ中断向量入口地址8、全双工总线类型9、SPI四种模式,简述其中一种模式,画出时序图第七章 其他面试题1、讲一讲冯诺依曼和哈佛体系的区别2、讲一讲二叉树和红黑树3、http默认端口号:804、面向对象编程的三大特性,以及重载的意思。重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。5、linux中mysql数据库默认的端口是:33066、反转链表的代码补全7、判断回文(首尾相同)输入abcba 返回true
输入abc 返回flase8、C语言编程中,单片机平台,一般有.c和.h文件,如果一个人在.h文件中定义了一个变量,会有什么后果。(讨论编程习惯的问题,我一般是只在.h文件中声明函数,不会做变量定义;另外,编程中每一个模块都会有对应的.c和.h文件,最终的总程序自己定义一个comm.c和comm.h去调用各个模块,这样的习惯我觉得还行)9、if语句中如果是或运算( | ),第一个条件满足时,第二个条件还会判断吗。或运算的话,当然不会,因为 0|1=1,中断了10、IIC、SPI、UART通信协议的作用和区别,以及为什么用这个不用另外一个进行通信11、用变量a给出下面的定义a) 一个整型数;
b)一个指向整型数的指针;
c)一个指向指针的指针,它指向的指针是指向一个整型数;
d)一个有10个整型的数组;
e)一个有10个指针的数组,该指针是指向一个整型数;
f)一个指向有10个整型数数组的指针;
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答案:
a)int a
b)int *a;
c)int **a;
d)int a[10];
e)int *a [10];
f) int a[10], *p=a;
g)int (*a)(int)
h) int( *a[10])(int)
刚经历过秋招的待入职应届嵌入式系统软件工程师路过,最终去向为国内的一家AI芯片独角兽公司,坐标魔都。两个月秋招下来的主要感受是今年嵌入式薪资比想象中的要高很多。
本硕双非机械,本科期间有过嵌入式的竞赛(蓝桥杯嵌入式)及项目经历(学校里的创新项目),主要是MCU,嵌入式系统接触的不多,机械本专业的知识也没有放下,当时的想法是在机械里会一点电子、编程有优势,研究生期间确立了职目标:软件工程师,更偏向于纯软。研二开始自学了计算机基础,包括数据结构与算法、操作系统原理、计算机网络、数据库等。秋招从9月初开始投递,时间已经有些晚了,投了大量的C/C++岗位,很多是网络安全方向的公司。后来也投了嵌入式软件的岗位,结果嵌入式软件的面试很顺利。十月底那一周收到了四五个offer吧,有嵌入式软件的,也有C/C++的,比较一下,最终选择了现在的这家公司,薪资比较满意,行业、岗位也都是自己所感兴趣的。
今年嵌入式开发岗薪资上涨我认为很大一部分原因是国内芯片行业的日渐兴起。2020年被称为是IC的元年。芯片开发出来后需要进行系统软件的开发,所以嵌入式系统工程师就开始扩招,而且目前来说芯片行业处于上升期,因此公司招人的时候薪资会开的比较高。就今年的秋招来看,目前算法和芯片是属于一档的,接下来就是开发,包括后端(最卷)、前端、嵌入式软件,这些属于一档,再后面软件测试、运维等是一档。从岗位的数量来看Java岗是最多的,相应报的人数也最多,早在七八月份提前批自己还没投简历的时候就看到各个群里在讨论:今年Java后端一片红海,太卷了。
嵌入式软件岗位和C/C++研发岗位在面试的时候考察的内容还是有很大的重合的。C/C++工程师一般校招主要学的有:C语言和C++基础(指针、内存分配几乎是必考,还有像static特性、const的作用)、面向对象的相关特性(虚函数是高频)、C++11新特性如智能指针、lamda函数等(智能指针很重要!)、常用的STL模板如vector、stack等、数据结构与算法(数组、链表、栈、队列这些以及十大排序算法,快速排序是最高频)、操作系统原理(进程线程区别、进程间通信方式、多线程等)、计算机网络(应用层和传输层考的最多,TCP和UDP区别)。如果面试后端的话一般还会考数据库MySQL的内容,而嵌入式软件则会问一些计算机组成原理/微机原理方面的,不过最主要还是上述的C/C++技术栈相关。
对于有过嵌入式项目经历的同学来说,把C/C++、数据结构与算法、操作系统原理、计算机网络、计算机组成原理的重点内容好好准备,校招投嵌入式岗位还是会比较顺利的,薪资也别担心,同一家公司几乎和应用软件开发、后端开发持平。对于零基础想转行IT的同学,建议转应用软件开发,因为纯软相对来入门可以快一点,学习成本也低,LeetCode上多刷题,hot100刷完就可以应付大多数公司面试的算法题了,如果想去互联网大厂的话算法题上更要花点时间。