一、RT-Thread概述
RT-Thread 是一款具有顯著優(yōu)勢(shì)的開源嵌入式實(shí)時(shí)操作系統(tǒng)。它不僅具備輕量級(jí)、實(shí)時(shí)性強(qiáng)的特點(diǎn),還擁有廣泛的開源社區(qū)支持和豐富的應(yīng)用場(chǎng)景。
在輕量級(jí)方面,RT-Thread 能夠適應(yīng)資源受限的嵌入式環(huán)境,通過高效的內(nèi)核設(shè)計(jì)和資源管理,為設(shè)備節(jié)省寶貴的系統(tǒng)資源。其小巧的內(nèi)核可以在極小的存儲(chǔ)空間中運(yùn)行,為小型設(shè)備提供了可靠的操作系統(tǒng)選擇。
實(shí)時(shí)性是 RT-Thread 的核心優(yōu)勢(shì)之一。它具備快速的任務(wù)響應(yīng)能力和精確的時(shí)間控制,能夠滿足對(duì)時(shí)間敏感的應(yīng)用需求,如工業(yè)控制、航空航天等領(lǐng)域。
RT-Thread 的開源特性促進(jìn)了其快速發(fā)展和廣泛應(yīng)用。眾多開發(fā)者能夠參與到其代碼貢獻(xiàn)和改進(jìn)中,不斷豐富其功能和優(yōu)化性能。
在嵌入式系統(tǒng)領(lǐng)域,RT-Thread 得到了廣泛的應(yīng)用。從智能家居中的智能家電控制,到工業(yè)自動(dòng)化中的生產(chǎn)流程監(jiān)控,再到汽車電子中的車載系統(tǒng),都能看到它的身影。其強(qiáng)大的功能和良好的適應(yīng)性,使得各類嵌入式設(shè)備能夠穩(wěn)定、高效地運(yùn)行。
總之,RT-Thread 以其開源、輕量級(jí)和實(shí)時(shí)性等特點(diǎn),在嵌入式系統(tǒng)領(lǐng)域發(fā)揮著重要作用,為開發(fā)者提供了可靠、高效的操作系統(tǒng)解決方案。
二、RT-Thread啟動(dòng)流程
系統(tǒng)上電后,首先從啟動(dòng)文件開始運(yùn)行。啟動(dòng)文件通常會(huì)完成一些基礎(chǔ)的硬件設(shè)置,如初始化時(shí)鐘、配置中斷向量表以及初始化堆棧等。
接著,程序跳轉(zhuǎn)至 RT-Thread 的入口函數(shù) rtthread_startup 。在這個(gè)函數(shù)中,一系列重要的初始化工作依次展開。
首先是硬件初始化,包括設(shè)置系統(tǒng)時(shí)鐘、初始化相關(guān)外設(shè)等,為后續(xù)的系統(tǒng)運(yùn)行提供硬件基礎(chǔ)。
然后是系統(tǒng)內(nèi)核對(duì)象的創(chuàng)建,如定時(shí)器、調(diào)度器等。這些內(nèi)核對(duì)象的創(chuàng)建為系統(tǒng)的任務(wù)調(diào)度和時(shí)間管理提供了支持。
接下來創(chuàng)建 main 線程,同時(shí)會(huì)對(duì)線程棧進(jìn)行初始化。main 線程通常承擔(dān)著用戶應(yīng)用程序的主要邏輯。
在 rtthread_startup 函數(shù)中,還會(huì)進(jìn)行定時(shí)器和調(diào)度器的初始化。定時(shí)器初始化確保系統(tǒng)能夠進(jìn)行精確的定時(shí)操作,調(diào)度器初始化則為任務(wù)的合理分配和切換奠定基礎(chǔ)。
在完成這些初始化工作后,系統(tǒng)準(zhǔn)備就緒,等待調(diào)度器啟動(dòng),從而開啟系統(tǒng)的正常運(yùn)行和任務(wù)調(diào)度。
總的來說,RT-Thread 的啟動(dòng)流程嚴(yán)謹(jǐn)有序,通過逐步完成各項(xiàng)初始化工作,為系統(tǒng)的穩(wěn)定運(yùn)行和高效任務(wù)處理提供了有力保障。
三、程序內(nèi)存分布
Code(代碼段):Code 段存放程序的代碼部分。在編譯時(shí)確定其大小,運(yùn)行時(shí)其內(nèi)容不發(fā)生改變。在程序編譯時(shí),代碼段占用一定的 Flash 空間,運(yùn)行時(shí) CPU 從 Flash 中讀取執(zhí)行代碼。
RO-data(只讀數(shù)據(jù)段):RO-data 段用于存放程序中定義的常量,如字符串常量等。這些數(shù)據(jù)在編譯時(shí)確定,且在運(yùn)行時(shí)不可更改,位于 Flash 中。RO-data 段在編譯時(shí)占用 Flash 空間。
RW-data(讀寫數(shù)據(jù)段):RW-data 段存放初始化為非 0 值的全局變量。在編譯時(shí),其占用一定的 Flash 空間;在運(yùn)行時(shí),由于其中的數(shù)據(jù)需要讀寫操作,所以 RW-data 中的數(shù)據(jù)會(huì)被從 Flash 搬運(yùn)到 RAM 中。
ZI-data(0 數(shù)據(jù)段):ZI-data 段存放未初始化或初始化為 0 的全局變量。ZI-data 段在編譯時(shí)不占用 Flash 空間,在運(yùn)行時(shí)根據(jù)編譯器給出的 ZI 地址和大小在 RAM 中分配空間,并將其清零。
總的來說,在編譯時(shí),RO Size 包括 Code 及 RO-data,表示程序占用 Flash 空間的大小;RW Size 包括 RW-data 及 ZI-data,表示運(yùn)行時(shí)占用的 RAM 大??;ROM Size 包括 Code、RO Data 以及 RW Data,表示燒寫程序所占用的 Flash 空間大小。程序運(yùn)行時(shí),CPU 從 Flash 讀取 Code 段和 RO-data 段的內(nèi)容,從 RAM 讀寫 RW-data 段和 ZI-data 段的數(shù)據(jù)。
四、自動(dòng)初始化機(jī)制
RT-Thread 的自動(dòng)初始化機(jī)制通過巧妙的宏定義方式實(shí)現(xiàn)。在函數(shù)定義處使用特定的宏聲明初始化函數(shù),這些函數(shù)會(huì)在系統(tǒng)啟動(dòng)過程中自動(dòng)被執(zhí)行,無需手動(dòng)調(diào)用。
INIT_BOARD_EXPORT 主要用于非常早期的初始化,例如芯片相關(guān)硬件的初始化,此時(shí)調(diào)度器還未啟動(dòng)。它適用于那些在系統(tǒng)啟動(dòng)極早期就必須完成的關(guān)鍵硬件初始化操作。
INIT_PREV_EXPORT 用于純軟件的初始化,通常是沒有太多依賴的函數(shù)。比如一些簡(jiǎn)單的軟件配置或早期的軟件模塊初始化。
INIT_DEVICE_EXPORT 針對(duì)外設(shè)驅(qū)動(dòng)的初始化,如網(wǎng)卡設(shè)備等。在需要對(duì)外設(shè)進(jìn)行初始化以便后續(xù)系統(tǒng)正常使用時(shí)使用。
INIT_COMPONENT_EXPORT 主要用于組件的初始化,像文件系統(tǒng)或者 LWIP 等組件的初始化就可通過此宏。
INIT_ENV_EXPORT 用于系統(tǒng)環(huán)境的初始化,比如掛載文件系統(tǒng)等操作。
INIT_APP_EXPORT 則用于應(yīng)用的初始化,比如 GUI 應(yīng)用等。
通過這些不同類型的自動(dòng)初始化接口,開發(fā)者能夠根據(jù)具體的初始化需求,將函數(shù)放置在合適的初始化階段,確保系統(tǒng)在啟動(dòng)過程中有序、高效地完成各項(xiàng)初始化工作,提高了開發(fā)效率和系統(tǒng)的穩(wěn)定性。
五、內(nèi)核對(duì)象模型
RT-Thread 的內(nèi)核對(duì)象豐富多樣,包括線程、信號(hào)量、郵箱、消息隊(duì)列、內(nèi)存池等。
線程:是 RT-Thread 中最基本的調(diào)度單位,描述了任務(wù)執(zhí)行的上下文關(guān)系和優(yōu)先等級(jí)。線程控制塊存儲(chǔ)了線程的關(guān)鍵信息,如優(yōu)先級(jí)、狀態(tài)、棧地址等。
信號(hào)量:用于解決線程間的同步和互斥問題。通過信號(hào)量的計(jì)數(shù)值來控制資源的訪問,當(dāng)計(jì)數(shù)值為 0 時(shí),申請(qǐng)資源的線程會(huì)被阻塞。
郵箱:實(shí)現(xiàn)線程間的消息傳遞,能夠存儲(chǔ)一定量的消息數(shù)據(jù)。
消息隊(duì)列:可以存儲(chǔ)多個(gè)消息,支持不同線程之間的異步通信。
內(nèi)存池:用于高效地管理內(nèi)存分配和釋放,提高內(nèi)存使用效率。
內(nèi)核對(duì)象管理框架通過鏈表來管理各類對(duì)象。每個(gè)內(nèi)核對(duì)象類型都有對(duì)應(yīng)的鏈表,對(duì)象通過鏈表節(jié)點(diǎn)進(jìn)行連接。例如,線程對(duì)象通過線程鏈表進(jìn)行管理。
對(duì)象的派生和繼承關(guān)系帶來了顯著的優(yōu)勢(shì)。一方面,提高了系統(tǒng)的可重用性和擴(kuò)展性。新的對(duì)象類別可以在繼承通用屬性的基礎(chǔ)上進(jìn)行少量擴(kuò)展即可創(chuàng)建,降低了開發(fā)難度。另一方面,提供了統(tǒng)一的對(duì)象操作方式,簡(jiǎn)化了具體對(duì)象的操作流程,提高了系統(tǒng)的可靠性和穩(wěn)定性。例如,線程控制塊在繼承通用對(duì)象結(jié)構(gòu)的基礎(chǔ)上,增加了線程特有的屬性,使得線程管理更加精準(zhǔn)和高效。
六、線程管理
6.1 多線程的基本概念與 RT-Thread 中的實(shí)現(xiàn)
在操作系統(tǒng)中,多線程是將一個(gè)大型任務(wù)分解為多個(gè)可獨(dú)立執(zhí)行的小任務(wù),從而提高系統(tǒng)的并發(fā)處理能力。在 RT-Thread 中,通過線程控制塊來管理線程,每個(gè)線程都有自己的執(zhí)行環(huán)境和優(yōu)先級(jí)。線程之間可以通過共享資源和通信機(jī)制進(jìn)行協(xié)作。
6.2 線程的相關(guān)屬性
線程棧:RT-Thread 中線程具有獨(dú)立的棧,用于存儲(chǔ)線程運(yùn)行時(shí)的局部變量和上下文信息。線程切換時(shí),上下文會(huì)保存到棧中,恢復(fù)運(yùn)行時(shí)再從棧中讀取。
線程狀態(tài):線程存在初始、就緒、運(yùn)行、掛起和關(guān)閉這五種狀態(tài)。初始狀態(tài)表示線程剛創(chuàng)建未運(yùn)行;就緒狀態(tài)意味著線程準(zhǔn)備好等待被調(diào)度執(zhí)行;運(yùn)行狀態(tài)表示線程正在占用 CPU 執(zhí)行;掛起狀態(tài)通常是由于資源不可用或主動(dòng)延時(shí)導(dǎo)致線程暫時(shí)不參與調(diào)度;關(guān)閉狀態(tài)則表示線程已結(jié)束。
線程優(yōu)先級(jí):RT-Thread 支持最多 256 個(gè)優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高,0 為最高優(yōu)先級(jí)??筛鶕?jù)實(shí)際需求為不同線程設(shè)置優(yōu)先級(jí),以決定線程被調(diào)度的先后順序。
時(shí)間片:時(shí)間片僅對(duì)相同優(yōu)先級(jí)的就緒態(tài)線程有效。它決定了同一優(yōu)先級(jí)線程每次被調(diào)度執(zhí)行的時(shí)長(zhǎng),影響系統(tǒng)的響應(yīng)性和任務(wù)切換頻率。
6.3 系統(tǒng)線程
空閑線程:空閑線程是系統(tǒng)中優(yōu)先級(jí)最低的線程,其狀態(tài)永遠(yuǎn)為就緒態(tài)。當(dāng)系統(tǒng)中無其他就緒線程時(shí),調(diào)度器會(huì)調(diào)度空閑線程。它通常是一個(gè)死循環(huán),用于執(zhí)行一些后臺(tái)任務(wù),如資源回收、功耗管理等。
主線程:在系統(tǒng)啟動(dòng)時(shí)創(chuàng)建,入口函數(shù)為 main_thread_entry 。用戶的應(yīng)用入口函數(shù) main 從這里開始,用戶可在 main 函數(shù)中添加應(yīng)用程序的初始化代碼。
6.4 線程調(diào)度的相關(guān)API
啟動(dòng):通過 rt_thread_startup 函數(shù)將創(chuàng)建或初始化后的線程調(diào)入相應(yīng)優(yōu)先級(jí)的就緒隊(duì)列,等待被調(diào)度執(zhí)行。
獲取當(dāng)前:使用 rt_thread_self 函數(shù)可以獲取當(dāng)前正在執(zhí)行的線程句柄。
讓出資源:rt_thread_yield 函數(shù)使當(dāng)前線程讓出 CPU 資源,相同優(yōu)先級(jí)的其他線程將被執(zhí)行。
睡眠:rt_thread_sleep 、 rt_thread_delay 和 rt_thread_mdelay 等函數(shù)可使當(dāng)前線程掛起指定時(shí)間,時(shí)間結(jié)束后線程重新進(jìn)入就緒狀態(tài)。
掛起和恢復(fù):rt_thread_suspend 函數(shù)掛起線程, rt_thread_resume 函數(shù)恢復(fù)被掛起的線程。
控制:rt_thread_control 函數(shù)可用于動(dòng)態(tài)更改線程的優(yōu)先級(jí)等屬性。
七、時(shí)鐘管理
7.1 時(shí)鐘節(jié)拍的概念和作用
時(shí)鐘節(jié)拍(OS Tick)是 RT-Thread 操作系統(tǒng)的最小時(shí)間單位,它就如同系統(tǒng)的心跳,為系統(tǒng)處理各種與時(shí)間相關(guān)的事件提供了基準(zhǔn)。在 RT-Thread 中,時(shí)鐘節(jié)拍被廣泛應(yīng)用于線程延時(shí)、時(shí)間片輪轉(zhuǎn)以及定時(shí)器超時(shí)等方面。
在線程延時(shí)方面,通過時(shí)鐘節(jié)拍來精確控制線程暫停的時(shí)間,確保線程按照預(yù)定的時(shí)間間隔執(zhí)行。
對(duì)于時(shí)間片輪轉(zhuǎn)調(diào)度,時(shí)鐘節(jié)拍用于確定每個(gè)線程占用 CPU 的時(shí)間片長(zhǎng)度,實(shí)現(xiàn)線程之間的公平輪轉(zhuǎn)執(zhí)行,提高系統(tǒng)的并發(fā)處理能力。
而在定時(shí)器超時(shí)方面,時(shí)鐘節(jié)拍的作用至關(guān)重要。當(dāng)定時(shí)器設(shè)定的時(shí)間達(dá)到對(duì)應(yīng)的時(shí)鐘節(jié)拍數(shù)時(shí),就會(huì)觸發(fā)超時(shí)操作,執(zhí)行相應(yīng)的回調(diào)函數(shù)。
7.2 時(shí)鐘節(jié)拍的實(shí)現(xiàn)原理
RT-Thread 中時(shí)鐘節(jié)拍的實(shí)現(xiàn)依賴于硬件定時(shí)器的觸發(fā)。通常,系統(tǒng)會(huì)配置一個(gè)硬件定時(shí)器為中斷觸發(fā)模式,比如對(duì)于 Cortex-M 芯片來說,常用的是滴答定時(shí)器 Systick。
當(dāng)中斷產(chǎn)生時(shí),會(huì)調(diào)用一系列函數(shù)進(jìn)行計(jì)數(shù)和處理。在中斷服務(wù)函數(shù)中,會(huì)執(zhí)行關(guān)鍵的操作。
-
嵌入式
+關(guān)注
關(guān)注
5045文章
18813瀏覽量
298429 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1336瀏覽量
40082 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6544瀏覽量
122727 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1239瀏覽量
39425
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論