零跑面经

  1. 你们项目里用到的几种车载总线在物理层和数据链路层分别有什么差异?以CAN为例,总线电平从显性切到隐性时,接收端是如何判定位边界的?如果总线长期处于高负载状态,你们会通过调整哪些报文发送周期或触发方式来避免低优先级帧一直发不出去?
  2. 在多任务环境下,有没有一个任务既要处理高频外部事件又要执行耗时计算?你们是怎么拆分这类任务的,划分任务优先级的依据是执行频次还是后果严重程度?有没有因为一个低优先级任务拿着资源不放,导致高优先级任务被挂起的经历?当时是通过什么同步机制替换来解决的?
  3. 访问MCU内部外设寄存器时,除了声明 volatile,为什么有时还需要配合内存屏障指令?如果代码里某个寄存器读操作被编译器优化掉或者顺序调整了,可能会导致哪些不易察觉的硬件状态错误?const volatile 修饰的变量,在硬件层面一般对应什么类型的存储区域?
  4. 跨平台通信时,如果接收端和发送端的结构体内存布局不同,除了效率问题,会不会因为非对齐访问导致硬fault?你们在解析CAN报文中跨字节拼接的信号时,是采用位域结构体还是手动移位掩码?对于多帧组合信号又是如何保证数据一致性的?
  5. 在没有MMU的MCU上,如何通过静态代码检查提前发现可能撑爆栈的调用链?运行时系统突然跑飞或复位,你们通过哪些方法来判断是栈溢出而不是其他内存越界?是否在链接脚本里留了保护区域,并在任务切换时做检查?
  6. 从硬件引脚收到一个紧急信号到对应的处理函数真正跑起来,你们系统的最长响应时间是多久?这段时间里,哪些部分是硬中断关中断造成的,哪些是调度器锁造成的?为了缩短这个延迟,你们在中断嵌套配置和临界区保护上是怎么取舍的?
  7. 假设两个任务互相等待对方手里的互斥量导致死锁,如果现场只有串口输出功能,你会设计什么样的信息输出方案来还原发生死锁时的任务调用链和锁持有情况?
  8. 独立看门狗和窗口看门狗在防止程序跑飞时的侧重点有什么不同?如果用一个专门的任务去定期喂狗,但这个任务本身因为优先级太低而被饿死,你们的看门狗复位机制还能正常工作吗?有没有考虑过用硬件定时器中断来替代任务喂狗?
  9. Linux中断处理下半部有几种常见机制,如果要在驱动里周期性采集几百字节的传感器数据然后推给应用层,你会选择tasklet还是工作队列?它们在调度时机和运行上下文上对你的数据吞吐和实时性会产生什么影响?
  10. mmap 映射设备内存到用户空间后,进程直接读写映射区时,CPU内部是怎么绕开传统文件读写那套缓存机制的?这种方式在你写一个需要频繁更新大量寄存器配置的驱动时,相比反复调用 ioctl 有哪些性能上的直观差距?
  11. 读写锁在读多写少的场景下比互斥锁好在哪?但它内部是怎么实现读锁计数和写锁等待的?如果读者源源不断,写者一直拿不到锁,这种现象你们在实际项目里是怎么通过锁的公平性调整或者改用RCU来规避的?
  12. 父进程 fork() 后,子进程修改一个全局变量的值,父进程能看到变化吗?在这个过程中,内核是通过什么机制来推迟物理页框的实际拷贝的?如果子进程紧接着调用 exec,那么刚才为了写时复制做的那套页表标记工作是不是就白费了?
  13. 在编写一个简单的字符设备驱动时,file_operations 里除了 read 和 write,mmap 和 unlocked_ioctl 分别适合处理什么类型的用户交互请求?有没有因为用户态传入的缓冲区地址在内核态直接访问而导致 oops 的经历?后来是怎么修正的?
  14. 车载娱乐系统和动力总成系统在传输音视频流和控制指令时,分别为什么倾向选用TCP或UDP?SOME/IP协议在服务发现阶段是如何让客户端知道某个服务当前能提供哪些具体方法的?它相比纯socket通信,在动态网络环境下有哪些优势?
  15. 中断向量表里同一个中断号被多个设备共享时,内核是怎么依次回调各个设备注册的处理函数的?如果其中一个设备的处理函数里忘记检查中断状态寄存器就返回了,会给其他共享该中断线的设备带来什么后果?你在写驱动时是如何避免这个问题的?

#嵌入式##春招至今,你收到几个面试了?#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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