10.19 记忆科技嵌入式一面:I2C、cache 一致性与大小端
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 做一下自我介绍。
- I2C 介绍,I2C 读的步骤、从设备数量、标准速率?
- 线程与进程的区别?为什么线程要同步?同步的方法有哪些?
- 项目中的知识蒸馏是怎么做的?如何轻量化?
- FP16 与 INT8 有什么区别?
- C 与 C++ 的区别?
- 空指针、野指针是什么?
- 内存泄漏是怎么回事?
- 堆与栈,访问效率谁高?
- cache 一致性是什么?如何解决?
- 大小端是什么?双方不一致如何解决?
- 反问。
《参考解析》
I2C:两根线 SCL/SDA,开漏加外部上拉,支持多主多从,7 位地址最多 112 个从设备(保留地址除外)。标准模式 100kHz、快速模式 400kHz、快速+ 1MHz。读流程:起始 → 发从机地址+写位 → 发寄存器地址 → 重复起始 → 发地址+读位 → 读数据(主机回 ACK/NACK)→ 停止。
线程同步:互斥锁、读写锁、条件变量、信号量、原子操作;同步是为了保护共享数据、保证顺序、避免竞态。
蒸馏与量化:蒸馏用大模型(教师)的软标签训练小模型(学生),损失是 KL 散度加硬标签交叉熵;轻量化还包括剪枝、量化、低秩分解。FP16 是指数 5 位、尾数 10 位,动态范围大但精度低;INT8 是定点,需要 scale/zero-point 校准,速度快、显存小,但可能掉点。
C vs C++:C 是面向过程、无类、手动内存管理;C++ 支持类、继承、多态、模板、RAII、STL、异常。嵌入式里 C++ 常用但要注意代码体积和异常/ RTTI 开销。
空指针/野指针/内存泄漏:空指针是值为 nullptr 的指针,解引用会崩;野指针指向已释放或未初始化的内存,行为未定义;内存泄漏是申请后未释放,长期运行会耗尽内存。工具:静态检查、ASan、Valgrind、代码审查。
堆 vs 栈:栈由系统管理、连续、访问快(寄存器+缓存友好),大小有限;堆手动管理、可能碎片、访问相对慢。
cache 一致性:多核各自 cache 同一地址会不一致,用 MESI 协议和总线嗅探维护;DMA 场景要软件做 cache invalidate/flush,或使用非缓存内存。
大小端:大端高字节在低地址,小端相反;网络字节序是大端。通信双方约定统一字节序,用 htonl/ntohl 或手动移位转换。