最近ai爆火,嵌入式作为老旧的技术渐渐式微。但天有不测风云,老美作妖,芯片行业风口,嵌入式可以趁势飞一波。鉴于大佬们都不屑做这种老旧技术,鄙人不才,姑且把自己的招聘道路和对嵌入式软件的思考说给各位嵌入式同学,前车之鉴,后事之师。
乐鑫科技(提前批):7.16笔试/挂
选择填空60/编程40,基础题不难,编程题两道算法,这不是为难嵌入式的吗,编程白卷,挂。
联发科(提前批):7.22笔试/7.25一面/挂
嵌入式软件岗。台企做射频芯片,wifi/蓝牙这种,台湾第一,给的不高但有加班费,且大陆接触不到核心技术。笔试C基础选择填空简答翻译/两道编程。编程题是分割字符串,双向链表查找非0节点并打印,现在看很简单,C基础我刷的《王道程序员面试宝典》,选择填空我还行,但是编程当时的我就……交了白卷,时间也是一方面。
一面纯聊项目,并适当引申问一些基础知识,引申了:arm工作模式/静动态链接的区别,最后一个项目我做的机器学习,单纯为发论文那种,没说清楚,估计扣分了。又问非技术问题,和同学如何分工合作,与导师意见不一致怎么办,第一次被问,答的很一般,但也不是说的差。整体感觉聊的还行,可是挂了,群里好多人都是这样,可能是掐尖吧。
汇顶(提前批):7.25直接一面/挂
BSP/驱动岗。先问点iic,spi基础知识,速率,工作模式。然后手撕memcpy,哪搞过这种纯c编程,写的漏洞百出,我自己都看不下去……又问我信号量组织方式,就让你简述,语言没组织好,本身也不熟。果断挂了。BSP方向最喜欢问单片机知识。后来听群里大佬说汇顶给的比联发科还低,他们都拒了……
OPPO(提前批):8.2直接一面/挂
c/c++芯片方向。问哪些课学的不好,急中生智答中特……问哪些学的好,答ARM体系结构。然后被逮住问:7种异常是什么(没答全),中断触发到返回的具体行为(CM3权威指南里有),中断嵌套如何实现(NVIC相关),中断机制的具体实现(还在答中断具体行为,他问的应该是两级向量表如何查找),中断部分结束。
问单片机与嵌入式系统的最大区别在哪里,答嵌入式系统可以跑多任务,然后逮住OS开始问。任务在内存中的组织方式(TCB-用户栈-用户代码),上下文切换时任务在内存中是如何变动,任务调度点,优先级反转如何解决,任务抢占如何发生,通信机制。
问Linux开发驱动的流程,懵逼。又问c知识指针与引用的区别。然后让我自己挑些会的说一说,答了点单指令多数据流,感觉不感兴趣,又说了流水线冲突与解决,反问cache-miss什么情况,分支预测什么原理(高级计算机结构课上内容)。看来芯片方向看重体系结构的知识,课上学的终于有用了。
通过里面的最低分,部门挑简历时没挑我,挂了。这次面试真的在我最擅长的方向被问的一身汗,虽然挂了但是找到下一步需要完善的点,挂的不亏。之后我就把自己的优势定位在ARM体系结构和CPU原理/OS任务切换与调度原理/静态链接知识(这里推荐《程序员的自我修养》)。
诺瓦科技(提前批):7.30笔试/一面/挂
做LED屏解决方案,感觉用的知识不深。笔试考了DMA与中断传输的比较,矩阵键盘检测,计算算法的复杂度,甚至还有稳压电路的知识,做的不好。
面试让画项目框图,画乱了。硬是把我自己独立完成全部软件硬件的四轴飞行器项目说的好像是个假的一样,我特么自己都服我自己。然后问C基础,我答的还行,但已经无法补救。这次面试之后我开始把所有项目叙述和重点问题全部写纸上,每天背一遍。
是的,你没有看错,我提前批5连挂,群里大佬都在讨论去联发科还是汇顶了,我一个菜鸡什么话都插不上,心情和自信都已跌入谷底,真的就已经卑微求offer了……
中兴(正式批):8.11一面/8.13二面/9.1签约洽谈/拒
然后我就迎来了第一个正式批,清水河现场面。此时被鞭打多了也知道点引导话题了。专业面就问项目,问些概念和项目里的知识:什么叫软硬实时,m4内核双堆栈机制,顺便答了arm模式切换和上下文切换,bootloader,链接原理,说我是做了些东西的。一面当天正好成都暴雨,路上积水连车都不敢走,到现场裤子鞋湿透,面试之后正好雨停。回想着专业面被肯定,我有一种感觉,从今日开始我要拨云见日。
二面英文自我介绍,崩,然后问我有offer吗,投华为了吗,然后就反复问我:为啥没投华为,我还是不明白你为什么不投华为。问的我贼气,我不投怎么了。后来在职学姐告诉我,应该答不喜欢华为的文化,两家是竞争关系。
洽谈还是职业规划等老生常谈,他们南京的嵌入式主要是做设备驱动,机顶盒。没有自研芯片,也就是说没多少芯片的核心技术。我还是打算去芯片原厂的。谈薪资就看获奖经历什么的,本科的奖倒是不少,然并卵。说让我考虑,后来拒了。
虽然中兴拒了,但是在刚刚5连挂的时间节点上给了我宝贵的肯定,非常雪中送炭。
大华股份(提前批):7.27笔试/8.14一面/8.18二面/8.24 hr面/9.7意向书/9.18逼签/9.23拒
算法工程化岗。提前准备了一些ucos移植,arm指令集流水线和静态链接的知识,事实证明,准备的方向很对,他很感兴趣。
电话一面,问了ucos移植的细节,提到了一种并发的指令集(没用过),聊聊项目,又聊行业认知,最后问我的优势劣势分别是什么,答优势是对底层原理的理解和对编译器的了解,劣势是不懂Linux。他表示赞同,说我基础不错。信心终于提升一点。
电话二面。上来直接进入正题,自我介绍什么的都没搞,直接问:信号量实现的底层原理,可不可以用一个全局变量代替信号量的计数值,答不可以信号量是临界资源要进临界区,问怎么进临界区,答关中断保存cpsr,他比较满意。
然后问中断机制,大概有多少中断,可修改向量表吗(通常不可,有例外),又问m4内核的双堆栈机制。BL指令的跳转范围(32MB)。
最后问静态链接,深挖强弱符号的东西,最后说我对底层还是比较了解。
hr面就常规,觉得契合与否,1246大小周能不能接受。杭州,6险1金有食堂,后来知道我有其他offer要给我提薪,没让提拒了(因为后来拿到了更合适的)。
大疆:8.16笔试/8.25电话一面/8.28视频二面/9.3感谢信
笔试编程题依然空白,选择填空基本拿满。
一面就问项目,反复问上系统的必要性,估计是个搞os的根本不懂四轴,以前栽过,这次答圆了,又主动答了中断机制,看他不是很感兴趣。最后问我懂不懂os的内存管理,答不懂,之后就是笔试编程为啥不做,答嵌入式对算法只是了解,项目里没用到。
二面感觉和一面没什么区别,还是自我介绍&&项目介绍,把四轴的控制流程说了一遍,他对四轴还是懂一点,但飞控算法没问,难道大疆不该很看重这一块吗,把所有项目大概都问了一遍,无异常。然后问,你的劣势在哪,答不会Linux,又问我图像处理的算法,靠本科上课学的还没忘干净的知识答一点,中位数滤波,边缘滤波,想深问,我说我只是了解。感觉他不很满意。
二面挂了,挂的很不甘心,我的cpu原理知识还没吐出来呢,静态链接也没问,arm这块就问了个中断机制。回来反思为什么引不出自己的优势,感觉自己所答还是很零散,中断就中断,os就os,指令集就指令集,串不起来。后来我找到一种组织的方式,能从中断入手把arm架构,上下文模切换,指令流水和程序优化串起来讲,形成一个模板,只要问到其中某一个知识我就能把全部一串说出来,他感兴趣自然再深问。涨了一波经验,挂的不亏。
寒武纪(提前批):9.3一面/9.6二面/9.11 hr面/拒
上海系统软件工程师。大疆挂面总结来的那套“模板”第一次实战。
一面还是项目,挨个问简历里些写的。IIC与SPI的不同(片选方式,异步同步),IIC读写方向如何区分(地址位最后一位的高或低)看我答出了比较满意,说没几个答对的,驱动确实是我写过的。然后问9轴数据的意义,答了姿态解算中队数据的融合。然后就是双堆栈机制与模式切换,任务调度点与任务在内存中的组织方式(TCB-用户栈-用户代码),优先级反转与解决,死锁的原因,然后makefile语法一个。其他单片机小项目根本没问。看得出对我的回答很满意。然后手撕代码环节,特意找了个最简单的给我,牛客原题链表表示的两数相加,撕半小时,通过率0%……他说会综合考虑。
二面疯狂问CPU知识,“模板”用上了。先问m4 的双堆栈与上下文切换,17个寄存器的功能,LR的作用。顺势答为何中断返回要LR中的值减4,然后指令流水、CPU知识就跟着出来了。又问分支预测发生在指令处理的哪个阶段,cache的作用,回写与写透的区别,为什么设计三级缓存。
然后问信号量,进入临界区的操作,为什么关中断可以保护临界区,cpsr如何保存。
最后问静态链接,预处理是什么编译选项,-g是什么意思,如何使用ar生成库文件,这块不熟,会不会gdb(不会)。那就说说makefile一条指令的格式,.c生成.o什么选项,.o生成.elf什么选项,.o与.elf的区别联系,举个区别的例子。
然后开始讨论行业认知。为什么从事芯片行业,美国制裁华为你怎么看,制程对芯片的影响,为什么中国制造业跟不上。感觉他很感兴趣,当场表示通过。
hr面就个人介绍挖了一下个人学习方法,社团经历,期望薪资等等,我问寒武纪是否加班,是不是1246大小周,她很震惊,不知道1246为何物,并说寒武纪不加班,干完就能走。
寒武纪两位面试官的肯定给了我极大的自信,我也一度很想去,毕竟是国家队的AI四小龙之一,技术实力毋庸置疑,关于为什么没去,在芯原之行之后说。
矽力杰:9.9和主管电话聊/9.18 hr面/9.24拒
南京嵌入式软件岗。做电源模拟IC国内第一,最近几年开始做物联网SoC,在南京计划1年左右上市,使用M0内核和开源协议栈,做解决方案,技术难度倒不特别深,现在射频SoC厂商如雨后春笋一般冒出来,物联网这块看来市场很大,但是我本人不喜欢做物联网。
我的流程非正常,笔试都没写电话聊完直接告诉我很合适很想让我去,态度那叫一个好,hr面也是态度很好,没有丝毫套路。最后问了我目前offer,我说大华的20k和寒武纪还没谈,她说会给我定一个有竞争力的薪资。
最后的薪资真的很有诚意,干的好1-2年给股票,另外还有很高的签字费,承诺绝对不加班,不得已加班给加班费,算下来一年能拿很多对于南京嵌入式来说,还有股票签字费不加班,我心动了。
最后夸一下这个厂,对待人才很有诚意,不像有的公司承诺给一个让你“无法拒绝”的薪资然后白菜的一批,而且真不怎么加班,喜欢物联网的同学可以考虑。
芯原微电子:9.16清水河笔试/9.17一上午5轮面试/9.18通过/9.21 openday洽谈/9.24网签
成都算法工程化岗。笔试题量超大,是一个半小时的量但是只给你一小时,各种智力题和基础知识,涵盖c、os、编译器和cpu知识,很多都是4选1答,只要你在一个方面有深入理解就行。我觉得很基础但是实在写不完。
专业面,npu的人面的也算是缘分。先说项目,直接画个框图给他,说的熟的不能再熟了。然后提问中断机制,这就进入了我的“模板”,然后重点问了流水线效率问题,为什么中断返回PC要减4,拿出试卷让我答没写完的题。然后让结合项目代码分析如何避免流水线冲突(调整指令执行顺序,分支预测,增加部件),还好我顶住了,他们也开始感兴趣了。
然后问静态链接,也是熟的不能再熟的东西。其中一个面试官问我是否想去做编译器,我说只做编译器一个点有点狭窄我还是想着眼于整个系统,后来知道他原来是编译器组的leader。
然后和技术主管聊,当时不知道是npu部门的leader(也是我现在的leader),聊些技术方向,未来期许,职业规划,聊了比较久,他说不错很优秀。
然后英语面,爆炸。问我团队工作中什么最重要,喜欢哪个城市为什么,说了啥不重要,重要看你会不会说英语,显然我不会,估计是C。
hr面套路,优缺点,已有什么offer什么岗位。
CEO面,我宣讲时提了一个比较有深度的问题,他记得我。问为什么芯原做芯片定制而不是直接生产出来再卖,答案是减少积压风险,答错。他宣讲时就说今天要问,还是答错了。
openday,搞了一整天,各条产品线负责人上来宣讲,好困,芯原自研IP核有核心技术,还是不错,npu是前沿技术,部门老大对我也比较看好,于是去了。就是薪资一般,一年涨薪至少10%看绩效,不加班法定节假日3倍工资,周末和晚上加班没有加班费(7点人都走光了)。
回来和我的老师讨论offer问题,芯片行业老师还是最看好华为,可以说是业界第一。中策就是寒武纪、芯原、龙芯中科这种有技术实力但是盈利情况并不很好的国家队公司,下策就是解决方案供提供商,他们的芯片技术自主权十分有限,拿大华来说,他们的图像IP核都是买的华为的,芯原的,寒武纪的,芯原的异构并行npu可以决定哪部分算法调度在哪个核上去跑,怎么从结构上优化网络,但是大华就只能根据我们的文档去应用,我们的嵌入式工程师还要去杭州总部指导他们的工程师,原厂工程师在下游方案提供商那里很吃香的。
在这些IP原厂中,我的老师觉得寒武纪定位不清晰,又做IP又产芯片又做云,现在还搞校企联合,有些浮躁,财报也是大起大落的,目前特别依赖输血。芯原就好一些,只对标企业用户,虽然也在亏损,但是定位清晰,有自己很多市场接受的产品,目前亏损主要是成本太大。但是在这个时间节点上国家肯定会拉高芯片行业,寒武纪还没倒呢芯原怕什么。决定之后寒武纪、大华、矽力杰就都拒了。
我所从事的是内核移植和算法工程化岗,只做设备和驱动前途有限,这方面最后细说。
欢迎学弟学妹来我司从事自主IP核的研发。我司妹子多而且质量高哦。
龙芯中科:9.20一面/二面已签遂拒
北京嵌入式软件岗。龙芯是国产CPU的巅峰,中科院计算所背景,技术是有但是盈利模式没做成熟。介绍项目,老生常谈,叙述中断机制,bootloader,模板开启引出流水线,他竟然没深问。问我会不会gdb,答不会。又问了一个机器学习项目,看我叙述清晰也没再问了(他不懂这块)。问我对工作什么期许,聊聊岗位,已有什么offer什么岗位。看他不怎么问我技术问题我有点急,我直接说我基础很好,所有简历里提到的您随便问,他笑,看你这么自信我就不问了,等二面吧。后来24号签了,也不准备继续了。
最后说一些我对嵌入式技术的见解:嵌入式作为一种已经存在将近50年的技术,本身是比较老旧的,但这并不代表它会被新的技术所取代,嵌入式系统本身就是微小的计算机系统,只要二进制计算机不过时,嵌入式技术就不会消失。
我的老师经常给我们强调“程序员的自我修养”和对底层原理的理解,现在技术更新换代非常快,新框架新风口,但是只要它跑在二进制计算机上,有些东西就是不会变的。所以理解计算机工作的本质,掌握“以不变应万变”的能力在嵌入式编程中尤为重要,“好的程序员对自己程序的每一个比特都了如指掌”。不仅是嵌入式方向,其他技术方向也是如此,着眼于系统才能立于金字塔顶部,在35岁之后避免职业瓶颈。
吹了一波嵌入式的重要,再谈一点我个人对嵌入式未来的理解。传统嵌入式MCU、os应用编程、驱动开发其实已经很成熟,比如linux驱动就已经有成熟的框架,完全不需要你懂源代码,前景有限(但是也是基本功之一)。未来应是ai的时代,云计算已经比较成熟,但云端所能做的毕竟有限,而且传输问题(可能5G出来会好一点),功耗问题一直没完全解决,阿尔法狗背后有1000台左右的CPU,200台左右的GPU在跑,每小时光电费都要300美元左右,所以ai一直落不了地。对于端级的ai,集成度基本已经到了尽头,目前最先进的制程是5nm,而在1nm的量级将会产生量子效应,也就是说,集成度的极限要到了。集成度上不去直接影响芯片的大小,端级ai不可能像服务器一样搞好大一个主板,目前基本是用异构多核的方式提升计算性能。但是并行计算也有性能的瓶颈,算法中很多情况是下一步计算需要用到上一步的结果,有相关性的,没法并行。这个计算的瓶颈,牵扯到流水线阻塞,cache命中率,IO操作等等,一定是底层架构方面的问题,有我们嵌入式程序员广阔的发展空间。
第二个热点我觉得是5G相关,这块我不太了解,大致说说。首先是低功耗问题,商用对功耗非常敏感,这肯定和底层系统有关,要裁剪硬件软件。其次就是协议栈了,美国就怕这个才封了华为,由此可见重要程度。
最后感谢一波我的老师,我现在所有的知识都来自于他,是我专业方向的启蒙人,没有他我连嵌入式的门都入不了。
近期有学弟咨询如何系统学习嵌入式,推荐什么书籍,所以再补充一些。stm32和51单片机入门自不必说,说些进阶的路线。老师曾给我们仔细设计了一系列挑战任务。
第一阶段称为stm32+RTOS阶段。
任务1:裸板驱动,比如在裸板上点亮LED灯,一般是以stm32为平台,通过汇编代码手动配置最底层的寄存器,完成时钟树、GPIO口的初始化,重点1:理解软件和硬件是如何联系在一起的(地址,宏定义和typedef封装)。重点2:理解汇编语言操作寄存器的过程。重点3:理解启动文件。有人会说,什么年代了还用汇编,直接c实现不更简单。关于c实现更简单我同意,但是我觉得真正想理解硬件就必须在汇编层面上去理解,越深入你越会发现汇编的重要,启动文件可是纯汇编的。推荐野火的《stm32完全开发手册》和《ucos-II移植》。正点原子那拼凑出来的辣鸡就不要看了,别问我咋知道的。
任务2:移植一款RTOS并在stm32平台通过两个任务(点灯任务,灭灯任务)实现led的周期闪烁,我所移植的是ucos2.重点1:使用汇编语言手工编写ucos2与stm32硬件平台的接口部分,这一过程将会涉及到对m4内核模式切换、中断系统的运行机制的理解。重点2:理解多任务并发编程。理解ucos2中关于任务组织方式的源代码,理解上下文切换的本质(关于源代码的理解强烈推荐廖勇老师主编的《嵌入式操作系统》,一行一行带你读源码,这本书也已经被我翻的发黑了……吃透够你彻底理解RTOS)。
任务3:在Linux平台上使用makefile的方式完成任务2的源代码的交叉编译。难点1:makefile语法。难点2:理解静态链接的全部原理和ELF可执行文件。预编译、编译、链接、装载的全过程,对编译过程是理解是所有c程序员的自我修养(强烈俞甲子大神的推荐《程序员的自我修养》,读懂静态链接就足够成为面试的亮点,懂动态链接更好但也更复杂),这种修养决定了嵌入式程序员把握大型程序能力的上限。难点3:理解链接文件。各个段的地址可不是随便安排就完事了。这个任务带领我们“惊鸿一瞥"了计算机技术中那些“以不变应万变”的能力中的一个。
任务4:在你的系统中使用一种数学算法,培养知识迁移的能力。你要知道软件只是实现功能(陪跑的),一个嵌入式软件程序员想有所发展必定要和某个特殊领域的算法结合。我所做的是四轴飞行器项目,里面的算法是姿态解算算法和PID控制算法,都不算太难开源的也不少,重点在训练知识迁移的能力。不得不说我数学真的不好,姿态解算里面那个互补滤波我也就懂个大概流程,里面式子为什么那样算那样互补基本不懂,很数学(从此放弃做科研),但是PID必须弄通透。
以上任务不打折扣地做下来怎么说也得一年,何况各位还有各种商业项目缠身,那就更容易分心。对于我一个读研之后才接触OS的菜鸟硕士,对自己要求也没那么高,在研二到这种程度就能找一份工作了。面试官们都说我基础很好嘿嘿嘿……其实面试官对于嵌入式应届生并没有太高的编程技术要求(寒武纪现场编程没做出来之后面试官亲口说的),甚至芯原的笔试根本就是全方位的基础知识集合。他们最看重的是你的潜力,首先是做项目是否认真地刨根问底,对技术的追求,这些直接体现在你的基础知识上,项目中的所有东西要能经得起面试官细致的地毯式轰炸。第二个就看你目光是否长远,行业认知,未来趋势,表达交流能力,他希望你有自己的见解,毕竟对于一个985硕士他培养的是未来的骨干而不是只会干活的码农。
第二阶段称为多核+Linux阶段。
老师不让我们碰Linux,在RTOS没吃透的时候。 以上过程走完之后就可以碰Linux了,这时候你肯定已经有自己的一些判断,你可以找一块更高端的板子,a系列甚至是多核的,再走一遍裸板驱动、移植Linux、交叉编译环境的调试,ai算法工程化等等高端玩法,这也是我今后的研究方向。
第一阶段任何有志于嵌入式的同学都可以在硕士期间完成,我老师从本科就亲手培养起来的大佬本科阶段就完成了第一阶段,研究生完成第二阶段使用异构多核+Linux研究slam算法,人家去了嵌入式巅峰企业大疆。
第三阶段要么是转管理带技术团队,或者就去研究架构做技术专家。要么OS内核架构要么底层软件系统架构,都是核心技术,这一块目前我一个只完成第一阶段的菜鸡看不透。
最后荐书环节,其实书不在多,啃透就行,除上面提到的《野火stm32完全开发手册》、《M3权威指南》、《程序员的自我修养》、《嵌入式操作系统》还有经典的《深入理解计算机系统》:出版至今几十年了,基本内容没怎么变过依然为行业经典,充分说“以不变应万变”的重要性。里面各个方面的知识都有,我目前关注了程序优化和指令集部分,日后会继续拜读其他章节。以上书目建议把书翻黑为止。
《高级计算机系统结构》,没错就是计算机学院和软件学院必开的那门高计课,虽然大部分讲的X86,但是各个模块俱全,我面试时那些cache知识、指令流水知识和各种处理器知识就是来自这里
《C语言程序设计现代方法》:扔掉那本红色的辣鸡,所有C语言的细节这本书都有,遇到基础语言的问题翻这个就对了。《C和指针》也要看起来。
对于面试还需要《王道程序员面试宝典》《C陷阱与缺陷》,帮助你理解C语言的细节,各种细节,你从来没关注过的细节,助你选择填空拿满。嵌入式程序员不需要费劲去关注算法,遇到动态规划什么的直接不做就好了,《剑指offer》不用刷,去牛客刷点链表和字符串足够了。
以上,希望帮到大家,对于嵌入式软件入门这一块问题,欢迎大家向我付费提问。