RTOS中協(xié)程與任務的主要區(qū)別體現(xiàn)在資源占用、調度方式及實現(xiàn)機制上:
資源占用
?任務?:每個任務需獨立分配堆??臻g、堆空間及任務控制塊,資源占用較大。 ?
?協(xié)程?:所有協(xié)程共享同一線程的堆棧空間,僅需少量內存存儲局部變量和狀態(tài),顯著減少RAM使用。 ?
調度方式
?任務?:由RTOS調度器自動管理,涉及上下文切換和內核干預。 ?
?協(xié)程?:由用戶代碼顯式控制(如調用crDELAY),無需操作系統(tǒng)介入,靈活性更高。 ?
實現(xiàn)機制
?任務?:支持搶占式優(yōu)先級調度,適用于復雜系統(tǒng)。 ?
?協(xié)程?:通過宏定義實現(xiàn),僅在單線程內運行,適合內存受限的嵌入式系統(tǒng)。 ?
適用場景
?任務?:適用于需要高可靠性和復雜任務管理的系統(tǒng)。 ?
?協(xié)程?:適合資源受限的場景(如8/16位MCU),可減少系統(tǒng)開銷。
01RTOS中的協(xié)程概述在RTOS系統(tǒng)中,除了我們熟悉的進程和線程(在RTOS中通常被稱為任務),還存在著另一種程序模型——協(xié)程。協(xié)程,作為協(xié)同程序的簡稱,英文名Coroutine,以其更輕量級的特性在并發(fā)編程領域占據了一席之地。它允許在單個線程內高效執(zhí)行多個協(xié)程,這些協(xié)程能夠靈活地掛起與恢復,從而實現(xiàn)了高效的并發(fā)執(zhí)行。接下來,我們將深入探討RTOS中協(xié)程與任務的內容,并剖析它們的異同。
◇ 協(xié)程的三種狀態(tài)
協(xié)程在RTOS中主要呈現(xiàn)為三種狀態(tài):運行、就緒和阻塞。這些狀態(tài)相互轉換,共同構成了協(xié)程在RTOS中的執(zhí)行模型。
運行狀態(tài):當協(xié)程正在執(zhí)行時,它被稱為處于運行狀態(tài),此時處理器正被當前協(xié)程所使用。
就緒狀態(tài):就緒的協(xié)程是那些已經準備好執(zhí)行(未被阻塞)但當前尚未執(zhí)行的協(xié)程。
阻塞狀態(tài):若協(xié)程當前正處于等待時間事件或外部事件的狀態(tài),則該協(xié)程被視為處于阻塞狀態(tài)。
◇ 協(xié)程與任務的區(qū)別
盡管協(xié)程與RTOS中的任務在某些方面相似,但它們之間也存在諸多差異。協(xié)程在輕量級和不需系統(tǒng)調度器介入方面有顯著不同,靈活性更高。協(xié)程函數以crSTART開始,并以crEND結束,且該函數不應返回任何值。
從裸機到RTOS的轉型,對于許多嵌入式開發(fā)者來說,確實是一個充滿挑戰(zhàn)的階段。這個過程中,他們可能會遇到諸如臨界段、調度、信號量和互斥鎖等復雜概念,這些概念對于初學者來說往往讓人感到困惑。然而,通過深入了解和掌握這些核心概念,他們將能夠更好地理解RTOS的多任務調度機制。
? 多任務與調度器
多任務,相較于裸機系統(tǒng)的單任務或輪詢模式,意味著系統(tǒng)能夠同時處理多個任務。在RTOS中,這些任務通過調度器進行高效管理,確保每個任務都能得到及時的響應和處理。通過引入信號量和互斥鎖等同步機制,RTOS能夠有效地解決多任務環(huán)境下的資源競爭和同步問題,從而提升系統(tǒng)的整體性能和響應速度
? 信號量與互斥鎖
了解多任務調度的原理和應用,對于嵌入式開發(fā)者來說至關重要。它不僅能夠幫助他們更好地應對RTOS帶來的挑戰(zhàn),還能夠提升他們的開發(fā)效率和系統(tǒng)穩(wěn)定性。因此,掌握多任務調度的核心概念和技巧,是每一個嵌入式開發(fā)者不可或缺的技能。
02多任務調度的原理與應用? 多任務定義與實現(xiàn)
那么,多任務究竟是什么呢?在多任務操作系統(tǒng)中,通過特定的任務調度策略,兩個或更多進程能夠并發(fā)地共享一個處理器。但需要注意的是,在任意時刻,處理器僅會為一件任務提供服務。由于任務調度機制的高效性,不同任務之間的切換速度非??欤瑥亩a生了多個任務同時運行的錯覺。
對于初學者來說,可以這樣理解:多任務系統(tǒng)類似于我們之前提到的多個輪詢系統(tǒng)。在代碼層面,我們可以將一個大while循環(huán)中的多項任務拆分成幾個小任務,分別進行處理。這樣,每個任務都能得到有序且高效的處理,從而提升了系統(tǒng)的整體性能和響應速度。
? 任務切換與效率
在多任務處理中,各個任務之間的切換與調度是不可或缺的環(huán)節(jié)。然而,這種切換是否會占用大量CPU時間,從而影響任務執(zhí)行效率呢?這曾經是我初學RTOS時的困惑。當時,我誤以為在滴答設置1000(即1ms時間)的情況下,CPU在各個任務間頻繁切換會消耗大量資源。
事實上,我那時對處理器能力的估計過于保守。以STM32F103運行72M為例,每1ms內能執(zhí)行的代碼量是相當可觀的。深入思考后,我們會發(fā)現(xiàn),任務切換所需的幾行代碼在CPU的高速處理能力下,其所需時間幾乎可以忽略不計。當然,這主要是針對高速處理器而言。對于低頻處理器,這個時間可能相對較長,但即便如此,任務調度仍然是一種高效的任務管理方式。
? 占搶調度與輪詢調度
任務調度可分為搶占調度和輪詢調度兩種方式。在實時操作系統(tǒng)(RTOS)中,為了確保任務能夠獲得及時的響應,通常采用搶占調度策略。以UCOS為例,它就是一種典型的搶占式調度系統(tǒng)。
在程序執(zhí)行過程中,一旦出現(xiàn)高優(yōu)先級任務,它將會打斷當前正在執(zhí)行的低優(yōu)先級任務。這種打斷會持續(xù)到高優(yōu)先級任務執(zhí)行完畢,之后低優(yōu)先級任務才會重新獲得執(zhí)行機會。然而,有人可能會提出疑問:如果高優(yōu)先級任務長時間持續(xù)執(zhí)行,這種情況是否可行?
事實上,這涉及到了任務優(yōu)先級的合理分配以及任務設計的考量。通常,高優(yōu)先級任務被設計為響應某種緊急事件,執(zhí)行一些既緊急又不耗時的操作。而對于那些耗時較長的任務,則通常被賦予較低的優(yōu)先級,在系統(tǒng)負載較輕時逐步處理。





