RTThread(一) - 概念及简介
文章目錄
- 前置說(shuō)明
- RTThread框架
- 線程管理及調(diào)度器
- 線程間通信管理
- 時(shí)鐘管理
- 內(nèi)存分布
- 內(nèi)存管理
- 動(dòng)態(tài)內(nèi)存堆管理
- 靜態(tài)內(nèi)存池管理
- RTT啟動(dòng)過(guò)程
- 自動(dòng)初始化機(jī)制
- 內(nèi)核對(duì)象管理架構(gòu)
- 內(nèi)核配置&剪裁
前置說(shuō)明
一般單片機(jī)一般只有一個(gè)核心,做多線程實(shí)際上是 分時(shí)復(fù)用 CPU,是并發(fā)的。線程通常是指操作系統(tǒng)上的概念,而本文介紹的實(shí)時(shí)操作系統(tǒng) RTThread 的線程個(gè)人感覺(jué)應(yīng)該稱之為 任務(wù) 更合理,但為了和官方說(shuō)法一致,以下仍叫線程。
主要參考: RTThread 內(nèi)核基礎(chǔ)
RTThread框架
與其他 RTOS 不同,RTThread 不僅僅是一個(gè)實(shí)時(shí)內(nèi)核,它在努力構(gòu)造一套開(kāi)發(fā)生態(tài)。
其完整版框架如下:
當(dāng)然這里我們僅學(xué)習(xí) RTThread 內(nèi)核 部分,同時(shí)本文大部分內(nèi)容點(diǎn)到淺嘗輒止,主要是對(duì)RTThread 有一個(gè)大體的印象。
線程管理及調(diào)度器
RTT 的本質(zhì)是 基于優(yōu)先級(jí)的全搶占式多線程調(diào)度系統(tǒng),在該實(shí)時(shí)系統(tǒng)中,線程是最小的調(diào)度單位。
即在系統(tǒng)中除了中斷處理函數(shù)、調(diào)度器上鎖部分的代碼和禁止中斷的代碼是不可搶占的之外,系統(tǒng)的其他部分都是可以搶占的,包括線程調(diào)度器自身。
注意:RT-Thread 中,實(shí)際上線程并不存在運(yùn)行狀態(tài),就緒狀態(tài)和運(yùn)行狀態(tài)是等同的。
RTT 最多支持 256 個(gè)線程優(yōu)先級(jí),0 優(yōu)先級(jí)代表最高優(yōu)先級(jí),最低優(yōu)先級(jí)留給空閑線程使用。
同時(shí)它也支持創(chuàng)建多個(gè)具有相同優(yōu)先級(jí)的線程,相同優(yōu)先級(jí)的線程間采用 時(shí)間片輪轉(zhuǎn)調(diào)度算法 進(jìn)行調(diào)度,使每個(gè)線程運(yùn)行相應(yīng)時(shí)間。
線程間通信管理
- 線程同步
RT-Thread 采用 信號(hào)量、互斥量 與 事件集 實(shí)現(xiàn)線程間同步。線程通過(guò)對(duì)信號(hào)量、互斥量的獲取與釋放進(jìn)行同步。 - 線程通訊
RT-Thread 支持 郵箱 和 消息隊(duì)列 等通信機(jī)制。郵箱和消息隊(duì)列的發(fā)送動(dòng)作可安全用于中斷服務(wù)例程中。通信機(jī)制支持線程按優(yōu)先級(jí)等待或按先進(jìn)先出方式獲取。
時(shí)鐘管理
任何操作系統(tǒng)都需要提供一個(gè)時(shí)鐘節(jié)拍,以供系統(tǒng)處理所有和時(shí)間有關(guān)的事件,如線程的延時(shí)、線程的時(shí)間片輪轉(zhuǎn)調(diào)度以及定時(shí)器超時(shí)等。
時(shí)鐘節(jié)拍是特定的 周期性中斷,這個(gè)中斷可以看做是 系統(tǒng)心跳,中斷之間的時(shí)間間隔取決于不同的應(yīng)用,時(shí)鐘節(jié)拍率越快,系統(tǒng)的額外開(kāi)銷(xiāo)就越大,從系統(tǒng)啟動(dòng)開(kāi)始計(jì)數(shù)的時(shí)鐘節(jié)拍數(shù)稱為系統(tǒng)時(shí)間。
RT-Thread 的時(shí)鐘管理以時(shí)鐘節(jié)拍為基礎(chǔ),時(shí)鐘節(jié)拍是 RT-Thread 操作系統(tǒng)中最小的時(shí)鐘單位。
RT-Thread 的定時(shí)器提供兩類(lèi)定時(shí)器機(jī)制:
- 單次觸發(fā)定時(shí)器
這類(lèi)定時(shí)器在啟動(dòng)后只會(huì)觸發(fā)一次定時(shí)器事件,然后定時(shí)器自動(dòng)停止。 - 周期觸發(fā)定時(shí)器
這類(lèi)定時(shí)器會(huì)周期性的觸發(fā)定時(shí)器事件,直到用戶手動(dòng)的停止定時(shí)器否則將永遠(yuǎn)持續(xù)執(zhí)行下去。
通常使用定時(shí)器定時(shí) 回調(diào)函數(shù)(即超時(shí)函數(shù)),完成定時(shí)服務(wù)。用戶根據(jù)自己對(duì)定時(shí)處理的實(shí)時(shí)性要求選擇合適類(lèi)型的定時(shí)器。
內(nèi)存分布
首先看一下 RT-Thread Studio 中 編譯完生成的 elf 文件:
-
text
代碼段,用來(lái)存放 代碼 及一些 只讀常量,一般是只讀的區(qū)域。 -
data
數(shù)據(jù)段,用來(lái)存放全局初始化變量,以及全局或局部 靜態(tài)變量。 -
bss
BSS 段,用來(lái)存放所有 未初始化的數(shù)據(jù),用 0 來(lái)初始化。 -
dec
是 decimal 即十進(jìn)制的縮寫(xiě),是 text,data 和 bss 的算術(shù)和。 -
hex
是 hexadecimal 即十六進(jìn)制的縮寫(xiě)。 -
filename
編譯生成的目標(biāo)文件名,本例中即為:rtthread.elf 。
一般 MCU 包含的存儲(chǔ)空間有:片內(nèi) Flash 與片內(nèi) RAM。
RAM 相當(dāng)于內(nèi)存,Flash 相當(dāng)于硬盤(pán)。
-
FLASH(燒錄程序所占的Flash大小) = text + data
-
RAM (運(yùn)行時(shí)占用的RAM大小) = data + bss
內(nèi)存管理
動(dòng)態(tài)內(nèi)存堆管理
動(dòng)態(tài)內(nèi)存堆是根據(jù)我們開(kāi)發(fā)需求分配任意大小的內(nèi)存塊。既然是堆,那么就要我們自己申請(qǐng)及釋放。當(dāng)不需要再使用這些內(nèi)存塊時(shí),需要釋放回堆中供其他應(yīng)用分配使用,否則會(huì)造成 內(nèi)存泄漏。
RTT為我們提供了三種動(dòng)態(tài)內(nèi)存堆的調(diào)度算法:
- 小內(nèi)存管理算法
- slab算法
- memheap 管理算法
靜態(tài)內(nèi)存池管理
內(nèi)存堆管理器非常靈活和方便,但是會(huì)產(chǎn)生以下兩個(gè)問(wèn)題:
- 分配效率不高,在每次分配時(shí),都要空閑內(nèi)存塊查找。
- 容易產(chǎn)生內(nèi)存碎片。
為了提高內(nèi)存分配的效率,并且避免內(nèi)存碎片,RT-Thread 提供了另外一種內(nèi)存管理方法:內(nèi)存池(Memory Pool)。
注意:內(nèi)存池是 靜態(tài)變量,其存放位置為 data 段。
當(dāng)靜態(tài)內(nèi)存池具有可用內(nèi)存時(shí),系統(tǒng)對(duì)內(nèi)存塊分配的時(shí)間將是恒定的。
當(dāng)靜態(tài)內(nèi)存池為空時(shí),系統(tǒng)將申請(qǐng)內(nèi)存塊的線程掛起或阻塞掉 (即線程等待一段時(shí)間后仍未獲得內(nèi)存塊就放棄申請(qǐng)并返回,或者立刻返回。
等待的時(shí)間取決于申請(qǐng)內(nèi)存塊時(shí)設(shè)置的等待時(shí)間參數(shù)),當(dāng)其他線程釋放內(nèi)存塊到內(nèi)存池時(shí),如果有掛起的待分配內(nèi)存塊的線程存在的話,則系統(tǒng)會(huì)將這個(gè)線程喚醒。
ps:內(nèi)存池的線程掛起功能非常適合需要通過(guò)內(nèi)存資源進(jìn)行同步的場(chǎng)景。
RTT啟動(dòng)過(guò)程
自動(dòng)初始化機(jī)制
在函數(shù)定義處通過(guò)宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過(guò)程中被執(zhí)行。
使用該方法,main() 函數(shù)會(huì)非常簡(jiǎn)潔。
內(nèi)核對(duì)象管理架構(gòu)
RT-Thread 采用內(nèi)核對(duì)象管理系統(tǒng)來(lái)訪問(wèn) / 管理所有內(nèi)核對(duì)象,內(nèi)核對(duì)象包含了內(nèi)核中絕大部分設(shè)施,這些內(nèi)核對(duì)象可以是靜態(tài)分配的靜態(tài)對(duì)象,也可以是從系統(tǒng)內(nèi)存堆中分配的動(dòng)態(tài)對(duì)象。
通過(guò)這種內(nèi)核對(duì)象的設(shè)計(jì)方式,RT-Thread 做到了不依賴于具體的內(nèi)存分配方式,系統(tǒng)的靈活性得到極大的提高。對(duì)象容器中包含了每類(lèi)內(nèi)核對(duì)象的信息,包括對(duì)象類(lèi)型,大小等。對(duì)象容器給每類(lèi)內(nèi)核對(duì)象分配了一個(gè)鏈表,所有的內(nèi)核對(duì)象都被鏈接到該鏈表上。
推薦:rt-thread的內(nèi)核對(duì)象管理系統(tǒng)分析
內(nèi)核配置&剪裁
RT-Thread 的一個(gè)重要特性是高度可裁剪性,支持對(duì)內(nèi)核進(jìn)行精細(xì)調(diào)整,對(duì)組件進(jìn)行靈活拆卸。
配置主要是通過(guò)修改工程目錄下的 rtconfig.h 文件來(lái)進(jìn)行,用戶可以通過(guò)打開(kāi) / 關(guān)閉該文件中的 宏定義 來(lái)對(duì)代碼進(jìn)行條件編譯,最終達(dá)到系統(tǒng)配置和裁剪的目的。
另外,env - menuconfig 是個(gè)好東西。
注意:在實(shí)際應(yīng)用中,系統(tǒng)配置文件 rtconfig.h 是由配置工具自動(dòng)生成的,無(wú)需手動(dòng)更改。
總結(jié)
以上是生活随笔為你收集整理的RTThread(一) - 概念及简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 离散数学 笔记 zucc
- 下一篇: IDEA手动下载导入插件