【问题标题】:Task Preemption in FREE RTOSFREE RTOS 中的任务抢占
【发布时间】:2022-01-01 08:47:07
【问题描述】:

浏览 Free RTOS 的手册,我遇到了其中提到的一句话

重要的是要注意,时间片的结束并不是唯一的 调度器可以选择新任务运行的地方;将是 贯穿本书的演示,调度器还将选择一个 当前执行的任务进入后立即运行的新任务 阻塞状态,或当中断移动更高优先级的任务时 进入就绪状态。

我对免费 RTOS 中抢占的工作方式感到困惑。考虑优先级为 1 的任务 A 处于 RUNNING 状态。还要考虑优先级较高的任务 B 2 在任务 A 处于时间片中间时进入 READY 状态。

Q1:手册中所说的中断类型是什么?

Q2:在任务 A 处于 RUNNING 状态时,是否只有中断才能使任务 B 进入 READY 状态?

Q3:如果Q2的回答是否定的,如果不是中断驱动,什么时候会发生任务切换?是在时隙结束之后,还是直接在时间片的中间而不等待时间片的结束?

【问题讨论】:

    标签: freertos preemption


    【解决方案1】:

    您描述了以下情况,其中您有两个具有不同优先级的任务:

    • 优先级为 1(较低)的任务 A,当前处于 RUNNING 状态
    • 优先级为 2(更高)的任务 B,进入 READY 状态

    在这种情况下,问自己一个问题很重要 - 会导致这种情况的可能情况是什么?

    在 FreeRTOS 中处理不同优先级的任务时,一般的经验法则是优先级较高的任务将获得所有可用时间,除非它由于被挂起、阻塞而无法运行(等待队列、信号量、互斥体)或延迟(这也属于 BLOCKED 状态)。因此,在您的情况下 - 任务 A 永远不会进入 RUNNING 状态,除非任务 B 之前被暂停或阻塞。

    回答您的问题:

    Q1:手册说的是什么类型的中断?

    我假设他们正在谈论一种情况,即任务 B 由于等待信号量/队列而处于阻塞状态,而您从中断中“提供信号量”/“发送到 quque”。发生这种情况的示例:IO 级中断提供信号量,UART 中断将接收到的字节推入队列。

    Q2:当任务 A 处于 RUNNING 状态时,中断是唯一的方式让任务 B 进入 READY 状态吗?

    我会说不。想到的其他例子(除了上面提到的中断情况):

    • 任务 B 已暂停,任务 A 决定恢复任务 B。当您这样做时,任务 B 应立即恢复执行并从此时开始占用所有可用时间,除非它再次进入暂停或阻塞状态。

    • 任务 B 正在等待任务 A 持有的互斥体,任务 A 释放它。

    • 任务 B 正在等待信号量/队列,任务 A“提供信号量”、“发送到队列”。

    • 任务 B 延迟,延迟结束。

    Q3:如果Q2的回答是否定的,如果不是中断驱动,什么时候会发生任务切换?是在时隙结束之后,还是直接在时间片的中间而不等待时间片的结束?

    我已经在上面列出了可能的示例。再说一遍 - 当您有两个具有不同优先级的任务时,除非较高优先级的任务进入 BLOCKED 或 SUSPENDED 状态,否则它将占用较低优先级任务的所有可用时间。虽然从技术上讲,在这种情况下您仍然可以谈论“时间片”,但所有片都将由更高优先级的任务分配/使用。因此,只有当您有两个或多个任务以相同的优先级运行时,才真正有意义地谈论“时间切片”,在这种情况下,时间应该在它们之间平均分配(除非它们被 BLOCKED 或 SUSPENDED)。

    【讨论】:

    • 你显示没有。任务 B 可以在没有中断的情况下进入 READY 状态的方式。当处理器忙于处理任务 A 时,任务 B 如何知道它现在已准备好进入 READY 状态?这最终不会产生中断吗?
    • 从 ISR 唤醒更高优先级任务的示例正在回答 Q1。从技术上讲,在这些情况下,您应该使用 pxHigherPriorityTaskWoken 参数并自己请求上下文切换 - 请参阅此处的示例 freertos.org/xQueueSendToFrontFromISR.html。但是,在查看 FreeRTOS 源代码后,在这种情况下(从 ISR 解除阻塞更高优先级的任务),他们还设置了一个内部标志 xYieldPending,它会在 xTaskIncrementTick 内部定期检查,从您的定时器中断调用。然而,这种方式可能意味着上下文切换会稍微延迟。
    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 2014-04-25
    • 2018-09-16
    相关资源
    最近更新 更多