荣耀嵌入式软件二面 面经

二面和一面相比完全不是一个量级,一面还算是考察基础知识,二面更像是在和你讨论技术方案,每个问题都有大量追问,而且他会故意提出反驳意见看你怎么应对。项目聊了将近四十分钟,他把我项目里的每个技术决策都问了一遍为什么,有几次我答不上来被他直接指出设计上的问题。

1. 讲一下 FreeRTOS 的任务状态机,每种状态之间的转换条件是什么,阻塞状态和挂起状态有什么本质区别?

答:FreeRTOS 的任务有五种状态:运行、就绪、阻塞、挂起、删除。

运行状态是任务正在占用 CPU 执行,单核系统里同一时刻只有一个任务处于运行状态。

就绪状态是任务具备运行条件,等待调度器分配 CPU。所有就绪任务按优先级排在就绪列表里,调度器每次选优先级最高的就绪任务运行。

阻塞状态是任务在等待某个事件发生,比如等待信号量、等待队列有数据、等待延时到期。处于阻塞状态的任务不占用 CPU,调度器不会选它运行。阻塞有超时机制,等待时可以指定最长等待时间,超时后任务自动回到就绪状态。

挂起状态是通过 vTaskSuspend 显式挂起的任务,和阻塞状态的本质区别是:阻塞状态有明确的唤醒条件,事件发生或超时后会自动恢复;挂起状态没有唤醒条件,必须由其他任务或中断调用 vTaskResume 才能恢复,不会自动唤醒。挂起状态通常用于调试或者需要暂停某个任务的场景。

删除状态是任务调用 vTaskDelete 后进入的状态,任务的栈和 TCB 等待空闲任务回收,空闲任务会定期清理已删除任务的资源。

状态转换:就绪→运行是调度器选中;运行→就绪是被高优先级任务抢占或时间片用完;运行→阻塞是等待事件;阻塞→就绪是事件发生或超时;运行/就绪→挂起是被显式挂起;挂起→就绪是被显式恢复。

2. 互斥锁的优先级继承是怎么实现的,有没有它解决不了的场景?

答:优先级继承的实现原理:当高优先级任务尝试获取一个已被低优先级任务持有的互斥锁时,FreeRTOS 会临时把低优先级任务的优先级提升到和高优先级任务一样,让它尽快执行完临界区并释放锁。低优先级任务释放锁之后,优先级恢复到原来的值。这个过程由互斥锁的获取和释放函数内部自动处理,不需要用户干预。

在 FreeRTOS 的实现里,互斥锁的 TCB 里记录了持有者,获取失败时检查持有者的优先级,如果低于当前任务就提升它的优先级,同时把当前任务加入等待列表。释放时恢复持有者的原始优先级,唤醒等待列表里优先级最高的任务。

优先级继承解决不了的场景:

第一是链式优先级反转。任务 A 持有锁1,任务 B 持有锁2 等待锁1,任务 C 等待锁2。优先级继承只能处理直接的持有者,链式场景需要递归地传播优先级提升,FreeRTOS 的实现不支持递归传播,这种场景下优先级反转仍然存在。

第二是多锁场景。一个任务同时持有多个锁,另一个高优先级任务等待其中一个,优先级继承会提升持有者的优先级,但如果持有者还在等待另一个锁,情况会变得复杂,可能出现死锁。

第三是优先级继承本身不能防止死锁,只能缓解优先级反转。如果两个任务互相等待对方持有的锁,优先级继承无法解决,还是会死锁。

3. 你了解 tickless idle 模式吗,它是怎么实现低功耗的,有什么代价?

答:正常情况下 FreeRTOS 的 SysTick 每个 tick 都会产生中断,即使系统里所有任务都在阻塞等待,CPU 也会被 SysTick 定期唤醒,无法进入深度睡眠。

tickless idle 模式的思路是:当所有任务都处于阻塞状态时,调度器计算出最近一个任务会在多久后唤醒,然后关闭 SysTick,让 CPU 进入低功耗睡眠模式,同时用一个低功耗定时器(比如 RTC 或者 LPTIM)在那个时间点唤醒 CPU。CPU 醒来后根据实际睡眠时长补偿系统 tick 计数,然后恢复 SysTick,继续正常调度。

