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