一文讓你了解RT-Thread
前言
要學習一項新知識或新的技能,首先要對其有個初步了解,然后再逐步學習如何運用它。
本文作為快速入門 RT-Thread 系列文章的第一篇,首先介紹一下,我當時是如何學習 RT-Thread 的,以及參與官方組織的活動的情況,希望給讀者參考,并有所啟發(fā)。
然后先介紹一下這款國產(chǎn) RTOS 的大概內(nèi)容,做到對 RT-Thread 有個初步的了解。
我的 RT-Thread 學習之路
1. 初識 RT-Thread
記得在 2017 年看到公眾號一篇文章介紹 RT-Thread,文章結(jié)尾留有聯(lián)系方式,可以拉入官方群,本著學習的目的,果斷加微信入群。
那時還不了解 RT-Thread,但是對于 RTOS 已經(jīng)不陌生。已經(jīng)學習過 uCos 和 FreeRTOS 兩款 RTOS 系統(tǒng)。
國產(chǎn) RTOS 還是第一次接觸,并且能進官方技術(shù)交流群,當然要進群去學習了。
在網(wǎng)上搜了一下 RT-Thread 相關(guān)資料,簡單了解了這款國產(chǎn)的 RTOS。
RT-Thread 內(nèi)核的第一個版本是熊譜翔先生在 2006 年年初發(fā)布的 0.1 版本。發(fā)展到現(xiàn)在,已經(jīng)有十多年的歷史了。
因為 RTOS 中的任務(wù)更類似于通用操作系統(tǒng)中的線程,并且這個系統(tǒng)支持基于優(yōu)先級的搶占式任務(wù)調(diào)度算法。所以把它命名為 RT-Thread,即實時線程。
后來又加了好多官方群,算得上 RT-Thread 的忠實粉絲了。

2. 入門 RT-Thread
由于時間原因,一直沒有真正開始學習 RT-Thread。直到 2018 年官方組織 15 天入門 RT-Thread 培訓,才開始真正地學習 RT-Thread。每天中午抽時間看當天的視頻,然后再實際動手實驗,復習課程學習的內(nèi)容。
當初學習的時候,每天還組織抽獎,既學習了知識,還能獲得獎品。除了點贊還能說啥。當然,我運氣不錯,中了一個開發(fā)板(備注:此處不是炫耀)。
感謝 RT-Thread 官方組織的學習活動。課程學習完畢,自我感覺已經(jīng)入門了。

現(xiàn)在官方視頻學習網(wǎng)址如下:
https://www.rt-thread.org/page/video.html
3. 讀內(nèi)核源碼
入門學習結(jié)束后,覺得不能止于此。當時的想法是要讀一讀源碼,深入到 RTOS 內(nèi)部機制的實現(xiàn)。
然后,開始每天抽一部分時間研究 RT-Thread 內(nèi)核源代碼。逐漸地把內(nèi)核源碼研究了一遍,弄懂了其設(shè)計思想和實現(xiàn)方法。不得不說,代碼寫的非常棒
基于此,較深入地理解了 RTOS 內(nèi)核工作原理。感覺功力又上升了一個層次。

4. 參加網(wǎng)絡(luò)編程學習
后來參加官方組織的 RT-Thread 網(wǎng)絡(luò)編程學習營。每周一個任務(wù),一共四周。完成后將實現(xiàn)過程形成筆記發(fā)布到官方論壇。
那時候?qū)W習勁頭足,白天上班,晚上回家研究學習任務(wù)。有時候為了解決問題,完成任務(wù),甚至熬夜調(diào)試代碼。當然對于最后的收獲,卻是值得的。
這期間,不僅對網(wǎng)絡(luò)通信有深入了解,還接觸到了設(shè)備與云端通信,還認識了不少小伙伴。
完成網(wǎng)絡(luò)編程學習營任務(wù)發(fā)布的文章,如下圖

5. 新書提前閱讀
同年(2018年)官方組織新書提前閱讀評審書籍《嵌入式實時操作系統(tǒng):RT-Thread設(shè)計與實現(xiàn)》,當然要參加啦。
每天閱讀一個章節(jié),給出修改意見。在閱讀過程中,結(jié)合之前學習 RT-Thread 的知識,算是把 RT-Thread 又系統(tǒng)地學習了一遍。
通過對 RT-Thread 的學習,對 RTOS 的原理有了較深入的理解。自認為把 RTOS 相關(guān)的基礎(chǔ)知識夯實了。
新書出版,官方給送了一本,還有熊大的親筆簽名。