实现上,FreeRTOS 提供了 vPortSuppressTicksAndSleep 这个弱函数接口,用户根据具体芯片实现低功耗进入和退出的逻辑,FreeRTOS 在空闲任务里调用它。

代价有几个方面。首先是实现复杂,需要根据具体芯片配置低功耗定时器,处理各种唤醒源,不同芯片差异很大。其次是 tick 补偿有误差,睡眠期间如果有外部中断提前唤醒,补偿的 tick 数可能不精确,对时间精度要求高的场景需要额外处理。另外进入和退出低功耗模式本身有时间开销,如果任务频繁切换,这个开销可能抵消省电效果,tickless 更适合任务间隔较长的场景。

4. 讲一下 ARM Cortex-M 的异常处理机制,HardFault 发生时 CPU 做了什么,怎么从 HardFault 里获取有用的调试信息?

答:异常处理机制:Cortex-M 有一套固定的异常处理流程。异常发生时,如果当前优先级允许响应,CPU 完成当前指令后进入异常入栈流程,自动把 xPSR、PC、LR、R12、R0-R3 这八个寄存器压入当前使用的栈(MSP 或 PSP,取决于当前模式),然后从向量表取出对应的处理函数地址,跳转执行。异常处理函数返回时,CPU 从栈里弹出这八个寄存器,恢复到被打断的状态继续执行。

HardFault 是一个兜底异常,当其他异常(MemManage、BusFault、UsageFault)没有使能或者在处理过程中又发生了错误,都会升级为 HardFault。常见触发原因有访问非法地址、执行非法指令、除零、未对齐访问(在某些配置下)。

从 HardFault 获取调试信息的方法:

HardFault 发生时,CPU 已经把出错时的寄存器压栈了,关键是找到这个栈帧。在 HardFault_Handler 里,通过读取 LR 寄存器的值判断出错时用的是 MSP 还是 PSP,然后读取对应的栈指针,从栈帧里取出 PC 值,这个 PC 就是出错时正在执行的指令地址。

拿到 PC 之后,在 map 文件里查找这个地址对应的函数和行号,就能定位到出错位置。

另外 SCB 里有几个状态寄存器提供更多信息:CFSR(Configurable Fault Status Register)记录了具体的错误类型,BFAR 记录了导致 BusFault 的访问地址,MMFAR 记录了导致 MemManage fault 的地址。把这些信息打印出来对定位问题很有帮助。

如果有调试器,直接在 HardFault_Handler 里打断点,查看 Call Stack 窗口,IDE 通常能自动解析栈帧显示出错位置。

5. 讲一下 Flash 的写入原理,为什么 Flash 只能写 0 不能写 1,擦除和写入的关系是什么?

答:Flash 的存储单元是浮栅晶体管,浮栅是一个被绝缘层包围的导体,通过控制浮栅上的电

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论
佬请问荣耀社招会有机考吗
点赞 回复 分享
发布于 04-04 17:02 陕西
这个必须付钱看吗,有免费的吗
点赞 回复 分享
发布于 03-29 18:10 陕西

相关推荐

