国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

RT-Thread內(nèi)核——內(nèi)核基礎(chǔ)(上)

這篇具有很好參考價(jià)值的文章主要介紹了RT-Thread內(nèi)核——內(nèi)核基礎(chǔ)(上)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、內(nèi)核簡介

內(nèi)核是操作系統(tǒng)的核心,是操作系統(tǒng)最基礎(chǔ)也是最重要的部分,主要負(fù)責(zé)系統(tǒng)的線程、線程間通信、系統(tǒng)時(shí)鐘、中斷以及內(nèi)存等。其架構(gòu)圖如下:
RT-Thread內(nèi)核——內(nèi)核基礎(chǔ)(上),RT-Thread,物聯(lián)網(wǎng)

2、線程調(diào)度

線程是RT-Thread操作系統(tǒng)中最小的調(diào)度單位,線程調(diào)度算法的基于優(yōu)先級的全搶占式多線程調(diào)度算法,即在系統(tǒng)中除了中斷處理函數(shù)、調(diào)度器上鎖部分的代碼和禁止中斷的代碼外是不可搶占的,其他都可以搶占,包括線程調(diào)度器自身。線程調(diào)度算法支持256個(gè)線程優(yōu)先級,0優(yōu)先級代表最高優(yōu)先級,最低優(yōu)先級留給空閑線程使用;對于相同優(yōu)先級的線程,采用時(shí)間片的輪轉(zhuǎn)調(diào)度算法進(jìn)行調(diào)度,使每個(gè)線程運(yùn)行相應(yīng)時(shí)間;調(diào)度器在尋找那些處于就緒態(tài)的具有最高優(yōu)先級的線程時(shí),所經(jīng)歷的時(shí)間是恒定的,系統(tǒng)不限制線程數(shù)量的多少,線程數(shù)目只和硬件平臺的具體內(nèi)存相關(guān),這個(gè)具體的內(nèi)存要去掉實(shí)際程序中已經(jīng)用掉的內(nèi)存,實(shí)際的代碼會用掉一部分內(nèi)存,因此不能只看硬件的參數(shù),還需要考慮代碼對內(nèi)存的占用情況。

3、 時(shí)鐘管理

RT-Thread的時(shí)鐘管理是以時(shí)鐘節(jié)拍為基礎(chǔ)的,時(shí)鐘節(jié)拍的RT-Thread中最小的時(shí)鐘單位。RT-Thread提供兩種定時(shí)器的機(jī)制:一是單次觸發(fā)定時(shí)器,此定時(shí)器在啟動之后只會觸發(fā)一次定時(shí)器事件,然后定時(shí)器自動停止;二是周期觸發(fā)定時(shí)器,這類定時(shí)器會周期性的觸發(fā)定時(shí)器事件,直到用戶手動的停止定時(shí)器,否則將永遠(yuǎn)持續(xù)執(zhí)行下去。
根據(jù)超時(shí)函數(shù)執(zhí)行時(shí)的上下文,RT-Thread的定時(shí)器可以設(shè)置為HARD_TIMER模式和SOFT_TIMER模式。

4、線程間同步

RT-Thread采用信號量、互斥量事件實(shí)現(xiàn)線程間同步。線程通過對信號量、互斥量的獲取與釋放進(jìn)行同步;互斥量采用優(yōu)先級繼承的方式解決了實(shí)時(shí)系統(tǒng)常見的優(yōu)先級反轉(zhuǎn)問題。線程同步機(jī)制支持線程按優(yōu)先級等待方式獲取信號量或互斥量。線程通過對事件的發(fā)送與接受進(jìn)行同步;事件集支持多事件的“或觸發(fā)”和“與觸發(fā)”,適合于線程等待多個(gè)事件的情況。

5、線程間通信

RT-Thread 支持郵箱消息隊(duì)列等通信機(jī)制。郵箱中一封郵件的長度固定為 4 字節(jié)大小;消息隊(duì)列能夠接收不固定長度的消息,并把消息緩存在自己的內(nèi)存空間中。郵箱效率較消息隊(duì)列更為高效。郵箱和消息隊(duì)列的發(fā)送動作可安全用于中斷服務(wù)例程中。通信機(jī)制支持線程按優(yōu)先級等待方式獲取。