感謝熊大,感謝 RT-Thread 的各位小伙伴,提供了這么好的學習平臺。祝愿 RT-Thread 發(fā)展得越來越好。
了解 RT-Thread
RT-Thread 是一款完全由國內(nèi)團隊開發(fā)維護的嵌入式實時操作系統(tǒng)(RTOS),具有完全的自主知識產(chǎn)權(quán) 。
RT-Thread,全稱是 Real Time-Thread,它是一個嵌入式實時多線程操作系統(tǒng),基本屬性之一是支持多任務(wù)。在 RT-Thread 系統(tǒng)中,任務(wù)是通過線程實現(xiàn)的。
RT-Thread 主要采用 C 語言編寫,淺顯易懂,方便移植。它把面向?qū)ο蟮脑O(shè)計方法應(yīng)用到實時系統(tǒng)設(shè)計中,使得代碼風格優(yōu)雅、架構(gòu)清晰、系統(tǒng)模塊化并且可裁剪性非常好。
RT-Thread 系統(tǒng)完全開源, 3.1.0 及以前的版本遵循 GPL V2 + 開源許可協(xié)議。從 3.1.0 以后的版本遵循 Apache License 2.0 開源許可協(xié)議,可以免費在商業(yè)產(chǎn)品中使用,并且不需要公開私有代碼。
RT-Thread 目前分為三個版本:標準版本、Nano 版本、Smart 版本。
詳細了解 RT-Thread,可以訪問官方網(wǎng)站:
https://www.rt-thread.org
RT-Thread 在線文檔網(wǎng)址為:
https://www.rt-thread.org/document/site/#/

1. 標準版
標準版 RT-Thread 與其他很多 RTOS 如 FreeRTOS、uC/OS 的主要區(qū)別之一是,它不僅僅是一個實時內(nèi)核,還具備豐富的中間層組件。
詳細介紹可參考官方網(wǎng)站:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README
標準版軟件架構(gòu)如下圖所示。

物聯(lián)網(wǎng)操作系統(tǒng)是指以操作系統(tǒng)內(nèi)核(可以是 RTOS、Linux 等)為基礎(chǔ),包括如文件系統(tǒng)、圖形庫等較為完整的中間件組件,具備低功耗、安全、通信協(xié)議支持和云端連接能力的軟件平臺,RT-Thread 就是一個 IoT OS。
2. Nano版本
RT-Thread Nano 是一個極簡版的硬實時內(nèi)核,是一款可裁剪的、搶占式實時多任務(wù)的 RTOS。
其內(nèi)存資源占用極小,功能包括任務(wù)處理、軟件定時器、信號量、郵箱和實時調(diào)度等相對完整的實時操作系統(tǒng)特性。
詳細內(nèi)容可參考官方在線文檔網(wǎng)站:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/an0038-nano-introduction
Nano 版軟件框圖如下,包含支持的 CPU 架構(gòu)與內(nèi)核源碼,還有可拆卸的 FinSH 組件:

3. Smart 版本
RT-Thread Smart 是基于 RT-Thread 操作系統(tǒng)上的混合操作系統(tǒng),簡稱為 rt-smart,它把應(yīng)用從內(nèi)核中獨立出來,形成獨立的用戶態(tài)應(yīng)用程序,并具備獨立的地址空間(32 位系統(tǒng)上是 4G 的獨立地址空間)。
詳細了解可以訪問官方資料網(wǎng)站:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README
rt-smart 的整體結(jié)構(gòu)框圖如下,在硬件平臺的基礎(chǔ)上通過 MMU、系統(tǒng)調(diào)用的方式把整個系統(tǒng)分成了內(nèi)核態(tài)及用戶態(tài)。

RT-Thread 內(nèi)核
內(nèi)核是操作系統(tǒng)最基礎(chǔ)也是最重要的部分。下圖為 RT-Thread 內(nèi)核架構(gòu)圖,內(nèi)核處于硬件層之上,內(nèi)核部分包括內(nèi)核庫、實時內(nèi)核實現(xiàn)。

