嵌入式設備中使用的作業系統稱為 RTOS ( 即時作業系統 )。 在嵌入式設備中,即時任務至關重要,而定時在其中起著非常重要的作用。 即時任務是時間確定性的,這意味著對任何事件的回應時間始終是恆定的,因此可以確保任何特定事件將在固定時間發生。 RTOS 旨在以非常精確的時序和高度的可靠性運行應用程式。 RTOS 還可以通過單個內核説明執行多任務。
FreeRTOS 是一類用於嵌入式設備的 RTOS,其規模很小,可以在 8/16 位微控制器上運行,它的使用範圍不僅限於這些微控制器。 這是一個完全開源的代碼,可在 github 上找到。 如果我們瞭解 RTOS 的一些基本概念,那麼使用 FreeRTOS 就會非常容易,因為它具有詳細記錄的API,可以直接在代碼中使用,而無需瞭解代碼的後端部分。
由於 FreeRTOS 可以在 8 位 MCU 上運行,因此它也可以在 Arduino Uno 開發板上運行。 我們只需要下 載FreeRTOS 庫,然後開始使用 API 來實現代碼。
☛ RTOS是如何運作的?
在開始運行 RTOS 之前,讓我們看看什麼是任務。 任務是一段可調度在CPU上執行的代碼。 因此,如果要執行某些任務,則應使用內核延遲或中斷來安排任務。 這項工作由內核中存在的 Scheduler 完成。 在單核處理器中,調度程式可幫助任務在特定時間段內執行,但看起來不同的任務正在同時執行。 每個任務都根據賦予它的優先順序運行。
現在,讓我們看看如果要創建一個以一秒鐘為間隔的 LED 閃爍任務並將該任務置於最高優先順序的情況,RTOS 內核中會發生什麼。
除了LED任務外,內核還會創建另一個任務,稱為空閒任務。 當沒有任務可執行時,將創建空閒任務。 此任務始終以最低優先順序 ( 即 0 優先順序 ) 執行。 如果我們分析上面給出的時序圖,可以看出執行從一個 LED 任務開始,並運行了指定的時間,然後在剩餘時間里,空閒任務一直運行到滴答中斷發生為止。 然後,內核根據任務的優先順序和 LED 任務的總經過時間來決定必須執行的任務。 1 秒完成後,內核會再次選擇執行 LED 任務,因為它比空閒任務具有更高的優先順序,我們也可以說 LED 任務搶佔了空閒任務。 如果有兩個以上具有相同優先順序的任務,則它們將以迴圈方式運行指定的時間。
在狀態圖下方,它顯示了非運行任務切換到運行狀態。
每個新建立的任務都進入 ” 就緒 ” 狀態 ( 部分處於非運行狀態 )。 如果創建的任務 ( Task1 ) 的優先順序高於其他任務,則它將進入運行狀態。 如果此正在運行的任務被其他任務搶佔,則它將再次回到就緒狀態。 否則,如果使用阻塞 API 阻塞了 task1,則 CPU 將不會參與該任務,直到使用者定義的超時時間為止。
如果使用 Suspend API 將 Task1 掛起處於運行狀態,則T ask1 將進入 ” 掛起 ” 狀態,並且調度程式無法再次使用它。 如果在掛起狀態下恢復Task1,則它將返回到就緒狀態,如框圖所示。
以上就是任務如何運行和更改其狀態的基本思想。
☛ RTOS中的常用術語
⑴ 任務 ( Task ) :這是一段可在 CPU 上調度執行的代碼。
⑵ 調度器 ( Scheduler ) :它負責從就緒狀態清單到運行狀態中選擇任務。 經常實施調度程式,以便它們使所有計算機資源處於繁忙狀態( 例如在負載平衡中 )。
⑶ 搶佔 ( Preemption ):這是暫時中斷已經執行的任務的動作,目的是在沒有協作的情況下將其從運行狀態中刪除。
⑷ 上下文切換 ( Context Switching ):在基於優先順序的搶佔中,調度程式將每個 systick 中斷上正在運行的任務的優先順序與就緒任務清單的優先順序進行比較。 如果清單中有任何任務的優先順序高於正在運行的任務,則會發生上下文切換。 基本上,在此過程中,不同任務的內容將保存在各自的堆疊記憶體中。
⑸ 調度策略的類型:
① 搶先式調度 ( Preemptive Scheduling ):在這種類型的調度中,任務以相等的時間片運行,而不考慮優先順序。
② 基於優先順序的搶佔式 ( Priority-based Preemptive ):高優先順序任務將首先運行。
③ 協作調度 ( Co-operative Scheduling ):上下文切換僅在運行任務的協作下發生。 任務將連續運行,直到調用任務產量 ( task yield ) 為止。
⑹ 內核物件 ( Kernel Objects ):為了發信號通知任務執行某些工作,使用了同步過程。 要執行此過程,將使用內核物件。 一些內核物件包括事件、信號量、佇列、互斥量、郵箱等。
通過以上討論,我們對 RTOS 概念有了一些基本的想法,現在我們可以在 Arduino 中實現 FreeRTOS 專案。 因此,讓我們首先在 Arduino IDE 中安裝 FreeRTOS 庫。
☛ 安裝 Arduino FreeRTOS 庫
打開Arduino IDE,然後轉到 Sketch -> Include Librar y-> Manage Libraries。 搜索 FreeRTOS 並安裝庫,如下所示。
現在,重新啟動 Arduino IDE。 該庫提供了一些示例代碼,也可以在 File -> Examples -> FreeRTOS 中找到,如下所示。
☛ FreeRTOS 使用手冊
詳細的使用說明可參考: 掌握 FreeRTOS 實時內核——實操教程 及 FreeRTOS V10.0.0 參考手冊 。