新手必看的RTOS基礎知識
實(shí)時(shí)操作系統(RTOS)是一種操作系統(OS),旨在提供實(shí)時(shí)應用進(jìn)程數據,通常沒(méi)有緩沖延遲。
RTOS中的關(guān)鍵因素是最小的中斷延遲和最小的線(xiàn)程切換延遲。RTOS的價(jià)值在于它的響應速度或可預測性,而不是它在給定時(shí)間段內可以執行的工作量。
對于嵌入式設備,一般規則是當應用進(jìn)程需要執行多個(gè)簡(jiǎn)單操作時(shí)使用RTOS。
實(shí)時(shí)操作系統具有以下目標:
- 低延遲。
- 決定論:需要知道處理事情需要多長(cháng)時(shí)間才能確保滿(mǎn)足最后期限。
- 結構化軟件:使用RTOS,可以以結構化的方式分而治之。直接向應用進(jìn)程添加其他組件。
- 可擴展性:RTOS必須能夠從簡(jiǎn)單的應用進(jìn)程擴展到具有堆棧、驅動(dòng)進(jìn)程、文檔系統等的復雜應用進(jìn)程。
- 卸載開(kāi)發(fā):RTOS管理系統的許多方面,例如,RTOS與調度一起,通常處理電源管理,中斷表管理,內存管理,異常處理等。
基于RTOS的應用進(jìn)程中的典型線(xiàn)程:
- 中斷服務(wù)例程(ISR):由硬件中斷啟動(dòng)的線(xiàn)程。ISR運行直至完成。ISR都共享同一堆棧。
- 任務(wù):在等待事件發(fā)生時(shí)可以阻塞的線(xiàn)程。傳統上,任務(wù)是長(cháng)壽命線(xiàn)程(與運行直至完成的ISR相反)。每個(gè)任務(wù)都有自己的堆棧,可以讓它長(cháng)壽。
- Idle:優(yōu)先級最低的線(xiàn)程,僅在沒(méi)有其他線(xiàn)程準備好執行時(shí)運行。通常,空閑只是具有盡可能低優(yōu)先級的特殊任務(wù)。
每個(gè)RTOS的核心都有一個(gè)調度進(jìn)程。調度進(jìn)程負責管理系統中線(xiàn)程的執行。調度進(jìn)程有兩種主要管理方式:搶占式調度和時(shí)間片調度。
搶占式調度是最常見(jiàn)的RTOS調度進(jìn)程類(lèi)型。TI-RTOS和FreeRTOS都有搶占式調度進(jìn)程。使用搶占式調度進(jìn)程,正在運行的線(xiàn)程將一直持續到
- 完成(例如,ISR完成)。
- 較高優(yōu)先級的線(xiàn)程準備就緒(在這種情況下,優(yōu)先級較高的線(xiàn)程會(huì )搶占優(yōu)先級較低的線(xiàn)程)。
- 線(xiàn)程在等待資源時(shí)放棄處理器(例如,任務(wù)調用sleep())。
時(shí)間片調度保證每個(gè)線(xiàn)程都有一個(gè)要執行的槽。這種類(lèi)型的調度通常不利于實(shí)時(shí)應用。如果需要,TI-RTOS內核支持使用任務(wù)進(jìn)行時(shí)間切片調度。
其他關(guān)鍵術(shù)語(yǔ)線(xiàn)程安全:如果一段代碼以保證多個(gè)線(xiàn)程同時(shí)正確訪(fǎng)問(wèn)(讀取、寫(xiě)入)的方式操作共享數據結構,則該代碼段是線(xiàn)程安全的。
Blocked:如果任務(wù)正在等待資源且未消耗任何CPU,則阻止該任務(wù)。例如,如果任務(wù)調用Task_sleep()或Semaphore_pend()(非零超時(shí)且信號量不可用),則該任務(wù)將被阻止,并允許另一個(gè)線(xiàn)程運行。
裸機:不適用RTOS的應用進(jìn)程的公用名。
裸機與實(shí)時(shí)操作系統典型的裸機應用進(jìn)程通??煞譃槿齻€(gè)關(guān)鍵部分:
- 初始化:初始化main()中的硬件和軟件組件。
- 超級循環(huán)狀態(tài)機:用于管理應用進(jìn)程的代碼。這些操作基于中斷(例如,收到SPI數據包或計時(shí)器過(guò)期)或輪詢(xún)的結果。
- ISR:由外圍設備(例如UART)、定時(shí)器或其他特定于設備的項目(例如異?;蚨嗪送ㄐ牛┑闹袛鄨绦械拇a。
裸機應用進(jìn)程有其一席之地。它們通常很小,速度快,并且通過(guò)簡(jiǎn)單的應用進(jìn)程相對容易理解。一旦需要更復雜的邏輯,RTOS就開(kāi)始大放異彩。
實(shí)時(shí)操作系統組件
- 計劃進(jìn)程:保證最高優(yōu)先級線(xiàn)程正在運行的搶占式計劃進(jìn)程。
- 通信機制:信號量、消息隊列、隊列等。
- 關(guān)鍵區域機制:互斥體、門(mén)、鎖等。
- 計時(shí)服務(wù):時(shí)鐘、定時(shí)器等。
- 電源管理:對于低功耗設備,電源管理通常是RTOS的一部分,因為它知道設備的狀態(tài)。
- 內存管理:可變大小的堆、固定大小的堆等。
- 外設驅動(dòng)器:UART、SPI、I2C等。
- 協(xié)議棧:藍牙、無(wú)線(xiàn)網(wǎng)絡(luò )等。
- 文檔系統:FatFs等。
- 設備管理:異常處理、啟動(dòng)等。
POSIX(Portable Operating System Interface):可移植操作系統接口
SimpleLink SDK在TI-RTOS和FreeRTOS之上提供POSIX支持。這允許應用進(jìn)程獨立于底層RTOS。
POSIX API是底層實(shí)時(shí)操作系統之上的一個(gè)小填充碼。創(chuàng )建POSIX線(xiàn)程時(shí),將創(chuàng )建基礎TI-RTOS(或FreeRTOS)任務(wù)。同樣,在創(chuàng )建POSIX線(xiàn)程信號量時(shí),將創(chuàng )建TI-RTOS(或FreeRTOS)信號量。
POSIX支持的一個(gè)很好的功能是能夠從網(wǎng)絡(luò )上獲取基于POSIX的代碼并快速使其正常工作。
POSIX不是實(shí)時(shí)操作系統。它是一個(gè)操作系統兼容性層,允許應用進(jìn)程在操作系統之間輕松移植。
RTOS線(xiàn)程通信所有RTOS都提供標準的通信機制,如信號量、互斥鎖、消息隊列、鏈表等。
信號量信號量允許資源管理。任務(wù)可以在sem_wait()上阻塞,直到資源變得可用(通過(guò)sem_post())。一個(gè)常見(jiàn)的用例是Hwi接收數據并發(fā)布信號量,以便任務(wù)可以處理它。這是可取的,因為它可以最大限度地減少中斷的持續時(shí)間。大多數RTOS都支持二進(jìn)制和計數信號量。
消息隊列對于在線(xiàn)程之間發(fā)送數據非常有用。消息隊列可以配置為發(fā)送/接收任何大小的用戶(hù)定義的消息。在這里,一個(gè)任務(wù)正在向另一個(gè)任務(wù)發(fā)送消息:
當希望將特定功能集中到單個(gè)任務(wù)中時(shí),消息隊列非常有用。所有其他線(xiàn)程都可以將消息發(fā)送到集中式任務(wù)進(jìn)行處理。消息隊列以線(xiàn)程安全的方式處理消息。
POSIX支持層中的消息隊列是創(chuàng )建在TI-RTOS中的Mailboxes和FreeRTOS中的隊列之上的。
執行
一個(gè)搶占式的調度進(jìn)程在運行。假設以下線(xiàn)程是在main()中創(chuàng )建的:
ISRX:中斷服務(wù)例程
MidA:在main()中創(chuàng )建第一個(gè)優(yōu)先級為4
MidB:在main()中創(chuàng )建第二個(gè)優(yōu)先級為4
High:在main()中創(chuàng )建最后一個(gè)優(yōu)先級為8
一旦內核的調度進(jìn)程啟動(dòng)(在本例中為main()中的BIOS_start()),所有任務(wù)都已準備好運行,首先運行的是High,因為它具有最高優(yōu)先級。
1.ISRX斷言,因為它會(huì )搶占所有任務(wù)。High現在處于搶占狀態(tài)。
2.ISRX完成后,High將再次開(kāi)始運行,直到它在Task_sleep()(或某些阻塞API)上阻塞?,F在,MidA可以運行了。
3.MidA一直運行,直到它遇到阻塞調用(比如Semaphore_pend())?,F在,MidB可以運行了。
4.MidB一直運行到High取消阻塞(假設Task_sleep()已過(guò)期)。MidB現在被搶占了。
5.High將一直運行,直到ISRX被斷言并搶占High。注意:現在有兩個(gè)任務(wù)被搶占。
6.MidA準備就緒(假設ISRX發(fā)布了它被阻止的信號量)。MidA不會(huì )運行,因為有更高優(yōu)先級的線(xiàn)程正在運行。
7.ISRX完成,因此High再次運行,然后再次阻塞,因此MidB再次運行,直到它阻塞?,F在MidA可以運行,因為沒(méi)有更高優(yōu)先級的任務(wù)正在運行。注意:MidA必須等到MidB完成后,因為當MidA準備就緒時(shí),MidB正在運行。
8.MidA阻塞,現在沒(méi)有線(xiàn)程正在運行或準備運行,因此Idle運行。
9.MidB取消阻塞并運行。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。