星星充电 嵌入式软件开发 二面 面经

1. 介绍一下你做过的最复杂的项目,重点说架构设计和你遇到的最难的技术问题。

答:

  • 二面开场,考察系统思维和技术深度,不是简历复读
  • 回答结构:项目背景(一句话)→ 架构设计思路(为什么这么分层)→ 最难的技术问题(具体说,不能说"遇到了很多困难")→ 结果
  • 充电桩方向的加分点:有通信协议经验(OCPP/MODBUS)、有多任务设计经验、有实际落地经验
  • 面试官会顺着你说的细节追问,只说你真正主导过的部分

2. 充电桩系统中,主控MCU需要同时处理充电控制、计费、通信、安全监控多个任务,你会怎么设计任务优先级和调度策略?

答:

  • 任务分级原则:按实时性和安全性划分
  • 最高优先级(硬实时):安全监控任务,过压/过流/过温检测,响应时间要求<1ms,直接在中断或最高优先级任务里处理,不能被任何任务阻塞
  • 高优先级:充电控制任务,PWM输出、CP信号检测、充电状态机,响应时间<10ms
  • 中优先级:通信任务,OCPP消息收发、MODBUS数据读取,响应时间<100ms
  • 低优先级:计费任务、日志记录、状态上报,对实时性要求低
  • 关键设计:安全监控任务不能依赖通信任务的数据,必须有本地的硬件保护(硬件过流保护电路),软件是第二道防线
  • 任务间通信:用消息队列传递数据,不用全局变量直接共享,避免竞态

3. 你在项目中用过哪些进程间通信或任务间通信方式,各自适合什么场景,有没有遇到过通信导致的bug?

答:

  • 任务间通信方式对比: 消息队列:有消息边界,异步,适合任务间传递命令和数据,FreeRTOS的xQueueSend/xQueueReceive信号量:用于同步和资源计数,二值信号量做事件通知,计数信号量管理资源池互斥量:保护共享资源,有优先级继承,防优先级反转事件组:一个任务等待多个事件同时发生或任意一个发生,比多个信号量更简洁共享内存+互斥锁:大数据量传递,避免拷贝,但需要仔细管理锁
  • 常见通信bug: 消息队列满了丢消息,发送方没有检查返回值,导致数据静默丢失信号量使用不当导致死锁,两个任务互相等待对方的信号量共享数据没有加锁,多任务并发访问导致数据撕裂

4. 请解释TCP的三次握手和四次挥手,TIME_WAIT状态为什么需要等待2MSL,在充电桩的长连接场景中如何处理连接断开重连?

答:

  • 三次握手:客户端发SYN → 服务端回SYN+ACK → 客户端发ACK,三次是为了确认双向通路都通畅,两次握手无法确认服务端到客户端的通路
  • 四次挥手:主动方发FIN → 被动方回ACK(此时被动方可能还有数据要发)→ 被动方发FIN → 主动方回ACK,进入TIME_WAIT
  • TIME_WAIT等待2MSL的原因:确保最后一个ACK能到达对端(对端没收到会重发FIN);让网络中残留的旧报文自然消亡,防止新连接收到属于旧连接的延迟报文
  • 充电桩长连接断开重连策略: 检测断连:TCP keepalive(设置SO_KEEPALIVE,配置探测间隔和次数)+ 应用层心跳(OCPP的Heartbeat消息)双重保活重连策略:指数退避,1s、2s、4s...上限60s,加随机抖动防止大量设备同时重连重连后恢复:重新发送BootNotification注册,恢复订阅的topic,检查是否有未完成的事务需要续传

5. 请解释Linux中的epoll机制,为什么比select/poll性能好,在充电桩的网络通信模块中你会怎么用?

答:

  • select/poll的问题:每次调用都要把整个fd集合从用户态拷贝到内核,内核O(n)遍历所有fd,fd多时性能差,select还有1024的fd数量限制
  • epoll的优势:用事件驱动,epoll_ctl注册fd时内核建立回调,fd就绪时直接加入就绪链表,epoll_wait只返回就绪的fd,O(就绪数量),与总fd数量无关
  • ET(边缘触发)vs LT(水平触发):LT只要有数据就持续通知,编程简单;ET只在状态变化时通知一次,必须一次性读完数据(循环read直到EAGAIN),系统调用次数少,延迟低
  • 充电桩通信模块设计: 一个主线程用epoll监听所有连接(OCPP WebSocket连接、MODBUS TCP连接、本地管理接口)ET模式+非阻塞socket,收到数据后投递到工作线程队列处理主线程只做事件分发,不做业务处理,保证低延迟响应

