RTOS的作用
RTOS一般應用在中低端處理器當中,這里舉一個筆者日常開發遇到的案例來說明RTOS的作用。
假設你有一個設備,這個設備的外圍硬件很多,假設有LED、一個網口、若干RS232等等。
在沒有RTOS的時候,我們用裸機編程來寫,那么通常的做法是寫一個while(1)循環,在這個循環中執行ES485通訊、LED點亮、網口并采集數據。
但是這樣子做,有時候并不能符合當前的應用場景,比如:
- 網口的通訊與服務器交互,需要優先處理服務器的指令和向服務器發送狀態
- LED有很多類型,一些是指示燈,一些是呼吸燈,其優先級不高
- RS232數量很多,需要不斷查詢,其優先級并沒有網口這么重要,當時又比LED的等級要高,因為232會與外設進行必要通訊
如果采用了while 1的方式,則每個流程的優先級并不能很好體現,且個別LED或者232如果是受控于網口則有控制關系,采用while 1控制外設,也不能體現出外設的控制關系
如此,為了解決優先級以及外設之間通訊的關系,RTOS便由此誕生了。
RTOS的概念:全稱為Real-Time Operating System(實時操作系統),是一種專門設計用于處理實時任務的操作系統。與通用計算機上運行的桌面操作系統(如Windows、Linux)不同,RTOS專注于提供對實時性能和響應時間的支持。
這里解釋一下這個概念:
- 外設間的通訊關系一般操作系統都會提供,比如Linux這種操作系統也提供了很多通訊機制
- RTOS與其它類型OS的最大不同點就在于:實時性能和響應時間。比如Linux上執行一個程序的時間往往是不固定的,會受到其它外圍硬件的影響。而RTOS提供了優先級的概念,讓程序的執行時間可以被預測到。這個后面再細談何為優先級。
- RTOS是一個系統類型的簡稱,跟偏向一種概念,基于RTOS的概念,市面上的常見RTOS有UCOS、FreeRTOS、RT-Thread等等。
RTOS的實現
RTOS的核心實現主要是分為兩點:
- 多任務多優先級的實現
- 通訊機制的實現
(TIP:有些類型的RTOS還會帶有一些組件或者軟件包,比如物聯網組件、語言類軟件包等等,但是這些都不是RTOS所必要的)
多任務多優先級的實現
多任務也就是一個時間內執行多個任務,比如上文的LED和232,其應該一起進行。但是232的優先級又比LED等級高,遇到232大量的突發任務的時候,232應該被優先執行。
以單核實現為例,我們只需要控制LED和232讓其交替進行,在宏觀的角度上便認為是同時運行的(實際上微觀上就是把一個任務一個任務來進行,只不過每個人任務都執行一段時間后,就執行另外的任務)。因此實現任務的切換是關鍵的。
關于實現任務的切換,我們要從微觀的角度去看,即芯片的執行內容由何種因素去決定的。清楚如何控制芯片的執行內容便可以輕易的去切換芯片去執行自己想要的內容了。
大多數芯片的實現,往往是將R0Rx寄存器與必要的寄存器(比如計數器、狀態寄存器等)推到堆棧內,然后取出需要執行的任務的寄存器(也是R0Rx寄存器與必要的寄存器),來實現任務的切換。這點如果不理解的話,建議讀者可以學習一下匯編語言,匯編會很接近處理器的處理邏輯。
本文給出另外一個文章進行參考:
https://blog.csdn.net/weixin_47702410/article/details/119751040
而優先級的實現,即讓程序設定自己的優先級等級,系統進行判斷,當前哪個任務的優先級高便執行高優先級的程序,如果優先級一樣高,那就輪轉調度(也就是兩個任務交替執行)。如果使用了優先級的RTOS,需要注意,高優先級一定要可以主動釋放自己的執行權的,不然就會處在一直處理高優先級而低優先級將不會被執行。這種主動釋放執行權限的操作往往就是加上不阻塞的休眠,在高優先級處在休眠期間,就不會占用CPU了,如此低優先級的任務便可以被執行了。
通訊機制的實現
通訊機制一般指的是若干個任務之間的通訊方式。任務其實相當于大型系統中的進程的概念,每個進程都會認為自己享有了計算機的所有資源,RTOS中的任務也是如此。但是在實際情況下,任務并不是享有所有的資源的,比如某個232口,有多個任務想發送數據,如果同時一起發送就會導致232時序和內容出現問題,應該依次發送。
另外任務之間也是需要通信的,比如上文的網口需要控制LED,同時又需要被動等待232是否收到消息。
綜上,通信機制的特點是:
- 主要是用于任務之間的通訊
- 主要分為兩大類,一類為資源控制類,另一類是消息傳遞類
本文也給出另外一個文章說明資源控制類的信號量機制是如何實現的:
https://blog.csdn.net/weixin_47702410/article/details/119752649
RTOS常見的通訊機制
資源控制類
- 信號量:用于同步任務或控制對共享資源的訪問。信號量可以是二進制的(用作互斥鎖)或計數的(用于管理有限數量的資源)
- 互斥鎖:一種特殊類型的信號量,專門用于提供對共享資源的互斥訪問。類似二只信號量,但是一般互斥鎖帶有避免優先級反轉的方案
- 自旋鎖:在多核或支持線程的系統中使用,當一個任務嘗試獲取鎖而鎖已被占用時,任務會在一個循環中等待(即“自旋”),直到鎖變為可用。自旋鎖適用于短時間內的鎖定,因為它們在等待時不會使任務進入睡眠狀態。
消息傳遞類
- 郵箱(Mailbox):允許一個任務發送消息給另一個任務的郵箱。郵箱通常是基于中斷的,可以存儲固定大小的消息。
- 事件(Event):用于通知一個或多個任務某些條件已經發生。事件可以是單個標志或一組標志,任務可以等待一個或多個事件的發生。
- 工作隊列(Work Queue):允許任務將工作項排隊到一個隊列中,這些工作項隨后由工作線程以FIFO(先進先出)的順序處理。
- 消息隊列(Message Queue):允許任務發送和接收消息。消息隊列可以存儲多個消息,并且可以配置為具有優先級,以便優先處理更重要的消息。