4. 硬件基础
面试问答卡片
🎯 问题1:RTOS 中任务优先级如何工作?请描述优先级反转及其解决方法。
面试官考察点:是否理解优先级抢占调度机制,是否知道优先级反转的典型场景,以及实际工程中的解决方案(优先级继承/天花板协议)。
回答框架:先说明 RTOS 基于优先级的抢占式调度 → 举例低、中、高优先级任务竞争资源 → 引出优先级反转 → 解释优先级继承或天花板协议原理。
简短示例回答:
RTOS 通常使用抢占式调度,高优先级任务可立即打断低优先级任务。优先级反转是指低优先级任务持有高任务需要的资源,导致高任务等待,而中优先级任务反而运行。解决方案是优先级继承协议:持有资源的低任务临时获得高任务的优先级,释放后恢复原优先级。
可能追问:优先级继承与优先级天花板有何区别?FreeRTOS 的互斥锁是如何实现优先级继承的?
🔒 问题2:什么是临界区?如何保护临界区?在中断和任务中保护方式有何不同?
面试官考察点:临界区概念、保护机制(关中断、信号量、互斥锁)、区分任务间与中断-任务间场景。
回答框架:定义临界区 → 任务间用信号量/互斥锁 → 中断中只能关中断或使用无锁结构 → 强调关中断时间要短。
简短示例回答:
临界区是访问共享不可重入资源的代码段。任务间通常用二进制信号量或互斥锁保护;中断中因为不能阻塞,只能通过关中断来保护。例如在 STM32 上使用 __disable_irq() 进入临界区,完成后 __enable_irq() 恢复,但关中断时间需控制在微秒级。
可能追问:在 Cortex-M 内核中如何实现临界区?中断嵌套时如何保护?
⛓️ 问题3:什么是死锁?死锁的四个必要条件是什么?如何预防和避免?
面试官考察点:死锁定义、四个必要条件、预防策略(破坏任一条件)、实际 RTOS 中的处理方式。
回答框架:定义死锁 → 列出四个条件(互斥、持有并等待、不可剥夺、循环等待)→ 预防即破坏其中一个 → 举例说明。
简短示例回答:
死锁是多个任务互相等待对方释放资源而永久阻塞的状态。四个条件:互斥、持有并等待、不可剥夺、循环等待。预防可破坏“持有并等待”,如任务一次性申请所有资源;或破坏“不可剥夺”,如信号量申请带超时。实际项目中常通过资源分配顺序一致性来避免。
可能追问:银行家算法如何避免死锁?如何在 FreeRTOS 中检测死锁?
项目案例模板:智能家居网关 RTOS 优化
| 项目名称 | 多传感器智能家居网关固件开发 |
| 业务背景 | 采集温湿度、光照、PM2.5 数据,通过 Wi-Fi 上报云端,同时支持本地触控屏显示。要求低延迟(<50ms)和高可靠性。 |
| 规模指标 | 3 个任务:传感器采集(Task1)、数据处理与显示(Task2)、Wi-Fi 通信(Task3);RAM 64 KB,Flash 256 KB;任务周期分别为 100ms、200ms、500ms。 |
| 技术栈 | FreeRTOS v10.0,STM32F407,I2C/SPI 传感器,MQTT over TCP,LCD 驱动。 |
| 核心难点 | Task1 每秒采集数据写入共享缓冲区,Task2 读取并显示,Task3 同时上传,出现数据竞争导致显示闪烁和丢包。偶尔发生优先级反转:Task3(高优先级)等待缓冲区时被 Task1(低优先)阻塞,Task2(中优先)趁机占 CPU。 |
| 面试高频追问 | ① 为什么选择队列而不是全局变量?② 如何避免中断中向队列发送数据导致死锁?③ 如何测量并优化关中断时间?④ 如果 Task2 优先级高于 Task1,是否有问题? |
| 可迁移回答话术 | “我使用 FreeRTOS 的队列(Queue)替代全局缓冲区,实现任务间数据传递的天然互斥。对于高优先级任务被低优先任务阻塞的问题,我开启互斥锁的优先级继承属性(configUSE_PRIORITY_INHERITANCE),并在中断中仅通过信号量通知任务,不直接操作队列。” 此类回答展现对 RTOS 机制的深度理解和工程权衡。 |