6. 请解释什么是内存泄漏,在长期运行的嵌入式Linux系统中如何检测和预防内存泄漏?

答:

  • 内存泄漏:申请的堆内存没有被释放,且没有任何指针指向它,进程内存持续增长,最终OOM崩溃
  • 不容易发现的泄漏场景: 异常路径上的泄漏,函数中途return或异常,后面的free没有执行容器里存裸指针,容器clear时只释放指针本身,不释放指针指向的对象第三方库资源忘记释放(数据库连接、文件句柄)循环引用(C++的shared_ptr互相持有)
  • 检测工具: Valgrind memcheck:最全面,但运行速度慢(10-20倍),适合开发阶段AddressSanitizer(ASan):编译时加-fsanitize=address,运行时开销约2倍,错误信息详细/proc/PID/status中的VmRSS:监控进程内存是否持续增长,简单有效
  • 预防:用RAII封装所有资源,C++用智能指针,C语言用统一的资源管理模式(分配和释放在同一个模块)

7. 请解释什么是看门狗任务,在多任务系统中如何设计一个能检测所有关键任务是否正常运行的看门狗机制?

答:

  • 简单喂狗的问题:只有一个喂狗任务定期喂狗,只能检测喂狗任务本身是否存活,其他任务卡死了喂狗任务还在跑,看门狗不会触发
  • 完善的多任务看门狗设计: 每个关键任务维护

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

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

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

全部评论

相关推荐

