RT-Thread簡介
RT-Thread是一款完全由國內團隊開發維護的嵌入式實時操作系統(RTOS),具有完全的自主知識產權。
經過16個年頭的沉淀,伴隨著物聯網的興起,它正演變成一個功能強大、組件豐富的物聯網操作系統。
RT-Thread概述
RT-Thread,全稱是Real Time-Thread,顧名思義,它是一個嵌入式實時多線程操作系統,基本屬性之一是支持多任務,允許多個任務同時運行并不意味著處理器在同一時刻真地執行了多個任務。
事實上,一個處理器核心在某一時刻只能運行一個任務,由于每次對一個任務的執行時間很短、任務與任務之間通過任務調度器進行非常快速地切換(調度器根據優先級決定此刻該執行的任務),給人造成多個任務在一個時刻同時運行的錯覺。
在RT-Thread系統中,任務通過線程實現的,RT-Thread中的線程調度器也就是以上提到的任務調度器。
RT-Thread主要采用C語言編寫,淺顯易懂,方便移植。
它把面向對象的設計方法應用到實時系統設計中,使得代碼風格優雅、架構清晰、系統模塊化并且可裁剪性非常好。
針對資源受限的微控制器(MCU)系統,可通過方便易用的工具,裁剪出僅需要3KB Flash、1.2KB RAM內存資源的NANO版本。
而對于資源豐富的物聯網設備,RT-Thread又能使用在線的軟件包管理工具,配合系統配置工具實現直觀快速的模塊化裁剪,無縫地導入豐富的軟件功能包,實現類似Android的圖像界面及觸摸滑動效果,智能語音交互效果等復雜功能。
相較于Linux操作系統,RT-Thread體積小,成本低、功耗低、啟動快速,實時性高、占用資源小,非常適用于各種資源受限(如成本、功耗限制等)的場合。
雖然32位MCU是它的主要運行平臺,實際上很多帶有MMU,基于ARM9、ARM11甚至Cortex-A系列級別CPU的應用處理器在特定應用場合也適合使用RT-Thread。
RT-Thread架構
近年來,物聯網(Internet Of Things, IoT)概念廣為普及,物聯網市場發展迅猛,嵌入式設備的聯網已是大勢所趨。
終端聯網使得軟件復雜性大幅增加,傳統的RTOS內核已經越來越難滿足市場的需求,在這種情況下,物聯網操作系統(IoT OS)的概念應運而生。
物聯網操作系統是指以操作系統內核(可以是RTOS、Linux等)為基礎,包括如文件系統、圖形庫等較為完整的中間件組件,具備低功耗、安全、通信協議支持和云端連接能力的軟件平臺,RT-Thread就是一個IoT OS。
RT-Thread與其他很多RTOS,如FreeRTOS、UC/OS的主要區別之一是,還具備豐富的中間層組件,如下圖所示。
它具體包括以下部分:
- 內核層:RT-Thread內核,是RT-Thread的核心部分,包括了內核系統中對象的實現,例如多線程及其調度、信號量、郵箱、消息隊列、內存管理、定時器等;libcpu/BSP(芯片移植相關文件/板級支持包)與硬件密切相關,由外設驅動和CPU移植構成。
- 組件與服務層:組件是基于RT-Thread內核只是的上層軟件,例如虛擬文件系統、FinSH命令行界面、網絡框架、設備框架等。采用模塊化設計,做到組件內部高內聚,組件之間低耦合。
- RT-Thread軟件包:運行與RT-Thread物聯網操作系統平臺上,面向不同應用領域的通用軟件組件,由描述信息、源代碼或庫文件組成。RT-Thread提供了開放的軟件包平臺,這里存放了官方提供或者開發者提供的軟件包,該平臺為開發者提供了眾多可重用軟件包的選擇,這也是RT-Thread生態的重要組成部分。
- 軟件包生態對于一個操作系統的選擇至關重要,因為這些軟件包具有很強的可重用性,模塊化程度很高,極大的方便應用開發者在最短時間內,打造出自己想要的系統。
RT-Thread已經支持的軟件包數量已經達到400+,如下舉例:
物聯網相關的軟件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。
腳本語言相關的軟件包:目前支持 Lua、JerryScript、MicroPython、PikaScript。
多媒體相關的軟件包:Openmv、mupdf。
工具類軟件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
系統相關的軟件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。
外設庫與驅動類軟件包:RealTek RTL8710BN SDK。
其他。
Keil模擬器STM32F103上手指南
一般嵌入式操作系統因為它的特殊性,往往和硬件平臺密切相關連,具體的嵌入式操作系統往往只能在特定的硬件上運行。
對于剛接觸RT-Thread操作系統的讀者并不容易馬上就獲得一個和RT-Thread操作系統相配套的硬件模塊,但隨著計算機技術的發展,我們可以采用軟件方式來模擬一個能夠運行RT-Thread操作系統的硬件模塊,這就是ARM公司的MDK-ARM仿真模擬環境。
RT-Thread內核介紹
內核是一個操作系統的核心,是操作系統最基礎也最重要的部分。
它負責管理系統的線程、線程間通信、系統時鐘、中斷及內存等。
內核處于硬件層之上,內核部分包括內核庫、實時內核實現。
內核庫是為了保證內核能夠獨立運行的一套小型的類似C庫的函數實現子集。
這部分根據編譯器的不同自帶C庫的情況也會有些不同,當使用GNU GCC編譯器時,會攜帶更多的標準C庫實現。
C庫:也叫C運行庫(C Runtime Library),它提供了類似“strcpy”等函數的實現,RT-Thread Kernel Service Library僅提供內核用到的一小部分C庫函數實現,為了避免與標準C庫重名,在這些函數前都會添加上rt_前綴。
實時內核的實現包括:對象管理、線程管理及調度器、線程間通信管理、時鐘管理及內存管理等等,內核最小的資源占用情況是 3KB ROM,1.2KB RAM。
線程調度
線程是RT-Thread操作系統中最小的調度單位,線程調度算法是基于優先級的全搶占式多線程調度算法,即在系統中除了中斷處理函數、調度器上鎖部分的代碼和緊張中斷的代碼是不可搶占的之外,系統其它部分都是可以搶占的,包括線程調度器自身。
支持256個線程優先級(也可通過配置文件更改為最大支持 32 個或 8 個線程優先級,針對 STM32 默認配置是 32 個線程優先級)。
0優先級代表最高優先級,最低優先級留給空閑線程使用。
同時它也支持創建多個具有相同優先級的線程,相同優先級的線程間采用時間片的輪轉調度算法進行調度,使每個線程運行相應時間。
調度器在尋找那些處于就緒狀態的具有最高優先級的線程時,所經歷的時間是恒定的,系統也不限制線程數量的多少,線程數目只和硬件平臺的具體內存相關。
時鐘管理
RT-Thread的時鐘管理以時鐘節拍為基礎,時鐘節拍是RT-Thread操作系統中最小的時鐘單位。
RT-Thread的定時器提供兩類定時器機制:第一類是單次觸發定時器,這類定時器在啟動后只會觸發一次定時器事件,然后定時器自動停止。
第二類是周期觸發定時器,這類定時器會周期性觸發定時器事件,直到用戶手動的停止定時器,否則將永遠持續執行下去。
另外,根據超時函數執行時所處的上下文環境,RT-Thread的定時器可以設置為HARD_TIMER模式或者SOFT_TIMER模式。
通常使用定時器定時回調函數(即超時函數),完成定時服務。
線程間同步
RT-Thread采用信號量、互斥量與事件集實現線程間同步。
線程通過對信號量、互斥量的獲取與釋放進行同步;
互斥量采用優先級繼承的方式解決了實時系統常見的優先級翻轉問題。
線程同步機制支持線程按優先級等待方式獲取信號量或互斥量。
線程通過對事件的發送與接收進行同步。
事件集支持多事件的“或觸發”和“與觸發”,適合于線程等待多個事件的情況。
線程間通信
RT-Thread支持郵箱和消息隊列等通信機制。
郵箱中一封郵件的長度固定為4字節大小。
消息隊列能夠接收不固定長度的消息,并把消息緩存在自己的內存空間中。
郵箱效率較消息隊列更為高效。
郵箱和消息隊列的發送動作可安全用于中斷服務例程中。
通信機制支持線程按優先級等待方式獲取。
內存管理
RT-Thread支持靜態內存池管理及動態內存堆管理。當靜態內存池具有可用內存時,系統對內存塊分配的時間將是恒定的;當靜態內存池為空時,系統將申請內存塊的線程掛起或阻塞掉(即線程等待一段時間后仍未獲得內存塊就放棄申請并返回,或者立刻返回。等待的事件取決于申請內存塊時設置的等待時間參數),當其它線程釋放內存塊到內存池時,如果有掛起的待分配內存塊的線程存在的話,則系統會將這個線程喚醒。
動態內存堆管理模塊在系統資源不同的情況下,分別提供了面向小內存系統的內存管理算法、面向大內存系統的SLAB內存管理算法。
還有一種動態內存堆管理叫做memheap,適用于系統含有多個地址且不連續的內存堆。
使用memheap可以將多個內存堆“粘貼”在一起,讓用戶操作起來像是在操作一個內存堆。
I/O設備管理
RT-Thread將PIN、I2C、SPI、USB、UART等作為外設設備,統一通過設備注冊完成。
實現了按名稱訪問的設備管理子系統,可按照統一的API界面訪問硬件設備。
在設備驅動接口上,根據嵌入式系統的特點,對不同的設備可以掛接相應的事件。當設備事件觸發時,由驅動程序通知給上層的應用程序。