视源科技 CVTE 嵌入式软件开发一面面经
- 轮次
- 一面
- 结果
- 已挂
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 做 MCU 还是 APP?
- 为什么实习中会涉及到运动控制器和 APP 开发,你是偏哪一端的?
- 你只是做个通信开发是吗?
- 有 RTOS 经历是吧,分享一下对于 RTOS 的理解。
- 分享一个解决问题的经历?
- 任务有哪些类型?
- 如何确认任务的堆栈大小?
- 平时有没有了解临界(区)资源?
- 如果没有临界区呢?
- 有没有了解 I2C 基础等外设内容,简单分析下?
- 做笔试算法题(非常简单的整型数据相加)。
- 关于 AI 编码的看法?
《参考解析》
对 RTOS 的理解怎么讲。别停在「能创建任务、能发队列」的 API 层面,要讲清它解决什么问题、代价是什么。RTOS 的核心是把一个 CPU 虚拟成多个并发执行流:调度器按优先级和就绪状态决定谁运行,通过上下文切换保存/恢复寄存器现场,让高优先级的实时任务在事件到来时能立刻抢占低优先级任务;配套提供任务间通信与同步原语(队列传数据、信号量做同步与资源计数、互斥量带优先级继承、事件组做多条件等待),以及时间管理(软定时器、延时)。代价是每个任务要单独的栈空间、切换有开销、共享资源的竞争要自己用临界区保护、优先级反转与死锁要主动设计规避。落到项目里说清三件事就够了:任务怎么划分与优先级依据、任务间怎么通信、实时性怎么保证与验证。
任务类型。从两个维度答。按行为分:周期性任务(定时采样、状态机轮询)、事件驱动任务(等队列或信号量,收到消息才跑)、空闲或后台任务(低优先级的日志落盘、通信重传)。按角色分:控制任务(实时性最高)、计算任务(图像处理、算法,耗时长但可被抢占)、通信任务(协议栈收发)、监控任务(看门狗喂狗、状态上报)。面试官问这个通常是在确认你是否理解「优先级要按响应时限倒排」:时限最短的最高,纯后台的最低,并且避免创建一堆同优先级任务导致时间片轮转的不确定性。
任务堆栈大小怎么定。三种手段结合用:一是静态估算,把任务调用链上所有函数的局部变量、传参、保存的寄存器现场和中断嵌套的额外开销加起来,再留 1.5~2 倍余量;二是用工具测量,FreeRTOS 用 uxTaskGetStackHighWaterMark() 看历史最低剩余量,或者把栈空间先填成固定魔数(0xA5),跑完典型与极端场景后看被冲刷到哪里;三是压力验证,把最深调用路径跑一遍(大函数、深递归、printf/浮点格式化这类吃栈大户、嵌套中断)。要强调的是浮点运算开启 FPU 上下文保存后栈开销会明显变大,中断里用到的栈往往是独立的中断栈,别只算任务栈。
临界区资源。临界区是「访问共享资源的代码段,执行期间不能被其他执行流打断」。需要注意保护的场景:中断与任务共享的变量、多任务共享的全局缓冲区、外设寄存器的读改写序列、动态内存分配、队列/链表的增删。保护手段按开销从低到高:关中断(taskENTER_CRITICAL,最短、只保护极短的代码)、调度器挂起(vTaskSuspendAll,任务间互斥但不影响中断)、互斥量/信号量(有阻塞语义,适合较长或可能睡眠的操作)、原子操作或单写者设计。工程原则是「临界区越短越好」:先想办法减少共享(把共享数据改成只由单个任务拥有、其他任务通过队列发消息),再考虑加锁。
「如果没有临界区呢」。这是在追问「不用锁行不行」。可行的设计思路有几类:一是单写者原则,把某块数据的修改权收归一个任务,其他人只发消息(Actor 模型),从根本上消除并发写;二是数据交换用 FIFO/队列或双缓冲 + 指针原子交换,读方拿到的永远是完整快照;三是仅在必要时用原子指令(CAS、LDREX/STREX)实现无锁计数或标志位;四是让共享变成只读,配置类数据初始化后不改。要补一句代价:无锁不是没代价,它把复杂度转成了内存序与可见性问题(需要内存屏障、volatile/atomic 的语义),在单核 MCU 上通常严格意义上的无锁好处有限,简单场景用短临界区反而更可靠。
I2C 基础。两根线:SCL 时钟、SDA 数据,都是开漏输出,必须外接上拉电阻(典型 4.7k),所以总线上任何设备都能把线拉低。通信过程:主机发起始条件(SCL 高时 SDA 由高变低)→ 发 7 位从机地址 + 1 位读写方向 → 从机在第 9 个时钟拉低 SDA 回 ACK → 传输数据字节,每字节后都有 ACK/NACK → 以停止条件结束(SCL 高时 SDA 由低变高)。要能说出几个实战点:时钟拉伸(从机拉低 SCL 让主机等待)、多主机的仲裁(谁先拉低谁赢,输的一方退出)、上拉电阻选型与总线电容限制、常见的调试现象(SDA 一直被拉低多半是从机复位状态错乱或地址冲突,需要断电或发 9 个时钟解锁)、以及 I2C 速率(标准 100k、快速 400k、快速+ 1M)与长距离要用 I2C 缓冲器。
算法题与 AI 编码的看法。「整型数据相加」这种题考的不是算法,而是编码基本功:边界(溢出、负数、进位)、输入输出格式、变量命名与可读性。写完主动跑两个用例、说明溢出怎么处理(判断符号位或用更大类型/大数处理)。AI 编码的看法是近两年的高频题,稳妥的答法是分场景:样板代码、注释、测试用例、陌生的语言或框架的入门,用 AI 提效明显;核心算法、并发与内存安全、涉及安全与数据边界的地方,必须自己写自己审。要表达出「工具改变了速度,但没有改变责任边界」,并且能说出你实际用过的模型与使用方式(例如先让 AI 解释陌生人代码、再自己改写),比笼统表态更有说服力。