加入收藏 在线留言 联系我们
关注微信
手机扫一扫 立刻联系商家
全国服务热线15915421161

SIEMENS河北省衡水市 西门子代理商——西门子华北一级总代理

更新时间
2024-07-02 07:00:00
价格
请来电询价
西门子总代理
PLC
西门子一级代
驱动
西门子代理商
伺服电机
联系电话
15903418770
联系手机
15915421161
联系人
张经理
立即询价

详细介绍
RTOS任务调度

3.1 任务状态

  • 1 创建任务→就绪态(Ready):任务创建完成后进入就绪态,表明任务已准备就绪,随时可以运行,只等待调度器进行调度。

  • 2 就绪态→运行态(Running):发生任务切换时,就绪列表中Zui高优先级的任务被执行,从而进入运行态。

  • 3 运行态→就绪态:有更高优先级任务创建或者恢复后,会发生任务调度,此刻就绪列表中Zui高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,依然在就绪列表中,等待Zui高优先级的任务运行完毕继续运行原来的任务。

  • 4 运行态→阻塞态(Blocked):正在运行的任务发生阻塞(挂起、延时、读信号量等待)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中当前Zui高优先级任务。

  • 5 阻塞态→就绪态:阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态;如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。

  • 6、7、8 就绪态、阻塞态、运行态→挂起态(Suspended):任务可以通过调用vTaskSuspend() API 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到CPU的使用权,也不会参与调度,除非它从挂起态中解除。

  • 9 挂起态→就绪态:把 一 个 挂 起 状态 的 任 务 恢复的 唯 一 途 径 就 是 调 用 vTaskResume() 或vTaskResumeFromISR() API 函数,如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。

  • 以上是任务运行的各种状态,看起来有点复杂,可以这样理解:

    为简单起见,先不考虑挂起态,在任一时刻,CPU只能处理某一个任务,则该任务就处于运行态,对于其它任 务,当是自己想要延时或等待时,则处于阻塞态,当自己想要执行但因为优先级低而不能执行时,则处于就绪态

    然后,以上状态如何被改变呢?

    1.运行态的自己想进入阻塞态,则就绪态的任务即可运行。

    2.阻塞态的解除阻塞进入就绪,若该任务的优先级更高,则可抢占当前处于运行的任务,使自己运行,使对方就绪。

    有没有发现,阻塞态的任务要想运行,必须先进入就绪态,再进入运行态。

    3.2 调度器

    FreeRTOS中提供的任务调度器是基于优先级的抢占式调度:在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的。

    调度器就是使用相关的调度算法来决定当前需要执行的任务。所有的调度器有一些共同的特性:

  • 调度器可以区分就绪态任务和挂起态任务(由于延迟,信号量等待,事件组等待等原因而使得任务被挂起)。

  • 调度器可以选择就绪态中的一个任务,然后激活它(通过执行这个任务)。当前正在执行的任务是运行态的任务。

  • FreeRTOS 主要有两种调度方式

  • 抢占式调度:每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,如 vTaskDelay。

  • 时间片调度:每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如vTaskDelay,才会执行同优先级任务之间的任务切换。


  • 相关产品

    联系方式

    • 电  话:15903418770
    • 联系人:张经理
    • 手  机:15915421161
    • 微  信:15915421161