【秋招】嵌入式八股文- FreeRTOS篇
FreeRTOS 面试到底考什么?这一篇给你讲明白。
从任务调度、内存管理,到中断通信、同步机制、定时器与系统移植,嵌入式面试中最常问的核心问题,这里全部帮你整理好了。
内容从基础到进阶,适合快速复习 + 查漏补缺。
推荐题集来自《C/C++ 嵌入式面经专栏》,已更新多篇高质量内容,覆盖嵌入式开发核心知识,帮你系统提升,稳过面试。
一、FreeRTOS 核心机制(理解本质)
1.1 FreeRTOS 内核最核心的几个组件分别负责什么?
1.2 一个任务从创建到运行,会经历哪些状态?每个状态的本质是什么?
1.3 任务是如何从 Ready → Running → Blocked 之间切换的?
1.4 什么叫“上下文切换”?切换时到底保存了哪些东西?
1.5 在什么情况下会触发任务切换?(列举多个场景)
1.6 FreeRTOS 默认调度器是怎样工作的?有没有“抢占”和“非抢占”的区别?
1.7 什么情况下会发生时间片轮转?为什么需要它?
1.8 系统的 tick 是怎么来的?如果没有 tick 会发生什么?
1.9 configTICK_RATE_HZ 改大/改小分别会带来什么影响?
1.10 为什么延时函数会让任务进入阻塞态?底层是怎么实现的?
1.11 任务进入阻塞态后,CPU 还会被它占用吗?
1.12 Tick 中断通常由哪个硬件定时器产生?怎么配置?
二、任务系统(重点考察实战)
2.1 创建任务时,栈空间为什么这么重要?分配小了会发生什么?
2.2 xTaskCreate 和 xTaskCreateStatic 的本质区别是什么?
2.3 删除任务后,系统资源是如何回收的?是否一定安全?
2.4 FreeRTOS 的优先级设计有什么坑?优先级是不是越多越好?
2.5 如何在运行过程中动态调整任务优先级?这样做有什么风险?
2.6 什么是“任务饿死”?在实际项目中怎么避免?
2.7 Idle 任务为什么一定存在?它不只是“空转”这么简单
2.8 Idle Hook 一般用来做什么?有没有坑?
2.9 Daemon(Timer Service)任务和普通任务有什么区别?
2.10 系统里任务切换到底是“谁”触发的?(中断?函数?内核?)
三、任务间通信(工程高频)
3.1 FreeRTOS 提供了哪些通信方式?各自适合什么场景?
3.2 队列本质上是怎么实现的?为什么是线程安全的?
3.3 队列为什么既能传数据又能同步?
3.4 如何在“中断 → 任务”之间安全传数据?
3.5 xQueueSend 和 xQueueSendFromISR 的底层差异是什么?
3.6 信号量本质是不是“队列”?为什么这么设计?
3.7 二值信号量 vs 互斥锁,本质区别是什么?
3.8 什么情况下必须用 Mutex 而不是 Binary Semaphore?
3.9 递归互斥锁解决了什么问题?
3.10 计数信号量适合用在哪些场景?
3.11 消息队列和信号量到底有什么本质区别?
3.12 Event Group 适合解决什么问题?为什么队列不适合?
四、同步与并发问题(面试最爱)
4.1 什么是临界区?为什么必须保护?
4.2 关闭中断 vs 使用锁,分别适用于什么场景?
4.3 taskENTER_CRITICAL 和 portENTER_CRITICAL 有什么区别?
4.4 信号量除了“通信”,还能干什么?(举例)
4.5 互斥锁解决了哪类并发问题?
4.6 什么是优先级反转?现实中怎么发生的?
4.7 FreeRTOS 是如何解决优先级反转的?
4.8 优先级继承机制是怎么工作的?
4.9 为什么 Mutex 不能在中断中使用?
4.10 同步 和 通信 本质区别是什么?
4.11 什么是死锁?在 RTOS 中如何避免?
4.12 Event Group 为什么适合“多条件等待”?
五、时间系统与定时器(非常常考)
5.1 vTaskDelay 和 vTaskDelayUntil 本质区别是什么?
5.2 为什么周期任务推荐用 vTaskDelayUntil?
5.3 软件定时器是如何实现的?(不是硬件定时器!)
5.4 Timer Service 任务的作用是什么?
5.5 定时器回调函数运行在哪个上下文?为什么重要?
5.6 定时器回调里为什么不能做复杂操作?
5.7 创建/启动/停止定时器的流程是怎样的?
5.8 定时器支持一次性和周期性吗?如何实现?
5.9 Tickless Idle 是怎么工作的?
5.10 Tickless 为什么能省电?代价是什么?
六、中断机制(必须吃透)
6.1 FreeRTOS 对中断优先级有什么特殊要求?
6.2 configMAX_SYSCALL_INTERRUPT_PRIORITY 是干嘛的?
6.3 为什么有些中断可以用 FreeRTOS API,有些不行?
6.4 中断里能不能创建任务?为什么?
6.5 什么是“中断嵌套”?FreeRTOS 怎么处理?
6.6 哪些 API 是专门给 ISR 用的?
6.7 portYIELD_FROM_ISR 的作用是什么?
6.8 xHigherPriorityTaskWoken 是干嘛的?
6.9 如何在中断中安全触发一次任务切换?
6.10 中断和任务之间传数据,有哪些推荐方式?
七、内存管理(非常容易挂)
7.1 FreeRTOS 为什么要自己实现 malloc?
7.2 heap_1 ~ heap_5 各自适合什么场景?
7.3 heap_4 为什么最常用?
7.4 heap_5 解决了什么问题?
7.5 动态创建 vs 静态创建任务,有什么差别?
7.6 如何避免内存碎片?
7.7 pvPortMalloc 和标准 malloc 有什么区别?
7.8 栈溢出是怎么发生的?如何检测?
7.9 configCHECK_FOR_STACK_OVERFLOW 有几种模式?
7.10 如何查看任务栈使用情况?
7.11 configTOTAL_HEAP_SIZE 设置太小会发生什么?
7.12 内存分配失败时系统会怎样?
八、调试与性能分析(进阶)
8.1 如何查看系统中所有任务状态?
8.2 vTaskGetInfo 能获取哪些信息?
8.3 如何统计每个任务的 CPU 占用?
8.4 Run Time Stats 是怎么实现的?
8.5 如何判断系统是否“调度异常”?
8.6 如何统计任务切换次数?
8.7 什么是“栈高水位线”?有什么用?
8.8 如何发现某个任务跑飞(死循环)?
8.9 Trace 工具一般能分析哪些东西?
8.10 如何判断系统瓶颈在 CPU 还是 IO?
九、移植与配置(高手向)
9.1 FreeRTOS 的移植层主要做了什么?
9.2 port.c 和 portmacro.h 各负责什么?
9.3 configUSE_PREEMPTION 关闭后会发生什么?
9.4 configUSE_IDLE_HOOK / TICK_HOOK 分别干嘛?
9.5 Cortex-M 上 FreeRTOS 的调度依赖哪些异常?
9.6 PendSV / SysTick / SVC 各自作用是什么?
9.7 如何修改调度策略(比如改成时间片优先)?
9.8 FreeRTOSConfig.h 里最关键的几个参数有哪些?
9.9 Tick 和系统时钟之间如何换算?
9.10 移植 FreeRTOS 最容易踩的坑有哪些?
嵌入式软件工程师面试完全指南
面经一共32篇文章,12w+字数,包含全部最新的面试必问考点,4.7w+同学学习,3300+订阅,非常适合在找工作面经薄弱的同学,销量即是口碑,提前订阅提前享受,持续更新中。
原帖链接:https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
