【投稿】大疆DJI嵌入式软件开发面经汇总
【嵌入式未来】
嵌入式软件开发最强攻略一篇就够了!《嵌入式软件开发笔试与面试手册》:https://blog.nowcoder.net/zhuanlan/jvN8gj
《嵌入式软件笔试-2023年真题汇总》专栏:https://blog.nowcoder.net/zhuanlan/0oDWVm
以下是大疆DJI嵌入式面经汇总👇👇👇
一
测评+(专业笔试)8月初+8月中旬
所有岗位都会有测评,部分岗位(一般是技术岗如嵌入式)会有额外专业笔试,两者都是线上形式;
线上有一点不得不提,诚信问题;我不是在装懂,而是靠自己做不好,就大概率意味着你和这家公司的用人需求不匹配。而作弊的结果就是你找不到适合你的工作,公司筛不出适合的人选。现在机会很多,但自己走歪了不仅瞎折腾,也没啥好下场;
线上测评为选择题,主要体现个人性格、价值观、逻辑水平,接近一百道题目的样子;
专业笔试我8月中旬做的B卷,题型丰富有单选、多选、判断、填空、简答题、编程题;
涉及C语言、汇编、操作系统、Linux、RTOS、ARM内核计组等知识点
一面9月上旬
电话55分钟,会顺着你的回答往深入扣技术细节,自己越说面试官问越多,时间就是这么被耗掉的,下面的是初始问题,深入就没记了
1、自我介绍;
2、问了很多自我介绍里的内容,这里不提;
3、芯片选型考虑哪些因素?
4、系统用了哪些外设?
5、对哪些通信接口熟悉?介绍一下SPI;
6、线程都有哪些状态?及其各自的转换?
7、有cache的CPU上使用DMA如何保证数据的一致性?
8、系统跑了几个任务?
9、按键防抖如何实现,该线程优先级如何设置?
10、平时怎么debug?
11、用过哪些锁?
12、static关键字作用?
13、程序段还有哪些区?
14、哪些地方会用到栈?有没有关注flash和ram空间?
15、volatile关键字作用?
16、选择DJI的主要原因?
17、有用过DJI的产品吗?
18、反问
二面9月中旬
电话30分钟,同样下面是初始问题
1、自我介绍+个人优缺点?
2、项目细节,个人主要负责的方面?
3、项目克服了哪些干扰?如何规范?
4、项目安全防护如何考虑?
5、项目功耗如何考虑?
6、.........(各种项目细节)
7、反问
终面9月中旬
腾讯会议30分钟
面试官是位产品大佬,整个过程比较轻松;
1、对公司有什么了解?
2、为什么想加入大疆?
3、选择一家公司的原则?
4、你觉得加入大疆会遇到的困难与挑战是什么?
5、为什么参加RM?
6、个人兴趣是什么?
7、参加rm之前在做什么?参加比赛时的挑战?
8、有没有想做产品?
9、个人缺点?
10、反问
OC10月中旬
收到部门HR的offer call
二
一面(技术面,用时48min)
主要是深挖项目的内容,可以看得出面试官很忙,问了很多问题,我就只记录下印象深刻的吧(建议:对于不会的技术要实事求是,否则就是给自己挖坑,因为面试官会深入询问)。
- MCU能不能运行Linux?
- STM32启动过程?
- 进程和线程的区别?
- C++为什么有指针还要引用?
二面(感觉像是主管面的,用时45min)
- 自我介绍
- 你怎么看待创造,而不是跟随,怎么看待有所为,有所不为(自我介绍中提到了这两点)
- 用过大疆哪些产品?RoboMaster S1
- 谈一谈对于S1产品定位于初高中以及大学生的看法
- 一个技术问题:互斥量和信号量区别(小意思)
- 项目中碰到的困难,怎么解决的。
- 无人机的未来(大疆产品得缺点)----》tips:关注大疆产品,发布会
- 反问:对我评价,哪些方面需要加强,企业战略方向等等
面试官知道我项目中没接触过嵌入式操作系统,所以只问了我一个问题,还好恶补理论的时候有涉及,轻松回答上来(完事问我是不是应对面试补的),面试DJI,还是要真诚一些。
终面(部门负责人,用时30min)
面试官很年轻,比较帅,这一轮不是技术面了,主要聊了哪些项目或比赛遇到的困难难忘,怎么解决的,为什么选择大疆,无人机的未来等等(与二面有重叠部分),偏向于考察一个人的价值取向,反问的时候给面试官小哥哥出了个小问题:
- 无人机制造时有两种方案,第一种像日本汽车一样,严控部件的生命周期,特定公里数内没有质量问题,公里数超出后就报废,基本所有部件都得换,只能买新车。第二种成本范围内尽可能选择最好的材料,保证无人机质量,做到基本玩不坏,生命周期超长。想问下,如果是DJI会选择哪种方案,为什么?
面试官小哥哥给了我一个新的思考问题的角度,确实,终面的都是大佬级别(MobileNet作者),不要错过这个难得的机会,好好交流。
三
8/1 笔试
重点考察C语言基础知识,单片机基础、ARM架构以及操作系统那块,最后两道编程题只占10分;
8/27 1面 电话面/30min
先自我介绍,然后直接挖项目,详细讲项目流程和代码思路,因为用了rtos,所以详细问了几个线程间的通信和同步,并问为什么用这种方式并设置场景让我换别的方案;大概项目聊了15分钟;
然后是一些linux上的问题,包括linux的中断流程,有哪些中断处理操作?阻塞休眠原理、tasklet和workqueue的底层区别、RTOS采取哪些手段保证他的实时性?在做硬件驱动的时候,碰到的比较困难的问题? 项目中有制定通讯协议,就问有出现过什么通讯错误,出现错误了怎么办?通讯丢失怎么办?做过哪些linux驱动,遇到过什么问题?linux中能进行浮点数运算吗?。。。
面试官很干练,全程无废话只谈技术,面试官的技术栈很深,会深挖项目,对linux驱动方面也会有所考察,重点看项目是不是你做的,然后就是看遇到一些问题时候有没有自己的理解;
9/3 2面 腾讯会议/29min
自我介绍后,问了些比赛做的东西和比赛内容,接着让挑一个自己的项目着重介绍,重点问了项目中关于内存池的理解和使用;大佬挺很关注数据传输过程中的加密处理,技术细节层面问的不是太多,大佬人很面善,全程更像是聊天,聊项目比较多以及看你的理解程度。
9/12 3面 腾讯会议/32min
这一面是在周日上午面的,面试官是一位中年人,气场特别强大的那种。。。。 基本没问技术问题,问了一些智能车比赛的内容,比如组内分工、负责内容以及方案的选型;然后会问你关于大疆的产品了解程度,比如让你举出大疆某个产品的优点和缺点,针对缺点问你有什么改进的方式,我说了一些改进点后面试官反问为什么大疆没有考虑到你说的这些;最后问了一些职场问题,印象深刻的是假设你是组内项目负责人,当资源的分配不公或者快到项目交付期时员工被其他小组叫走,问你怎么办。。。
四
9.6 一面 40min介绍项目,用了20min
RTOS中哪里会进行线程调度
线程切换为什么用PendSVC,有什么优势
static用法,变量存储位置
C语言编译后的内存分布
volatile变量作用?修饰哪些变量,为什么这些变量要用volatile修饰
SPI四种模式
串口发送一个字节多少位
线程优先级反转,如何解决?
反问环节
9.8 二面 50min
自我介绍
项目介绍
因为我是RT-Thread的社区人员,看了我的github
然后现场看了我的B站作品视频
说我水平很厉害,要有自信,我说笔试完了一个多月没面试,别人二面完了我还没有开始面试,整的我没自信了
9.12 终面 35min
自我介绍
你更想以后职业发展为什么样的类型
如果让你不做技术专家,去领导一个团队,你愿意嘛?
你有什么困惑?
你有什么缺点?
如果以后你的工作岗位变动,但是底层相通,你会怎么办?
反问环节
五
一面
1. 自我介绍
2. 51和32架构的区别
3. Stm32处理中断的过程
4. 保护现场保护什么东西(寄存器和堆栈)
5. 要保护那些寄存器?
6. Stm32是要中断嵌套的吗,什么时候需要什么时候不需要
7. Cortex-m系列使用浮点会对stm32中断效率产生什么影响(不清楚)
8. 对嵌入式哪方面比较深刻,研究比较深入的
9. Uart是怎么样的接口
10. Uart异步,不需要时钟,那为什么还要设定波特率
11. Spi跟uart在使用上有什么区别
12. Spi和uart需不需要区分主从
13. Spi的从是否可以主动读写主的数据,怎么做到的
14. 写iic、spi、uart驱动需要哪些注意的地方
15. Iic、spi、uart接收方式有三种,轮询,中断和DMA,如果是中断收到的数据要谁去申请谁去释放
16. 中断里数据往一个buffer去放,这个buffer要谁去申请
17. 如何保证buffer读和写的互斥
18. 反问
六
一面凉经
首先是介绍项目,用的什么单片机,有没有用到RTOS,分了几个任务,由此问了一些RTOS的问题
- 你任务的优先级是怎么安排的,高优先级的的线程RTOS会怎么样处理?
- 相同优先级的几个线程是怎么运行的?
- 对于临界区数据的处理,使用互斥锁和自己通过条件来判断,哪样更好,为什么?
- 上下文切换的时候系统做了些什么?
C语言问题
- 函数指针了解么,在哪里有用到?
- struct字节对齐了解么?
- 什么是大端小端?
- 内存分配函数了解么?如果系统中只有10K内存,而我要分配12K,能分配成功吗?如果能,那么将分配到的区域用memset进行初始化,会成功吗?
- 除了堆区,程序运行的内存中还有哪些区域?
C++问题
- 智能指针有了解吗?
- 容器了解吗?vector实现的机制是怎么样的?
- 迭代器有了解吗?讲解一下你的理解
Linux问了多线程的处理,我只是用树莓派做过小项目,就回答了一下在树莓派中我是怎样处理的,然后面试官问,如果你用的是四核心处理器,那么分配300个线程合理吗?怎样分配才算合理?
面试官还问了多进程,但我没用过,直接就说没有了解过了。
我在树莓派上用过OpenCV,当时是写的CMake编译代码,结果面试官问了我CMake怎么包含别的CMake文件,尴尬,我没有用过这个功能,只好又说没有了解过
七
9.4一面
面试官项目问得超级仔细,具体到我的项目中freertos创建了几个任务,都是干嘛的,任务之间如何设计数据交互,反正基本上属于让你把项目给他完完整整的介绍清楚,看样子面试官还在用纸笔进行记录。
问了一个简单的问题,静态局部变量与局部变量的区别(很基础),但是接下来我就晕了,
为什么局部变量未定义时,每次初始化的结果是不确定的?是个真随机数还是个伪随机数?(我答:与栈的工作过程有关)
那么嵌入式中栈的工作机制是什么?(不会)
我连续调用同一个函数两次,他的局部变量初始化结果是否会一致?
最后面试官说,其实我想问一下你函数调用的过程。
然后你说静态局部变量存储在静态区,那么静态区的创建和消失是在什么时候?(答:创建时根据程序需求在主函数执行之前执行一个准备函数,其中进行内存申请,消失是随着程序的退出而消失)
那么我在windows里面运行了多个进程,其中一个进程执行完了,他的静态区会如何处理?
最后面试官说,可能你所接触的都是单进程,很少甚至忽略进程这个概念,其实我想问的是多进程的内存管理问题。
9.10二面
其实一面我就觉得很不好了,没想到二面更不好
上来就要你做一个自己的分析,分析你的优缺点以及的特长之类的内容。然后就开始问项目,项目也不多问,就问一句你觉得你的项目中最大的困难是什么?你是如何解决的
因为我有一个项目做了远程网络升级嵌入式,他就问我你有考虑过你的固件安全性问题吗?如果有其他人通过网络途径下载一个非官方的固件包,你怎么去判断?
不愧是大疆,这种问题我的第一次有人问我,果断躺平,没考虑过。
后面的项目都是问你自己觉得项目的难点在哪,怎么解决的,我自己的在说,面试官也不过多提问,然后就依次往下,一共说了三个项目,然后凑够了半个小时,
问我Linux有做过吗?我说项目里面写过几个demo给甲方参考,关于驱动、内核、QT等内容自己也都跟着课程自己学习过,目前正在自己魔改一个Linux项目
反问
我自己脑袋抽风,又问了一下没回答的这个固件安全的问题,面试官回答:这个可能和网络安全的内容相关,可能你现在对于网络安全的了解几乎为零,所以下去自己去看看相关的资料吧。
好的,谢谢老师,结束
总结一下,心凉了半截,简历项目写得比较详细,面试官打眼一瞅就差不多明白了是怎么做的了,然后就感觉他在嫌弃我项目太low了,项目也不问,都是我在叽里呱啦的说,从头说到尾,30分钟我差不多说了20多分钟
面试官就是说了几句话,这次没了,可以盖上盖了,大厂好难进啊
八
8.1 校招笔试(2hours)
有过星推官的经历后,我把DJI的难度放在了第一位(大哥内推都挂了,真的很难很严谨),感觉自己希望渺茫吧,因此没有刻意准备。
笔试做得稀烂(个人觉得)......那个时候同时开始准备其他互联网企业和大疆的秋招,每天都在恶补基础知识,所以更没怎么看嵌入式相关的内容。
笔试后自我总结:这次我肯定凉了*1
8.20 一面(50mins)
竟然给了机会进面试,收到邮件还以为是感谢信...所以我很认真准备了这次一面,各种八股以及国电、省电那些过程全都烂熟于心(我知道DJI一般不撕代码)
没想到的是,面试官一上来就对我硕士期间与某公司合作的一个算法库移植项目产生了浓厚兴趣,对这个算法的作用、移植的目的、是否了解目标平台的底层架构等,问了足足30分钟,以至于我反复确认自己没有输错会议号走错片场。倒数15分钟,终于问了一个常规的知识:简单说说进程调度和进程间通信。
最后10分钟是反问环节,此时我才知道这位面试官是机器学习部的大佬...我至今没想明白为什么会是机器学习部来面我,因为简历上并没有很突出的算法经历,都是嵌入式和后端开发相关的工作。
面试后自我总结:这次我肯定凉了*2
8.30 二面(15mins)
过了十天,HR打电话说进入了二面,而且还是和字节的终面连起来的。面完字节客户端的终面后稍微休息1h,匆匆忙忙准备了一堆嵌入式的面试材料(ucos那些)
但是,这一面完全出乎我的预料:全程只有15分钟。
一位年纪较大的面试官问了我几个研究生课题相关的问题,然后说:我看你的笔试成绩有点差,尤其是操作系统那部分,你笔试完后有没有自己去补一下这些知识?
我直接愣住,想了想我应当坦诚一些,就解释了一下为何我笔试成绩比较差(刚写完论文,没怎么复习相关知识),然后说自己后面买了几本相关的书籍回来看(顺手就拿了出来)
最后是反问,面试到此结束。
面试后自我总结:这次我肯定凉了*3
9.4 终面(30mins)
终面前一天下午我正在准备TX的初面。已经提前10分钟进入会议室的时候,突然接到DJI电话说进入了终面......虽然内心很震撼,但是经历过前面几次之后已经开始习惯DJI那无法预测的脚步。
面试官是一位算法岗leader,自带一种很强大的气场,谈吐之间就觉得非常不一般。这一面主要是价值观以及一些开放性问题,包括:
1. 你觉得自己本科阶段、硕士阶段最有难度的项目
2. 在这两个项目的过程中有哪些地方做的好&做的不好
3. 你对大疆这个公司有什么了解
4. 你对大疆的产品有没有什么建议(农业保植这块是否有考虑继续弄)
5. 唠嗑了一下我的运动员经历、为什么要参加体育竞赛、有没有考虑参加一些24小时的越野跑(?我没考虑过啊)
6. 反问
九
8月25号 一面:
电话面试
自我介绍后,直奔主题,可能是因为我自己写过OS吧...
1.线程切换是怎么设计的?
2.信号量、互斥量底层是怎么设计的?
3.内存管理是如何设计的?
4.中断管理是如何设计的?
5.你自己设计的OS相比于别人的,有哪些创新之处?
6.对咱大疆的产品有没有了解?你自己最想做哪个方向上的产品?
9月3号 二面:
一个比较严肃的面试官,一看就是老工程师了
自我介绍之后,全程没有花里胡哨,针对操作系统进行打击
1.实时操作系统的调度器设计细节?包括调度算法设计和上下文保存中的细节
2.一个操作系统中哪些地方会调用调度器?
3.一个信号量释放之后,在调度下一个线程的时候是如何选择的?
4.如何去评估一个操作系统的实时性是否满足要求?如何去测算中断响应时间?
5.MCU上如何设计用户态和内核态?如何保障操作系统的安全性?
6.如果让你去开辟一个新的产品,你会想做什么?
7.平时做驱动外设的时候,有没有遇到过一些棘手的问题?如何解决的?
最后面试官评价说还不错,至少底层的东西还是摸过一些
但我自己感觉一般,有些问题考虑的并不全面,对OS性能的关注也不够,期待还能有后面的流程...
9月12号 三面:
看起来像是个主管,比较大佬风范,问的东西偏向个人想法,不涉及技术细节:
1.进公司5年以后想成为什么样的人?有什么规划?
2.现在在你进入第三年的时候,在技术方向上已经有了一定程度的深耕,突然给了你一个任务去带几个应届生组成的小团队做一件新的事,你会如何选择?
3.在一个比赛过程中,你作为队长原本有一个稳妥的方案可以拿一个还不错的名词,这时一个队员提出来了一个大胆激进的想法,有可能一举夺冠,也可能彻底失败,你会怎么选择?
4.平时喜欢运动吗?为什么喜欢运动?
5.你作为教练,认为篮球运动里每个角色的分工和选人是怎么样的?为什么?你自己是打什么位置的球员?为什么打这个位置?
6.对于一个无人机产品,基于目前市面上已有的产品,你还有什么新的设计想法?
7.反问环节
十
1. 自我介绍,介绍自己熟悉LInux环境C、C++编程,Socket,Uboot,内核,根文件系统移植和项目。
2. 面试官直接说你觉得自己哪一块比较熟,详细说一说。
3. 介绍了操作系统的多级反馈调度策略,时间片轮转,在项目中如何指定优先级来调度进程完成快速响应(nice命令)。
4. 聊内存分配,进程内存分配,段页式存储,缺页终端,进程间通信的方式,为什么分用户空间和内核空间。
5. 详细聊了进程间共享内存的分配,在哪个空间,读写速度怎么样,通信是否需要经过内核。
6. 整个面试流程还是很好的,面试官循循善诱,自己对内存管理还是认知不足,对于mmap,共享内存的API不太熟。
7. 面试官让我往自己感兴趣的方向发展
十一
一面(一个面试官): 22min
1、自我介绍
2、询问项目用到的技术
3、Linux内核态、用户态的相关问题
4、socket编程相关知识
5、Linux设备驱动开发学过吗,有涉猎到哪些方面
6、Liunx字符设备驱动方面介绍一下(巴拉巴拉)
7、有没有拿到其他公司的offer,能否实习
8、反问环节(面试官从事的方向,下一步的安排..巴拉巴拉)
二面(一个面试官+一个HR):30min
1、自我介绍
2、C语言方面
- 作用域有哪几种类型
- static修饰符的作用(修饰全局变量、局部变量、函数时候分别发挥的作用)
- 说到static修饰局部变量只会初始化一次时,进一步问为什么只会初始化一次?(和存放位置有关,如果是普通局部变量会在栈区,函数调用完毕就会释放,当时没有准确回答出存的位置)
3、嵌入式中断的使用、以及使用的过程要注意什么(也就是问中断里面不能做什么)(不能长时间延时,不能printf,不能休眠 balabalba...)
4、如果使用中断时非要延时该怎么办(没答上来,当时脑子一热回答用定时器),面试官引导要用什么API,(仍然没回答上来),实际上要用udelay、mdelay...等
5、Linux设备驱动开发过程中,要调用相关的API进行内存分配,能答上几个(kmalloc、vmalloc...),面试官进一步问,这几个API的区别(没答上)
6、选一个项目进行说说(选了一个个人项目),介绍项目用到的技术、我认为的优点、缺点(巴拉巴拉巴拉)
7、项目实际上是一个ARM的嵌入式应用程序开发,面试官听到我用多线程处理多输入源(按键、触控屏、命令行)的时候,为什么不使用select,开销也不会特别大?
我:巴拉巴拉,以前的项目也使用过select,后来去了解select的监听机制之后知道了select会反复从内核空间和用户空间拷贝fdset会而造成较大开销,而用线程则只会在创建和销毁的时候有较大的开销(个人体会,不一定正确)
8、说一下TCP三次握手的具体过程?我:巴拉巴拉巴拉... 面试官追问:为什么不能只进行二次握手,巴拉巴拉(只回答出了一种情况)
9、反问环节:面试官从事的方向?我的专业技能在贵公司能从事哪部分的工作?
十二
一面 0815
- 聊具体项目。
- 关于测试,你是如何测试malloc的溢出问题
- IIC SPI介绍,另外姿态解算部分,互补滤波如何处理的。
- STL库的内存配置?二级内存配置,为啥是二级内存配置?为啥是128bytes?这个为啥是128bytes,应该是从内存碎片化的角度来讲?
- 程序出现挂死的现象,如何进行调试?(不清楚,GCB dump)使用情况如何。
- ARM的多核某一核出现多载的现象,如何处理?(自己没有接触过)
- 问完了,结束(感觉面试管没有看上我)
- 反问:(应该要问3题这个问题的)刚刚那个问题,为啥128bytes,我也有点不太清楚,按你的角度来看呢?
二面 0826
- 算是一个综合的面试,
- 从项目出发,问道使用Autosar解决什么问题?为什么行业都使用它?它的优势是什么?
- 你对DJI的产品的了解?(说了手持相机之类的)
- 那你感觉手持相机,有哪些需要提升的点?
- DJI的无人机有哪些需要提升的点?
- 总之,答的不是很顺畅,很多都没有准备?也没有涉及到技术。
#大疆##秋招##面试##面经##嵌入式#