內(nèi)核的連載內(nèi)容包括 RT-Thread 內(nèi)核基礎(chǔ):內(nèi)核簡介、系統(tǒng)的啟動流程及內(nèi)核配置的部分內(nèi)容,以上內(nèi)容都是為后面的章節(jié)奠定基礎(chǔ)。本章內(nèi)容將分為3篇連載!
RT-Thread 內(nèi)核的簡單介紹,從軟件架構(gòu)入手講解實時內(nèi)核的組成與實現(xiàn),這部分給初學者引入一些 RT-Thread 內(nèi)核相關(guān)的概念與基礎(chǔ)知識,讓初學者對內(nèi)核有初步的了解。學完本章內(nèi)容以后,讀者將會對 RT-Thread 內(nèi)核有基本的了解,知道內(nèi)核的組成部分、系統(tǒng)如何啟動、內(nèi)存分布情況以及內(nè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)先級,針對 STM32 默認配置是 32 個線程優(yōu)先級),0 優(yōu)先級代表最高優(yōu)先級,最低優(yōu)先級留給空閑線程使用;同時它也支持創(chuàng)建多個具有相同優(yōu)先級的線程,相同優(yōu)先級的線程間采用時間片的輪轉(zhuǎn)調(diào)度算法進行調(diào)度,使每個線程運行相應時間;另外調(diào)度器在尋找那些處于就緒狀態(tài)的具有最高優(yōu)先級的線程時,所經(jīng)歷的時間是恒定的,系統(tǒng)也不限制線程數(shù)量的多少,線程數(shù)目只和硬件平臺的具體內(nèi)存相關(guān)。
線程管理將在后面的《線程管理》章節(jié)詳細介紹。
時鐘管理
RT-Thread 的時鐘管理以時鐘節(jié)拍為基礎(chǔ),時鐘節(jié)拍是 RT-Thread 操作系統(tǒng)中最小的時鐘單位。RT-Thread 的定時器提供兩類定時器機制:第一類是單次觸發(fā)定時器,這類定時器在啟動后只會觸發(fā)一次定時器事件,然后定時器自動停止。第二類是周期觸發(fā)定時器,這類定時器會周期性的觸發(fā)定時器事件,直到用戶手動的停止定時器否則將永遠持續(xù)執(zhí)行下去。
另外,根據(jù)超時函數(shù)執(zhí)行時所處的上下文環(huán)境,RT-Thread 的定時器可以設置為 HARD_TIMER 模式或者 SOFT_TIMER 模式。
通常使用定時器定時回調(diào)函數(shù)(即超時函數(shù)),完成定時服務。用戶根據(jù)自己對定時處理的實時性要求選擇合適類型的定時器。
定時器將在后面的《時鐘管理》章節(jié)展開講解。
線程間同步
RT-Thread 采用信號量、互斥量與事件集實現(xiàn)線程間同步。線程通過對信號量、互斥量的獲取與釋放進行同步;互斥量采用優(yōu)先級繼承的方式解決了實時系統(tǒng)常見的優(yōu)先級翻轉(zhuǎn)問題。線程同步機制支持線程按優(yōu)先級等待或按先進先出方式獲取信號量或互斥量。線程通過對事件的發(fā)送與接收進行同步;事件集支持多事件的 “或觸發(fā)” 和“與觸發(fā)”,適合于線程等待多個事件的情況。
信號量、互斥量與事件集的概念將在后面的《線程間同步》章節(jié)詳細介紹。
線程間通信
RT-Thread 支持郵箱和消息隊列等通信機制。郵箱中一封郵件的長度固定為 4 字節(jié)大小;消息隊列能夠接收不固定長度的消息,并把消息緩存在自己的內(nèi)存空間中。郵箱效率較消息隊列更為高效。郵箱和消息隊列的發(fā)送動作可安全用于中斷服務例程中。通信機制支持線程按優(yōu)先級等待或按先進先出方式獲取。
郵箱和消息隊列的概念將在后面的《線程間通信》章節(jié)詳細介紹。
內(nèi)存管理
RT-Thread 支持靜態(tài)內(nèi)存池管理及動態(tài)內(nèi)存堆管理。當靜態(tài)內(nèi)存池具有可用內(nèi)存時,系統(tǒng)對內(nèi)存塊分配的時間將是恒定的;當靜態(tài)內(nèi)存池為空時,系統(tǒng)將申請內(nèi)存塊的線程掛起或阻塞掉 (即線程等待一段時間后仍未獲得內(nèi)存塊就放棄申請并返回,或者立刻返回。等待的時間取決于申請內(nèi)存塊時設置的等待時間參數(shù)),當其他線程釋放內(nèi)存塊到內(nèi)存池時,如果有掛起的待分配內(nèi)存塊的線程存在的話,則系統(tǒng)會將這個線程喚醒。
動態(tài)內(nèi)存堆管理模塊在系統(tǒng)資源不同的情況下,分別提供了面向小內(nèi)存系統(tǒng)的內(nèi)存管理算法及面向大內(nèi)存系統(tǒng)的SLAB 內(nèi)存管理算法。福利:在電子發(fā)燒友網(wǎng)公眾號回復資料,免費領(lǐng)取一份模電資料集
還有一種動態(tài)內(nèi)存堆管理叫做 memheap,適用于系統(tǒng)含有多個地址可不連續(xù)的內(nèi)存堆。使用 memheap 可以將多個內(nèi)存堆 “粘貼” 在一起,讓用戶操作起來像是在操作一個內(nèi)存堆。
內(nèi)存管理的概念將在后面的《內(nèi)存管理》章節(jié)展開講解。
I/O 設備管理
RT-Thread 將 PIN、I2C、SPI、USB、UART 等作為外設設備,統(tǒng)一通過設備注冊完成。實現(xiàn)了按名稱訪問的設備管理子系統(tǒng),可按照統(tǒng)一的 API 界面訪問硬件設備。在設備驅(qū)動接口上,根據(jù)嵌入式系統(tǒng)的特點,對不同的設備可以掛接相應的事件。當設備事件觸發(fā)時,由驅(qū)動程序通知給上層的應用程序。
I/O 設備管理的概念將在后面的《設備模型》及《通用設備》章節(jié)展開講解。
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2945文章
47818瀏覽量
414804 -
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373399 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1613瀏覽量
44819
原文標題:從0-1帶你入門物聯(lián)網(wǎng)操作系統(tǒng)(3)——內(nèi)核介紹
文章出處:【微信號:elecfans,微信公眾號:電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
16天入門RT-Thread內(nèi)核,快速上手無壓力!
RT-Thread快速入門之了解內(nèi)核啟動流程
RT-Thread 內(nèi)核學習筆記 - 理解defunct僵尸線程
RT-Thread 內(nèi)核學習筆記 - 設備模型rt_device的理解
RT-Thread 內(nèi)核學習筆記 - 內(nèi)核對象鏈表結(jié)構(gòu)深入理解
RT-Thread 內(nèi)核學習筆記 - 內(nèi)核對象初始化鏈表組織方式
RT-Thread 內(nèi)核學習筆記 - 內(nèi)核對象操作API
大佬帶你理解RT-Thread內(nèi)核并上手實踐
如何深入理解RT-Thread內(nèi)核并上手實踐,看完這篇有答案了!
RT-Thread v5.0.2 發(fā)布
如何對RT-Thread內(nèi)核有基本的了解?
評論