6、內(nèi)存管理

RT-Thread支持靜態(tài)內(nèi)存池管理動態(tài)內(nèi)存堆管理。當(dāng)靜態(tài)內(nèi)存池具有可用內(nèi)存時(shí),系統(tǒng)對內(nèi)存塊分配的時(shí)間是恒定的;當(dāng)靜態(tài)內(nèi)存池為空時(shí),系統(tǒng)將申請內(nèi)存塊的線程掛起或者阻塞掉(線程等待一段時(shí)間后仍未獲得內(nèi)存塊就放棄申請并返回,或者立刻返回。等待的時(shí)間取決去申請內(nèi)存塊時(shí)設(shè)置的等待時(shí)間參數(shù)),當(dāng)其他線程釋放內(nèi)存塊到內(nèi)存池時(shí),如有掛起的待分配的線程存在的話,則系統(tǒng)會將這個(gè)線程喚醒。
動態(tài)內(nèi)存堆管理模塊在系統(tǒng)資源不同的情況下,分別提供了面向小內(nèi)存管理算法及面向大內(nèi)存系統(tǒng)的SLAB內(nèi)存管理算法。
另一種動態(tài)內(nèi)存堆管理叫做memheap,適用于系統(tǒng)含有多個(gè)地址且不連續(xù)的內(nèi)存堆。使用memheap可以將多個(gè)內(nèi)存堆“粘貼”在一起,讓用戶操作起來像是在操作一個(gè)內(nèi)存堆。

7、I/O設(shè)備管理

RT-Thread 將 PIN、I2C、SPI、USB、UART 等作為外設(shè)設(shè)備,統(tǒng)一通過設(shè)備注冊完成。實(shí)現(xiàn)了按名稱訪問的設(shè)備管理子系統(tǒng),可按照統(tǒng)一的 API 界面訪問硬件設(shè)備。在設(shè)備驅(qū)動接口上,根據(jù)嵌入式系統(tǒng)的特點(diǎn),對不同的設(shè)備可以掛接相應(yīng)的事件。當(dāng)設(shè)備事件觸發(fā)時(shí),由驅(qū)動程序通知給上層的應(yīng)用程序。

8、RT-Thread啟動流程

RT-Thread 支持多種平臺和多種編譯器,而 rtthread_startup() 函數(shù)是 RT-Thread 規(guī)定的統(tǒng)一啟動入口。一般執(zhí)行順序是:系統(tǒng)先從啟動文件開始運(yùn)行,然后進(jìn)入 RT-Thread 的啟動函數(shù) rtthread_startup() ,最后進(jìn)入用戶入口函數(shù) main(),如下圖所示:
RT-Thread內(nèi)核——內(nèi)核基礎(chǔ)(上),RT-Thread,物聯(lián)網(wǎng)
rtthread_startup() 函數(shù),其中 rtthread_startup() 函數(shù)的代碼如下所示:

int rtthread_startup(void)
{
    rt_hw_interrupt_disable();

    /* 板級初始化:需在該函數(shù)內(nèi)部進(jìn)行系統(tǒng)堆的初始化 */
    rt_hw_board_init();

    /* 打印 RT-Thread 版本信息 */
    rt_show_version();

    /* 定時(shí)器初始化 */
    rt_system_timer_init();

    /* 調(diào)度器初始化 */
    rt_system_scheduler_init();

#ifdef RT_USING_SIGNALS
    /* 信號初始化 */
    rt_system_signal_init();
#endif

    /* 由此創(chuàng)建一個(gè)用戶 main 線程 */
    rt_application_init();

    /* 定時(shí)器線程初始化 */
    rt_system_timer_thread_init();

    /* 空閑線程初始化 */
    rt_thread_idle_init();

    /* 啟動調(diào)度器 */
    rt_system_scheduler_start();

    /* 不會執(zhí)行至此 */
    return 0;
}

