華文網

「工程師故事」看看我是如何在單核處理器上完成並行RTOS多工的?

我們知道嵌入式作業系統內核與與一般的前後臺式系統,最大區別在於前者能併發的運行多個任務,同時會提供相關的一些服務機制,諸如任務間同步與通信、存儲管理、檔案系統、設備管理等,

使得應用程式設計能夠在作業系統平臺上進行而相對要簡單的多。在嵌入式系統中受限於硬體資源的限制,實現的內核不可能包含太多的功能。特別是像FreeRtos, uc/os這樣的內核,僅包含一組簡單的機制。如果做得最精簡化,那麼只需要像運行於51單片機上的rtx tiny那樣僅包含基本的任務管理機制即可。即使包含如此簡單的機制,應用作業系統在易用性上還是比傳統的後臺+中斷的方式要容易的多。

整個嵌入式作業系統中,最核心的部分莫過於任務創建與啟動了。瞭解eos整個任務所有狀態及其變遷,系統的運行原理大致上也就清楚了。

如上圖所示,任務的初始狀態即為刪除狀態。所謂的刪除,即指只有任務的要執行的代碼存在,

而沒有任務控制塊( task_struct )結構,OS沒有為任務分配其它任務資源。

實際上,任務的狀態變遷,大致有:刪除態、就緒態、掛起態、運行態、阻塞態等幾種,我們將這些狀態視為任務從“出生”到“死亡”的活動過程。

這裡,我先來給大家簡單的作個描述:

在整個任務的活動過程,可以簡單的認為是給任務分配堆疊空間、控制塊,然後將控制塊在不同的佇列中插入和刪除,同時將儲存與恢復處理器內寄存器的內容。

不同的佇列可能對應於不同的狀態,比如說,任務控制塊在就緒佇列中即為就緒態,在信號量佇列中即處理阻塞態;當任務的堆疊空間、控制塊被回收了,任務也就消亡了。

單核上如何進行多工的並行處理?

在Atmega32上,有且僅有一塊cpu,不可能實現並行多工,而只能夠實現併發的多工。多個任務按照某種策略輪流使用CPU,以從整體運行結果上來實現多個任務的同時運行,

但在任意時刻,僅有一個任務佔用cpu,那麼如何實現這種偽並存執行?

首先考慮的是既然要實現多個任務並替使用cpu,而一個任務在大多數情況下,不可能在放棄cpu前已經執行完畢其代碼。這樣,任務就需要保存運行的狀態資訊,其備再次執行時恢復這些資訊,使得就如同執行中沒有發生中斷。任務的狀態資訊,除了保存在task_struct結構中的資訊外,還包括執行代碼執止時的代碼位址,

執行各種運行的區域變數,參數等待,這些一般都保存在處理器內的寄存器以及堆疊中。以Atmega32為例: Atmega32有32個通用寄存器R0-R31,狀態寄存器SREG,按照使用的AVR-GCC編譯器的說明,區域變數、參數傳遞的參數一般保存在通用寄存器中,當數量過多時會保存在堆疊中。所以針對Atemga32,要使得任務暫停運行後能恢復,需要保存任務的返回位址,R0-R31, SREG。所以eos在創建任務時,初始化這些資訊保存於堆疊中,由contex_init完成初始化:

而在kernel_start中的task-start執行時,則是從堆疊中取這些值,並恢復至cpu寄存器中。

任務切換時,當前任務自行保存執行狀態,同時恢復另一任務的執行狀態,實現任務切換。

這裡,我並不想對其詳細的工作機制作更進一步的說明。已經說過,這個內核是仿照uc/os實現的,所以這裡有關堆疊初始化和任務切換的工作機制只作了簡單的介紹,其原理和uc/os的一樣。有興趣的讀者可自行參考《嵌入式即時操作系統uc/os ii》中關於移植的章節,其中對這部分有深入的講解。

任務調度演算法:

調度器由scheduler實現,演算法也非常簡單,即從就緒表取最高優先順序任務運行。

。。.。。.

先在這裡小小埋個關子,完整的任務調度演算法實現,可以在後臺留言區進行提問。屆時,小編會邀請講師為大家做具體問題的詳細解答。想要學習完整的嵌入式即時操作系統(RTOS)多工切換、切換的具體過程、運行保存哪些狀態,應該如何保存。現在機會來咯!

7月10日晚上8點,資深開發工程師李述銅將為大家現場直播,詳細為大家講解RTOS的任務切換原理,以及它的切換過程。並通過以一個運行在ARM Cortex-M3內核的RTOS任務切換為例,讓這部分“神秘複雜”的知識變得“清晰可見”。學完之後,你將能從容地面對其它的RTOS。

掃碼報名

報名後在提問區提問即可與嘉賓互動

直播主要內容:

1、為什麼要進行任務切換

2、任務切換時的具體過程是怎樣的

3、任務切換時應該保存哪些狀態,如何保存

4、任務切換對任務運行以及整個RTOS的影響

點擊閱讀原文也可報名哦!

由contex_init完成初始化:

而在kernel_start中的task-start執行時,則是從堆疊中取這些值,並恢復至cpu寄存器中。

任務切換時,當前任務自行保存執行狀態,同時恢復另一任務的執行狀態,實現任務切換。

這裡,我並不想對其詳細的工作機制作更進一步的說明。已經說過,這個內核是仿照uc/os實現的,所以這裡有關堆疊初始化和任務切換的工作機制只作了簡單的介紹,其原理和uc/os的一樣。有興趣的讀者可自行參考《嵌入式即時操作系統uc/os ii》中關於移植的章節,其中對這部分有深入的講解。

任務調度演算法:

調度器由scheduler實現,演算法也非常簡單,即從就緒表取最高優先順序任務運行。

。。.。。.

先在這裡小小埋個關子,完整的任務調度演算法實現,可以在後臺留言區進行提問。屆時,小編會邀請講師為大家做具體問題的詳細解答。想要學習完整的嵌入式即時操作系統(RTOS)多工切換、切換的具體過程、運行保存哪些狀態,應該如何保存。現在機會來咯!

7月10日晚上8點,資深開發工程師李述銅將為大家現場直播,詳細為大家講解RTOS的任務切換原理,以及它的切換過程。並通過以一個運行在ARM Cortex-M3內核的RTOS任務切換為例,讓這部分“神秘複雜”的知識變得“清晰可見”。學完之後,你將能從容地面對其它的RTOS。

掃碼報名

報名後在提問區提問即可與嘉賓互動

直播主要內容:

1、為什麼要進行任務切換

2、任務切換時的具體過程是怎樣的

3、任務切換時應該保存哪些狀態,如何保存

4、任務切換對任務運行以及整個RTOS的影響

點擊閱讀原文也可報名哦!