6、FreeRTOS任务状态

一、任务状态介绍

  • Suspended: 挂起态

  • Ready: 就绪态

  • Blocked: 阻塞态

  • runnnig: 运行态

二、FreeRTOS任务 完整的状态转换图

img

三、就绪状态(Ready)

这个任务完全准备好了,随时可以运行:只是还轮不到它。这时,它就处于就绪态(Ready),处于就绪状态的任务是随时都可以被运行的,只是当前还没有运行。

一般任务创建后,就是处于就绪状态的。

四、阻塞状态(Blocked)

在日常生活的例子中,母亲在电脑前跟同事沟通时,如果同事一直没回复,那么母亲的工作就被卡住了、被堵住了、处于阻塞状态(Blocked)。重点在于:母亲在等待

  • 任务要等待某个事件,事件发生后它才能运行
  • 在等待事件过程中,它不消耗CPU资源
  • 在等待事件的过程中,这个任务就处于阻塞状态(Blocked)

创建的任务是永远都可以执行的,他们一直在不停地执行着自己的任务,而没有去等待其他的任何事件。

但是在实际的产品开发中,我们是不会让一个任务一直在运行的,而是使用“事件驱动”的方法让它运行。就是说任务要等待某个事件发生后它才能运行,这个等待某个事件的过程中就是处于阻塞状态,处于阻塞状态的任务是不会消耗CPU资源的。
在阻塞状态中,任务可以等待两种类型的事件:

  • 时间相关的事件。

    • 可以是等待一段时间,比如等3秒钟。使用vTaskDelay函数实现,等待的时间到了任务就会变为就绪态
    • 也可以是等到某个绝对的时间点。使用vTaskDelayUntil函数实现,等到了某个时间点任务就会进入就绪态
  • 同步事件,由其他任务或者中断产生,比如任务A给任务B发送数据,或者任务A等待用户按下按键。同步事件的来源很多,如下:

    • 队列(queue)
    • 二进制信号量(binary semaphores)
    • 互斥量(mutexes)
    • 递归互斥量、递归锁(recursive muxtexes)
    • 事件组(event groups)
    • 任务通知(task notifications)
  • 一般的开发情况下,多个任务后面都会有一个vTaskDelay,这样就会让任务从运行态(runnnig)进入阻塞态(Blocked),vTaskDelay 时间到了以后,任务会进入就绪态(Ready),

注意阻塞态不能直接到运行态

五、暂停(挂起)状态(Suspended)

在日常生活的例子中,母亲正在电脑前跟同事沟通,母亲可以暂停:

  • 好烦啊,我暂停一会
  • 领导说:你暂停一下

FreeRTOS中的任务也可以进入暂停状态,唯一的方法是通过vTaskSuspend函数。函数原型如下:

void vTaskSuspend( TaskHandle_t xTaskToSuspend );

参数xTaskToSuspend表示要暂停的任务,如果为NULL,表示暂停自己。

要退出暂停状态,只能由别人来操作:

  • 别的任务调用:vTaskResume
  • 中断程序调用:xTaskResumeFromISR
  • 全部任务恢复为就绪态:xTaskResumeAll

实际开发中,暂停状态用得不多。

六、运行态(runnnig)

当任务正在运行,此时的状态被称为运行态,即CPU的使用权被这个任务占用

2022.09.06 更新

最重要的地方没有说,再任务没有执行到vTaskDelay 的时候被FreeRTOS打断去执行其他的任务,这个时候打断的任务会进入Ready(就绪)状态,而不是(阻塞)Blocked状态

注意:这个过程是feertos的核心调度算法!!!

猜你喜欢

转载自blog.csdn.net/mayuxin1314/article/details/126577172
今日推荐