這部分啟動代碼,大致可以分為四個(gè)部分:
(1)初始化與系統(tǒng)相關(guān)的硬件;
(2)初始化系統(tǒng)內(nèi)核對象,例如定時(shí)器、調(diào)度器、信號;
(3)創(chuàng)建 main 線程,在 main 線程中對各類模塊依次進(jìn)行初始化;
(4)初始化定時(shí)器線程、空閑線程,并啟動調(diào)度器。
啟動調(diào)度器之前,系統(tǒng)所創(chuàng)建的線程在執(zhí)行 rt_thread_startup() 后并不會立馬運(yùn)行,它們會處于就緒狀態(tài)等待系統(tǒng)調(diào)度;待啟動調(diào)度器之后,系統(tǒng)才轉(zhuǎn)入第一個(gè)線程開始運(yùn)行,根據(jù)調(diào)度規(guī)則,選擇的是就緒隊(duì)列中優(yōu)先級最高的線程。
rt_hw_board_init() 中完成系統(tǒng)時(shí)鐘設(shè)置,為系統(tǒng)提供心跳、串口初始化,將系統(tǒng)輸入輸出終端綁定到這個(gè)串口,后續(xù)系統(tǒng)運(yùn)行信息就會從串口打印出來。

9、RT-Thread程序內(nèi)存分布

一般MCU包含的存儲空間有:片內(nèi)Flash與片內(nèi)RAM,RAM相當(dāng)于內(nèi)存,F(xiàn)lash相當(dāng)于硬盤。編譯器會將程序分為幾個(gè)部分,分別存儲在MCU不同的位置。
Keil 工程在編譯完之后,會有相應(yīng)的程序所占用的空間提示信息,如下所示:

linking...
Program Size: Code=54872 RO-data=8656 RW-data=764 ZI-data=21812  
After Build - User command #1: fromelf --bin .\build\rtthread-stm32.axf --output rtthread.bin
".\build\rtthread-stm32.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:14

上面提到的 Program Size 包含以下幾個(gè)部分:
1)Code:代碼段,存放程序的代碼部分;
2)RO-data:只讀數(shù)據(jù)段,存放程序中定義的常量;
3)RW-data:讀寫數(shù)據(jù)段,存放初始化為非 0 值的全局變量;
4)ZI-data:0 數(shù)據(jù)段,存放未初始化的全局變量及初始化為 0 的變量;
編譯完工程會生成一個(gè).map 的文件,該文件說明了各個(gè)函數(shù)占用的尺寸和地址,在文件的最后幾行也說明了上面幾個(gè)字段的關(guān)系:

==============================================================================

    Total RO  Size (Code + RO Data)                63528 (  62.04kB)
    Total RW  Size (RW Data + ZI Data)             22576 (  22.05kB)
    Total ROM Size (Code + RO Data + RW Data)      63676 (  62.18kB)

==============================================================================

1)RO Size 包含了 Code 及 RO-data,表示程序占用 Flash 空間的大小;
2)RW Size 包含了 RW-data 及 ZI-data,表示運(yùn)行時(shí)占用的 RAM 的大??;
3)ROM Size 包含了 Code、RO-data 以及 RW-data,表示燒寫程序所占用的 Flash 空間的大??;
程序運(yùn)行之前,需要有文件實(shí)體被燒錄到 STM32 的 Flash 中,一般是 bin 或者 hex 文件,該被燒錄文件稱為可執(zhí)行映像文件。如下圖左邊部分所示,是可執(zhí)行映像文件燒錄到 STM32 后的內(nèi)存分布,它包含 RO 段和 RW 段兩個(gè)部分:其中 RO 段中保存了 Code、RO-data 的數(shù)據(jù),RW 段保存了 RW-data 的數(shù)據(jù),由于 ZI-data 都是 0,所以未包含在映像文件中。
STM32 在上電啟動之后默認(rèn)從 Flash 啟動,啟動之后會將 RW 段中的 RW-data(初始化的全局變量)搬運(yùn)到 RAM 中,但不會搬運(yùn) RO 段,即 CPU 的執(zhí)行代碼從 Flash 中讀取,另外根據(jù)編譯器給出的 ZI 地址和大小分配出 ZI 段,并將這塊 RAM 區(qū)域清零。
RT-Thread內(nèi)核——內(nèi)核基礎(chǔ)(上),RT-Thread,物聯(lián)網(wǎng)
其中動態(tài)內(nèi)存堆為未使用的 RAM 空間,應(yīng)用程序申請和釋放的內(nèi)存塊都來自該空間。而一些全局變量則是存放于 RW 段和 ZI 段中,RW 段存放的是具有初始值的全局變量(而常量形式的全局變量則放置在 RO 段中,是只讀屬性的),ZI 段存放的系統(tǒng)未初始化的全局變量。文章來源地址http://www.zghlxwxcb.cn/news/detail-727341.html