三分入剑:我怎么觉得研发被ai冲的没什么出路呢 fae跟人打交道也不错吧
点赞 评论 收藏
分享
✉️投递:游戏引擎,投递公司有腾讯、网易、字节、完美、米哈游、阿里、鹰角、深蓝互动、祖龙娱乐、不鸣科技💬面试:--------------------------------------------------------------腾讯,游戏客户端,y1s1一开始被客户端拉过去面试我还挺懵逼的,以为是我简历不匹配游戏引擎,后来才知腾讯游戏客户端招聘是大类招聘,里面有细分出游戏引擎岗:一战 ,天美j3一面3.14,面试官感觉很年轻,沟通起来很畅快,就算一些八股没答上来也没为难我二面3.17,一个戴帽子的老登,开局问我字符串比较优化,一开始答得偏算法思路,最后告诉我用SIMD优化,乐,开局难绷,后面也答得马马虎虎,二十分钟结束,挂二战,天美j1一面3.25,挂中间被腾讯地图捞过去了,但是我觉得技术栈不匹配就拒绝了,当时面试官还加微信劝我不要放弃(感动),不过我还是大脑抽风拒绝了,要是我当时选择腾讯地图,说不定真有机会,命运转折点说是三战,天美4.16开发 王者荣耀:世界 的,666,不会拉了托大的,要拉实习生去背锅吧,面试八股回答感觉良好,但是最后笔试给了我一个力扣周赛题,挂四战,依旧天美,那么缺人?一面4.23,沉淀了一个月,八股文倒是没太大的卡壳,一面通过4.23~5.7 腾讯官网显示一面通过,但是二面还在审核中,5.7一看给我挂了,不会一面也横向吧--------------------------------------------------------------网易网易互娱,第一志愿游戏客户端研发,第二志愿游戏引擎研发,还好当时**地把游戏引擎填第二了,因为笔试没准备好,游戏客户端研发挂了,同时期还投了网易雷火游戏引擎,笔试更是逆天,挂之后磨磨蹭蹭一个月,网易互娱第一志愿才结束,开启第二志愿,依旧笔试,因为已经沉淀了一个月,拿下网易互娱,游戏引擎开发一面4.15,年轻面试官,很帅的一个小哥,真感觉年轻面试官交流都很舒服,不会压力人,笔试手搓共享指针和弱指针,没问题,八股和项目也没问题,过,反问环节还和小哥聊了二十分钟,非常开心二面4.17,开局十分钟我和面试官互相走错线上面试会议,中年面试官,感觉至少组长级别,无笔试,八股深挖技术底层,SSGI一路问到蓝噪声怎么实现的,我只会用不会原理喵,有点压力,另外,我当时学校会议室约满了,就跑去找了间空教室,之后教室零零散散进来几个人,呜呜呜,太尴尬了,搞得我前十几分钟答得都有点不自在。说实话,我答得不是很好,就这样和面试官折磨四十分钟后,结束。4.24通知二面通过,约HR面,当时我内心只有何意味4.30HR面,就是问些简历和经历,没啥5.8五一放假,一个星期一直无消息,然后网易就打电话口头OC,感谢易父的收留--------------------------------------------------------------字节一战笔试挂二战,面试官用耳机麦讲话,听不清一点,挂三战一面4.8,当时不知道为啥我特别口吃,感觉有点给面试官听红温了,不过还是给我过了,不得不说字节效率真高,面试结果基本上都是当天出二面4.10,八股项目答得都ok,但是给我挂了,何意味--------------------------------------------------------------不鸣科技一面4.9,面试官挺好的,答不出来会提醒我,过二面4.15,面试官问我deffered pass为什么不推荐MSAA,而forward pass又可以,我当时因为一个历史遗留级错误——分不清deffered-lighting pass和forward pass,一直说deffered-lighting pass片段着色器采样的是几何纹理,它开MSAA收益不大,并且Gbuffer pass开MSAA很吃带宽显存,然而面试官问的是deffered pass和forward pass,全部白答,挂--------------------------------------------------------------阿里一面4.15,在这之前做了笔试,但是感觉阿里笔试比其他家难那么多,估计笔试没过,导致我一面答得不错,最后还是挂了,另外阿里笔试好像沿用到秋招,这下连秋招都给我一块斩杀了完美世界一面3.27,面完无消息,默认挂祖龙娱乐一面4.2,挂米哈游简历挂,深蓝互动,鹰角笔试挂📝offer:仅网易互娱一家🎙️我的感受:俺是大二下All in就业的,一开始C++和计算机图形学一块搞,没什么编程思维,学起来太牢了,过了一遍LearnOpenGL和Games101,但是最后看了和没看一样,学了半年,开始入手Vulkan,更是重量级,有一种原始底层的美,这时开始学会用项目磨练自己,也为我之前学得一塌糊涂的图形学买单,摸爬滚打学到今年3月份,开始暑期实习投递期间自己做了个玩具引擎,本来打算去看UE5渲染管线源码的,但是看不懂喵,我已急哭,又滚回去搓自己的引擎了,但是经过多次面试的反问环节后,diy商业引擎呢,一般都是去定制RDG了,很少动RHI,可能也就自研引擎的RHI改动多点,如果重回一年前,我估计就不去啃vulkan哪些底层api调用了,直接去看UE5渲染管线,学会自己去改RDG层的源码
我的求职进度条
点赞 评论 收藏
分享
评论
1
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务