面灵AI→

万集科技嵌入式一面:Cortex-M 启动流程、外部中断配置与推挽开漏

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 用两分钟介绍一下自己,并说明为什么投嵌入式软件开发?
  2. 挑一个你最熟的项目,从需求、模块划分到你的职责讲清楚。
  3. 这个项目里你做过哪些架构选型,为什么这么拆任务?
  4. 项目里印象最深的一次故障是什么,你怎么定位并验证修复?
  5. Cortex-M 上电后到 main 之前大致经历哪些步骤?
  6. 外部中断从触发到进 ISR,中间经过哪些关键配置?
  7. 推挽输出和开漏输出分别适合什么场景?

《参考解析》

「为什么投嵌入式」 别只说喜欢硬件。给一条可验证的因果:做过什么(哪块板、哪个驱动)、过程中对什么产生了兴趣(时序、功耗、能把代码落到板上)、以及它和这个岗位的业务怎么对上(万集做智能交通与车路协同,路侧设备要长期在线、通信可靠)。

项目按三层讲:业务目标(采什么数据、怎么处理、输出到哪)、硬件边界(主控、关键外设、通信接口、实时性要求)、软件分层(板级驱动 / 协议与缓冲 / 应用任务 / 联调接口)。然后明确自己负责的模块,最后给可验证结果:帧率、丢包率、功耗、误触发率、连续跑机时长。有数字的这一层是区分「做过」和「讲得清」的关键。

为什么这么拆任务:判据是「周期 / 优先级 / 是否阻塞」。多路周期采集 + 阻塞 IO 才值得上 RTOS,否则裸机状态机更简单可靠;驱动层只做寄存器与中断收数,协议解析放独立任务,避免 ISR 里做重活;跨任务用队列或环形缓冲,共享变量加保护。

故障复盘要完整:现象(偶发死机/丢帧/通信卡住)、复现条件、缩小范围的手段(对比版本、抓波形、看日志、加压测试)、根因(中断过重、竞态、DMA 缓冲覆盖、优先级反转这类)、修复方式、以及修复后的验证(长稳测试 + 回归用例)。

Cortex-M 从复位到 main:从向量表取初始 MSP 与 Reset_Handler 地址 → 启动文件拷贝 .data、清零 .bss、按需初始化 FPU → SystemInit 配时钟 → __libc_init_array(C++ 全局构造)→ main。带 Bootloader 时还要处理向量表重映射与外设状态清理。

外部中断的关键配置:GPIO 设为输入并配上下拉保证空闲电平稳定 → 映射到 EXTI 线并选边沿 → 清挂起标志 → 使能 EXTI 中断线 → 在 NVIC 里使能并设优先级。ISR 里先读状态、清标志,把耗时处理丢给任务;按键类信号要防抖(硬件 RC、定时采样或「中断触发 + 定时确认」)。

推挽 vs 开漏:推挽可主动拉高拉低、驱动能力强,用于普通 GPIO、LED、需要快速上升沿的场合;开漏只能拉低、高靠上拉,用于 I2C 这类线与总线、电平转换与多设备共享信号线,上拉阻值要结合总线电容与速率计算。