到了這里,關(guān)于RT-Thread內(nèi)核——內(nèi)核基礎(chǔ)(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [嵌入式系統(tǒng)-24]:RT-Thread -11- 內(nèi)核組件編程接口 - 網(wǎng)絡(luò)組件 - TCP/UDP Socket編程

    [嵌入式系統(tǒng)-24]:RT-Thread -11- 內(nèi)核組件編程接口 - 網(wǎng)絡(luò)組件 - TCP/UDP Socket編程

    目錄 一、RT-Thread網(wǎng)絡(luò)組件 1.1 概述 1.2 RT-Thread支持的網(wǎng)絡(luò)協(xié)議棧 1.3?RT-Thread如何選擇不同的網(wǎng)絡(luò)協(xié)議棧 二、Socket編程 2.1 概述 2.2 UDP socket編程 2.3 TCP socket編程 2.4 TCP socket收發(fā)數(shù)據(jù) RT-Thread 是一個(gè)開源的嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS),它提供了豐富的網(wǎng)絡(luò)組件用于網(wǎng)絡(luò)通信。 RT-

    2024年03月12日
    瀏覽(36)
  • RT-Thread 軟件包-物聯(lián)網(wǎng)-網(wǎng)絡(luò)工具集NetUtils使用指南①

    RT-Thread 軟件包-物聯(lián)網(wǎng)-網(wǎng)絡(luò)工具集NetUtils使用指南①

    本文介紹 RT-Thread NetUtils 的使用方法,幫助開發(fā)者更好地使用 RT-Thread NetUtils 組件來解決網(wǎng)絡(luò)開發(fā)過程中遇到的問題。 簡介 在進(jìn)行網(wǎng)絡(luò)相關(guān)的產(chǎn)品開發(fā)和調(diào)試時(shí),一些好用的小工具往往能取到事半功倍的效果。 RT-Thread NetUtils 組件基于此應(yīng)用場景,開發(fā)和封裝了一系列簡潔好

    2024年02月20日
    瀏覽(25)
  • RT-Thread學(xué)習(xí)(一)簡介及基礎(chǔ)環(huán)境配置

    RT-Thread學(xué)習(xí)(一)簡介及基礎(chǔ)環(huán)境配置

    之前學(xué)習(xí)了FreeRTOS,但是一直想深入學(xué)習(xí),但是沒有人指導(dǎo),又不知道該如何學(xué)習(xí),于是再學(xué)習(xí)一個(gè)操作系統(tǒng)看看情況。 RT-Thread是一個(gè)物聯(lián)網(wǎng)操作系統(tǒng),幾乎支持所有主流的MCU和Wi-Fi芯片,實(shí)時(shí)多線程操作系統(tǒng),主要用在32位的MCU上面。物聯(lián)網(wǎng)(Internet Of Things,IoT),RT-Threa

    2024年01月17日
    瀏覽(21)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 4. 線程介紹(理論)

    【STM32&RT-Thread零基礎(chǔ)入門】 4. 線程介紹(理論)

    前文中的最后一個(gè)任務(wù)發(fā)現(xiàn),一個(gè)main()函數(shù)很難同時(shí)實(shí)現(xiàn)按鍵功能和閃燈功能,就好像人很難同時(shí)完成左手畫圓右手畫方一樣,這種情況可以安排一人去畫圓、一人去畫方,并行進(jìn)行就很容易了,兩人各司其職,互不干擾。 操作系統(tǒng)中,一個(gè)線程就像做事的一個(gè)人。一個(gè)操作

    2024年02月12日
    瀏覽(18)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 7. 線程創(chuàng)建應(yīng)用(多線程運(yùn)行機(jī)制)

    【STM32&RT-Thread零基礎(chǔ)入門】 7. 線程創(chuàng)建應(yīng)用(多線程運(yùn)行機(jī)制)

    硬件:STM32F103ZET6、ST-LINK、usb轉(zhuǎn)串口工具、4個(gè)LED燈、1個(gè)蜂鳴器、4個(gè)1k電阻、2個(gè)按鍵、面包板、杜邦線 本章進(jìn)一步研究多線程的運(yùn)行機(jī)制。要求實(shí)現(xiàn)功能如下:創(chuàng)建2個(gè)線程,線程名稱分別為LED和BEEP。兩個(gè)線程的任務(wù)是連續(xù)5次打印本線程的名字后退出線程(注意:線程不執(zhí)行

    2024年02月03日
    瀏覽(30)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 3. PIN設(shè)備(GPIO)的使用

    【STM32&RT-Thread零基礎(chǔ)入門】 3. PIN設(shè)備(GPIO)的使用

    硬件:STM32F103ZET6、ST-LINK、usb轉(zhuǎn)串口工具、4個(gè)LED燈、1個(gè)蜂鳴器、4個(gè)1k電阻、2個(gè)按鍵、面包板、杜邦線 在嵌入式系統(tǒng)中,GPIO是最常用的一種設(shè)備,在RT-Thread操作系統(tǒng)中,把GPIO命名為PIN設(shè)備。 RT-Thread通過PIN設(shè)備對芯片的GPIO引腳進(jìn)行管理,應(yīng)用程序可以通過其提供的一組PIN設(shè)備

    2024年02月13日
    瀏覽(15)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 6. 線程創(chuàng)建應(yīng)用(線程掛起與恢復(fù))

    【STM32&RT-Thread零基礎(chǔ)入門】 6. 線程創(chuàng)建應(yīng)用(線程掛起與恢復(fù))

    硬件:STM32F103ZET6、ST-LINK、usb轉(zhuǎn)串口工具、4個(gè)LED燈、1個(gè)蜂鳴器、4個(gè)1k電阻、2個(gè)按鍵、面包板、杜邦線 在上一個(gè)任務(wù)中,通過停止命令把線程刪除后,線程在系統(tǒng)中就不存在了,也無法再使線程重新運(yùn)行。例如輸入stop_led_thread命令后,led停止閃爍,但也無法重新開啟LED燈閃爍

    2024年02月11日
    瀏覽(16)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 5. 線程創(chuàng)建應(yīng)用(線程創(chuàng)建、刪除、初始化、脫離、啟動、睡眠)

    【STM32&RT-Thread零基礎(chǔ)入門】 5. 線程創(chuàng)建應(yīng)用(線程創(chuàng)建、刪除、初始化、脫離、啟動、睡眠)

    硬件:STM32F103ZET6、ST-LINK、usb轉(zhuǎn)串口工具、4個(gè)LED燈、1個(gè)蜂鳴器、4個(gè)1k電阻、2個(gè)按鍵、面包板、杜邦線 本章主要講線程的工作機(jī)制和管理方法,通過實(shí)例講解如何使用多線程完成多任務(wù)開發(fā)。 RT-Thread用線程控制塊來描述和管理一個(gè)線程,一個(gè)線程對應(yīng)一個(gè)線程控制塊。線程控

    2024年02月12日
    瀏覽(26)
  • RT-Thread 1. GD32移植RT-Thread Nano

    RT-Thread 1. GD32移植RT-Thread Nano

    1. RT-Thread Nano?下載 RT-Thread Nano 是一個(gè)極簡版的硬實(shí)時(shí)內(nèi)核,它是由 C 語言開發(fā),采用面向?qū)ο蟮木幊趟季S,具有良好的代碼風(fēng)格,是一款可裁剪的、搶占式實(shí)時(shí)多任務(wù)的 RTOS。其內(nèi)存資源占用極小,功能包括任務(wù)處理、軟件定時(shí)器、信號量、郵箱和實(shí)時(shí)調(diào)度等相對完整的實(shí)

    2024年02月05日
    瀏覽(29)
  • RT-Thread 7. RT-Thread Studio ENV修改MCU型號

    RT-Thread 7. RT-Thread Studio ENV修改MCU型號

    1. 修改MCU型號 2.在ENV界面輸入 3. dist下為更新后完整源代碼 4.導(dǎo)入RT-Thread Studio 發(fā)現(xiàn)GD32F330已經(jīng)生效了。 5. 自己編寫startup_gd32f3x0.S,準(zhǔn)確性待驗(yàn)證

    2024年02月06日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包