內(nèi)核庫是為了保證內(nèi)核能夠獨立運行的一套小型的類似 C 庫的函數(shù)實現(xiàn)子集。這部分根據(jù)編譯器的不同自帶 C 庫的情況也會有些不同,當使用 GNU GCC 編譯器時,會攜帶更多的標準 C 庫實現(xiàn)。
實時內(nèi)核的實現(xiàn)包括:對象管理、線程管理及調(diào)度器、線程間通信管理、時鐘管理及內(nèi)存管理等等。
內(nèi)核最小的資源占用情況是 3KB ROM,1.2KB RAM。
線程調(diào)度
線程是 RT-Thread 操作系統(tǒng)中最小的調(diào)度單位,線程調(diào)度算法是基于優(yōu)先級的全搶占式多線程調(diào)度算法。
在系統(tǒng)中除了中斷處理函數(shù)、調(diào)度器上鎖部分的代碼和禁止中斷的代碼是不可搶占的之外,系統(tǒng)的其他部分都是可以搶占的,包括線程調(diào)度器自身。
支持 256 個線程優(yōu)先級(也可通過配置文件更改為最大支持 32 個或 8 個線程優(yōu)先級),0 優(yōu)先級代表最高優(yōu)先級,最低優(yōu)先級留給空閑線程使用。
時鐘管理
RT-Thread 的時鐘管理以時鐘節(jié)拍為基礎(chǔ),時鐘節(jié)拍是 RT-Thread 操作系統(tǒng)中最小的時鐘單位。
RT-Thread 的定時器提供兩類定時器機制:單次觸發(fā)定時器、周期觸發(fā)定時器。
通常使用定時器定時回調(diào)函數(shù)(即超時函數(shù)),完成定時服務(wù)。用戶根據(jù)自己對定時處理的實時性要求選擇合適類型的定時器。
線程同步
RT-Thread 采用信號量、互斥量與事件集實現(xiàn)線程間同步。
線程通過對信號量、互斥量的獲取與釋放進行同步;互斥量采用優(yōu)先級繼承的方式解決了實時系統(tǒng)常見的優(yōu)先級翻轉(zhuǎn)問題。
線程通過對事件的發(fā)送與接收進行同步;事件集支持多事件的 “或觸發(fā)” 和“與觸發(fā)”,適合于線程等待多個事件的情況。
線程通信
RT-Thread 支持郵箱和消息隊列等通信機制。
郵箱中一封郵件的長度固定為 4 字節(jié)大小;消息隊列能夠接收不固定長度的消息,并把消息緩存在自己的內(nèi)存空間中。
內(nèi)存管理
RT-Thread 支持靜態(tài)內(nèi)存池管理及動態(tài)內(nèi)存堆管理。
動態(tài)內(nèi)存堆管理模塊在系統(tǒng)資源不同的情況下,分別提供了面向小內(nèi)存系統(tǒng)的內(nèi)存管理算法及面向大內(nèi)存系統(tǒng)的 SLAB 內(nèi)存管理算法。
還有一種動態(tài)內(nèi)存堆管理叫做 memheap,適用于系統(tǒng)含有多個地址且不連續(xù)的內(nèi)存堆。使用 memheap 可以將多個內(nèi)存堆 “粘貼” 在一起,讓用戶操作起來像是在操作一個內(nèi)存堆。
I/O 設(shè)備管理
RT-Thread 將 PIN、I2C、SPI、USB、UART 等作為外設(shè)設(shè)備,統(tǒng)一通過設(shè)備注冊完成。實現(xiàn)了按名稱訪問的設(shè)備管理子系統(tǒng),可按照統(tǒng)一的 API 界面訪問硬件設(shè)備。
在設(shè)備驅(qū)動接口上,根據(jù)嵌入式系統(tǒng)的特點,對不同的設(shè)備可以掛接相應(yīng)的事件。當設(shè)備事件觸發(fā)時,由驅(qū)動程序通知給上層的應(yīng)用程序。
后續(xù)計劃
作為 RT-Thread 的學習者和受益者,以及對國產(chǎn) RTOS 的支持。愿意付出自己的綿薄之力,把自己學到的知識形成筆記文章分享出來,供有需要的小伙伴作為學習參考。
首先,會盡量以簡單的方式,介紹 RT-Thread 提供的資源如何使用,理論結(jié)合實踐,達到快速入門的效果。
然后,再以專題的形式,介紹內(nèi)核源碼實現(xiàn)的內(nèi)部機制。爭取做到,知其然,知其所以然。
在寫作過程中,難免出現(xiàn)紕漏或者理解偏差的地方,歡迎指正,一起探討交流。
一起學習、一起進步。加油~
