FreeRTOS 任务挂起与任务恢复
FreeRTOS 的任务有几种状态,并且这几种状态可以相互转换,下面是转换图:
任务的4个状态:
- 运行态
- 就绪态,指准备好了,可以随时运行
- 阻塞态
- 挂起态
运行态
当任务实际执行时,它被称为处于运行状态。 任务当前正在使用处理器。 如果运行 RTOS
的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。
就绪态
准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态), 但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。
阻塞态
如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。 例如,如果一个任务调用vTaskDelay()
,它将被阻塞(被置于阻塞状态), 直到延迟结束-一个时间事件。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量 事件。 处于阻塞状态的任务通常有一个”超时”期, 超时后任务将被超时,并被解除阻塞, 即使该任务所等待的事件没有发生。
阻塞
状态下的任务不使用任何处理时间,不能 被选择进入运行状态。
挂起态 Blocked
与阻塞状态下的任务一样, 挂起状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。 相反,任务只有在分别通过 vTaskSuspend()
和 xTaskResume()
API 调用明确命令时 才会进入或退出挂起状态。
有其他状态变为挂起态只能使用 vTaskSuspend()
。
恢复挂起态用 xTaskResume()
或 xTaskResumeFromISR()
。
在中断中恢复挂起态的例子:
1 | //外部中断4服务程序 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小土坡!