真实面经题目 · 原创解析
FreeRTOS 任务状态机有哪些状态,阻塞和挂起有什么区别?
这题考实时任务生命周期,重点是能解释运行、就绪、阻塞、挂起之间的转换,以及阻塞和挂起的本质差异。
真实面经题目 · 原创解析
这题考实时任务生命周期,重点是能解释运行、就绪、阻塞、挂起之间的转换,以及阻塞和挂起的本质差异。
FreeRTOS 常见任务状态可以按是否参与调度来理解:Running 是当前正在运行的任务;Ready 是已经具备运行条件、等待 CPU 的任务;Blocked 是任务在等时间或事件,比如 vTaskDelay、队列、信号量、事件组,事件发生或超时后会自动回到 Ready;Suspended 是被显式挂起的任务,不参与调度,也不会因为普通等待事件或超时自动恢复,只能通过 resume 类 API 恢复;Deleted 是任务被删除后的结束状态。阻塞和挂起的区别是:阻塞有明确等待对象或超时时间,是任务主动等资源;挂起更像外部把任务从调度系统里拿出去,除非恢复,否则不会自己回来。回答时可以按创建后进入 Ready、被调度进入 Running、等待进入 Blocked、事件或超时回 Ready、显式 suspend/resume 进入和退出 Suspended 来讲。
Ready 任务已经满足运行条件,但 CPU 当前给了更高优先级或同优先级的其他任务;Running 则是当前正在执行的任务。抢占发生时,Running 可以回到 Ready。
任务调用延时、等待队列、信号量、事件组或通知时进入阻塞。阻塞通常带等待对象和可选超时,条件满足或时间到期后内核会把它重新放回就绪队列。
挂起不是等待队列里的正常等待,而是显式让任务不参与调度。挂起任务不会因为原来等待的事件或 tick 超时自动恢复,需要其他任务或中断通过恢复接口把它放回就绪态。
创建任务后进入 Ready;调度选中后进入 Running;主动 delay 或等资源进入 Blocked;事件、通知或超时回 Ready;调用 suspend 进入 Suspended,resume 后回 Ready;删除则进入 Deleted 并等待资源回收。
不能。阻塞态任务不在就绪队列里,只有等待条件满足或超时后回到就绪态,才可能被调度。
挂起任务不会因为该事件自动运行;如果设计里混用等待和挂起,要非常小心丢事件或状态不一致。
要看最坏响应时间、任务优先级、栈水位、队列积压、临界区时长和中断延迟,用压力用例和日志证明正常路径、阻塞路径、异常恢复路径都在预算内。