簡體   English   中英

FREE RTOS 中的任務搶占

[英]Task Preemption in FREE RTOS

瀏覽 Free RTOS 的手冊,我遇到了一個句子,其中提到

需要注意的是,時間片的結束並不是調度程序可以運行的唯一位置 select; 正如本書將展示的那樣,調度程序還將 select 在當前執行的任務進入阻塞 state 或當中斷將更高優先級任務移動到就緒 Z9ED39E2EA931586B6EZ985A6 后立即運行一個新任務。

我對免費 RTOS 中搶占的工作方式感到困惑。 考慮優先級為 1 的任務 A 正在運行 state。 還要考慮當任務 A 處於時間片中間時,具有更高優先級 2 的任務 B 進入 READY state。

Q1:手冊中所說的中斷是什么類型的?

Q2:當任務 A 正在運行 state 時,中斷是唯一讓任務 B 進入 READY state 的方法嗎?

Q3:如果Q2的回答是否定的,如果不是中斷驅動,什么時候會發生任務切換? 是在時隙結束之后還是立即在時間片的中間而不等待時間片的結束?

您描述了以下情況,其中您有兩個具有不同優先級的任務:

  • 優先級為 1(較低)的任務 A,當前處於 RUNNING state
  • 優先級為 2(更高)的任務 B,進入 READY state

在這種情況下,重要的是要問自己一個問題——導致這種情況的可能情況是什么?

在 FreeRTOS 中處理不同優先級的任務時,一般的經驗法則是優先級較高的任務將獲得所有可用時間,除非它由於被 SUSPENDED、BLOCKED(等待隊列、信號量、互斥鎖)或 put 而無法運行延遲(這也進入 BLOCKED 狀態)。 因此,在您的情況下 - 任務 A 永遠不會進入 RUNNING state ,除非任務 B 之前被暫停或阻塞。

要回答您的問題:

Q1:手冊中所說的中斷是什么類型的?

我假設他們正在談論一種情況,即任務 B 由於等待信號量/隊列而處於阻塞的 state 並且您從中斷中“提供信號量”/“發送到隊列”。 發生這種情況的示例:IO 級中斷提供信號量,UART 中斷將接收到的字節推入隊列。

Q2:當任務 A 正在運行 state 時,中斷是唯一讓任務 B 進入 READY state 的方法嗎?

我會說不。 想到的其他例子(除了上面提到的中斷情況):

  • 任務 B 已暫停,任務 A 決定恢復任務 B。當您這樣做時,任務 B 應立即恢復執行並從此時開始占用所有可用時間,除非它再次進入 SUSPENDED 或 BLOCKED state。

  • 任務 B 正在等待任務 A 持有的互斥鎖,任務 A 將其釋放。

  • 任務 B 正在等待信號量/隊列,任務 A“提供信號量”、“發送到隊列”。

  • 任務 B 處於延遲狀態,延遲結束。

Q3:如果Q2的回答是否定的,如果不是中斷驅動,什么時候會發生任務切換? 是在時隙結束之后還是立即在時間片的中間而不等待時間片的結束?

我已經在上面列出了可能的例子。 再說一遍 - 當您有兩個具有不同優先級的任務時,除非較高優先級的任務進入 BLOCKED 或 SUSPENDED state,否則它將占用較低優先級任務的所有可用時間。 雖然從技術上講,在這種情況下您仍然可以談論“時間片”,但所有片都將由更高優先級的任務分配/使用。 因此,只有當您有兩個或多個任務以相同的優先級運行時,才真正有意義地談論“時間切片”,在這種情況下,時間應該在它們之間平均分配(除非它們被阻塞或暫停)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM