「工程師故事」看看我是如何在單核處理器上完成並行RTOS多工的?
我們知道嵌入式作業系統內核與與一般的前後臺式系統,最大區別在於前者能併發的運行多個任務,同時會提供相關的一些服務機制,諸如任務間同步與通信、存儲管理、檔案系統、設備管理等,
整個嵌入式作業系統中,最核心的部分莫過於任務創建與啟動了。瞭解eos整個任務所有狀態及其變遷,系統的運行原理大致上也就清楚了。
如上圖所示,任務的初始狀態即為刪除狀態。所謂的刪除,即指只有任務的要執行的代碼存在,
實際上,任務的狀態變遷,大致有:刪除態、就緒態、掛起態、運行態、阻塞態等幾種,我們將這些狀態視為任務從“出生”到“死亡”的活動過程。
這裡,我先來給大家簡單的作個描述:
在整個任務的活動過程,可以簡單的認為是給任務分配堆疊空間、控制塊,然後將控制塊在不同的佇列中插入和刪除,同時將儲存與恢復處理器內寄存器的內容。
單核上如何進行多工的並行處理?
在Atmega32上,有且僅有一塊cpu,不可能實現並行多工,而只能夠實現併發的多工。多個任務按照某種策略輪流使用CPU,以從整體運行結果上來實現多個任務的同時運行,
首先考慮的是既然要實現多個任務並替使用cpu,而一個任務在大多數情況下,不可能在放棄cpu前已經執行完畢其代碼。這樣,任務就需要保存運行的狀態資訊,其備再次執行時恢復這些資訊,使得就如同執行中沒有發生中斷。任務的狀態資訊,除了保存在task_struct結構中的資訊外,還包括執行代碼執止時的代碼位址,
而在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的影響
點擊閱讀原文也可報名哦!