04-23 21:26
已编辑
门头沟学院 Unity3D客户端
鼠鼠bg是个28江西双非本,在今天终于拿到面试了&nbsp;现在来发下面经&nbsp;就当是为自己攒好运了一面:26分钟一面主要是算hr面的?主要是是个初创公司&nbsp;人员架构非常小1.自我介绍2.讲解了一下公司背景&nbsp;&nbsp;后面开始询问一些游戏开发的时候遇到的问题了(可能是hr面&nbsp;不是很懂技术)问题1:一个跑酷游戏&nbsp;不断地生成场景你会怎么设置&nbsp;让这个内存不会崩溃答:用对象池的形式&nbsp;复用场景中的对象&nbsp;减少new的内存成本问题2:在3d角色到墙角之后&nbsp;怎么样的调试可以让摄像机不被挤到外面去&nbsp;或者说不穿模(鼠鼠一开始是蒙的)答:摄像机进行范围检测&nbsp;检测到碰撞器之后&nbsp;就用特定的算法&nbsp;调整摄像机的角度(瞎答的&nbsp;不知道对不对)问题3:一个游戏场景中&nbsp;有一百个人&nbsp;你要怎么渲染才能不造成卡顿(老生常谈这个问题)答:根据具体的需求&nbsp;选择精细渲染周边的角色&nbsp;远处的角色用lod方式&nbsp;减少渲染的精度问题4:你玩了什么游戏?如果让你实现一个只狼的振刀效果你会怎么做?(属实是给我问蒙了&nbsp;因为我真的没有去想过这方面)答:我会在一个敌人攻击下落的时候进行判断,比如多少帧之内&nbsp;一个角色即在敌人的攻击范围又按了防御键就振刀成功(瞎答的)问题5:我们要上线一个手游&nbsp;但是在一些低端机上面运行的时候会发热&nbsp;你会怎么解决这个问题?答:可以根据的手机的性能&nbsp;通过热更新加载不同的材质包&nbsp;然后再ui拼的界面&nbsp;使用动态合批和静态合批&nbsp;减少canvas的rebuild和&nbsp;drawcall的产生一面就到此结束了&nbsp;后面聊了一下&nbsp;公司是完全用lua开发&nbsp;以及是roblox(这个鼠鼠没接触过&nbsp;真不知道)平台上的ugc当天晚上7:30二面:技术面询问是否需要自我介绍,说不需要1.说说数组和列表的区别&nbsp;(这个就不给答案了)2.你知道什么样的排序方式&nbsp;最熟悉哪个(老生常谈)答:冒泡和快速排序&nbsp;&nbsp;让后鼠鼠说了一下快速排序的底层实现逻辑&nbsp;时间复杂度&nbsp;&nbsp;被反问了空间复杂度&nbsp;回答是n3.拷打项目4.询问如果有人用外挂篡改客户端的数据&nbsp;你要怎么保证这个外挂没有办法得逞答:将实际数据存储再服务端上&nbsp;客户端发送请求的时候&nbsp;&nbsp;用服务端对数据进行逻辑处理5.如何使用ai&nbsp;&nbsp;ai开发中遇到问题怎么办答:多注意提示词的运用&nbsp;遇到问题&nbsp;对症下药&nbsp;结合ai去解决&nbsp;实在解决不了去求助6.如果美术和策划吵起来怎么办(面试官问的时候自己都笑了)答:大家坐下来饮茶先~&nbsp;好好谈反问:&nbsp;您觉得我晚上的面试情况怎么样?&nbsp;答:挺好的以上&nbsp;总得来说&nbsp;基本上都是开发过程中会遇到的问题&nbsp;八股的考察比例十分的少&nbsp;不知道为啥&nbsp;本来准备前还很焦虑的&nbsp;哈哈哈结果还不错最后&nbsp;祝大家都能找到好的实习!
查看11道真题和解析
点赞 评论 收藏
分享
4月29boss投递的简历&nbsp;约到5月8号早上面试因为是个小厂&nbsp;给的也不是很多&nbsp;所以就随便准备准备了上来就是八股1.struct和class的区别&nbsp;在开发中如何使用2.委托和事件的关系&nbsp;如何用action编写一个简单的事件订阅系统示例3.协程是什么?它和多线程有什么本质区别?4.awake和start的区别&nbsp;在2d&nbsp;AI物理移动时,为什么通常将逻辑写在fixedUpdate里面&nbsp;而不是update中5.什么是Scriptableobject&nbsp;&nbsp;SO相比于在每个Prefab里面MonoBehaviour面板上直接配置这些数值有什么优势?6.如何使用2d射线检测到一个玩家7.向量点乘&nbsp;叉乘相关8.fsm和行为树的差异&nbsp;你要实现一个简单的巡逻保安AI你会选择什么模式9.如果实现类似《空洞骑士》里面&nbsp;怪物遇到墙壁或者走到平台边缘掉头?&nbsp;你的实现方法是什么?10.两种近战攻击判定机制&nbsp;A:用碰撞器检测是否攻击到&nbsp;B:在帧动画的关键中调用一次范围检测来实现&nbsp;这两种的优缺点&nbsp;你觉得那种好?因为没怎么准备&nbsp;心里还是有点发怵的&nbsp;没想到头一次unity方向八股考了这么多&nbsp;七七八八的答了下后面技术主管来了11.拷打项目12.为什么选择游戏行业&nbsp;会玩什么游戏(为什么很多面试官都会问这个问题&nbsp;有没有能给鼠鼠解答一下)13.如果你在上面攻击判定的时候&nbsp;选择了b方法&nbsp;因为这个方法是依赖帧实现的&nbsp;如果你在攻击的时候因为网络波动原因导致攻击丢失怎么办?答:交给服务器处理&nbsp;(因为还没做过网络相关的模块&nbsp;这一点还真不知道)14.经典问题来了&nbsp;你在项目里遇到的难点是什么?怎么解决?15.平常是否使用ai反问环节1.如果入职之后是做什么工作?2.有没有入职培训?3.询问一下面试表现答:(笑)挺好的&nbsp;我觉得还ok后续过一个小时&nbsp;boss上面就通知面试通过了总结:出乎意料的八股询问这么多&nbsp;项目也询问了一些&nbsp;但是感觉项目询问的偏简单&nbsp;可能就是想知道项目是不是自己写的吧。base地是福州&nbsp;如果给多一些&nbsp;鼠鼠还真挺想去的最后祝各位都能找到合适的工作!!!!
查看18道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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