chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT-Thread 遇上 Rust:安全內(nèi)核 RusT-Thread 的誕生

RT-Thread官方賬號(hào) ? 2025-08-02 11:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我們是中國科學(xué)技術(shù)大學(xué)操作系統(tǒng)原理與設(shè)計(jì)(H)課oooooS小組。這個(gè)項(xiàng)目是我們的課程大作業(yè):參考RT-Thread架構(gòu),使用Rust搭建一個(gè)原生的嵌入式操作系統(tǒng)內(nèi)核。初識(shí)Rust是因?yàn)閤k老師的推薦,很快我們就被其極高的安全特性,強(qiáng)大的包管理系統(tǒng)和編譯器以及豐富的社區(qū)支持所折服。然后我們?cè)谡{(diào)研時(shí)注意到了RT-Thread。它有著經(jīng)典的操作系統(tǒng)架構(gòu),卻又在各模塊的設(shè)計(jì)上充滿著巧思,最重要的是,它的社區(qū)支持和文檔支持也非常豐富,這給我們的工作帶來了非常多的便利。所以,在課程結(jié)束后,我們也想做些工作來反哺開源社區(qū),這才有了這篇文章的誕生。囿于本組組員的水平,以下內(nèi)容僅供參考,當(dāng)然也歡迎讀者有任何疑問的話與我們聯(lián)系。

項(xiàng)目地址:https://github.com/OSH-2025/oooooS

小組全體成員: @Piteright , @明日桐奈,@故俗,@LISTOI,@老葵澤

物聯(lián)網(wǎng)嵌入式系統(tǒng)領(lǐng)域,對(duì)功能安全與高可靠性的追求已成為行業(yè)共識(shí),尤其是在資源受限的微控制器MCU)應(yīng)用中。傳統(tǒng)上,這類系統(tǒng)大量依賴C語言開發(fā)的實(shí)時(shí)操作系統(tǒng)(RTOS),通過任務(wù)(線程)作為并發(fā)與隔離的基本單元。然而,C語言固有的內(nèi)存安全缺陷,如緩沖區(qū)溢出、懸垂指針等,使得在協(xié)作式多任務(wù)環(huán)境下,任何一個(gè)組件的微小失誤都可能導(dǎo)致整個(gè)系統(tǒng)的崩潰,這在工業(yè)控制、醫(yī)療設(shè)備、汽車電子等關(guān)鍵領(lǐng)域是不可接受的。開發(fā)者不得不在功能實(shí)現(xiàn)與系統(tǒng)穩(wěn)定性之間艱難權(quán)衡,投入大量精力進(jìn)行防御性編程和冗長的測(cè)試。

RusT-Thread正是在這樣的背景下誕生的。作為一款專為資源受限嵌入式平臺(tái)設(shè)計(jì)的開源實(shí)時(shí)操作系統(tǒng),RusT-Thread 以業(yè)界成熟的 RT-Thread 內(nèi)核理念為藍(lán)本,創(chuàng)新性地采用 Rust語言進(jìn)行全面重構(gòu)。它旨在從根本上解決傳統(tǒng) RTOS 的安全痛點(diǎn),利用 Rust 語言強(qiáng)大的靜態(tài)分析能力,包括所有權(quán)系統(tǒng)、借用檢查和類型安全,將大量潛在的內(nèi)存與并發(fā)錯(cuò)誤在編譯階段徹底消除。通過這種方式,RusT-Thread 致力于在不犧牲性能的前提下,提供一個(gè)輕量級(jí)、高安全性的并發(fā)執(zhí)行環(huán)境。

本文將從項(xiàng)目特色、架構(gòu)設(shè)計(jì)、核心實(shí)現(xiàn)機(jī)制、性能驗(yàn)證等多個(gè)維度,詳細(xì)闡述 RT-Thread 的設(shè)計(jì)理念與實(shí)現(xiàn)方式,展示其如何將 Rust 的現(xiàn)代化語言優(yōu)勢(shì)與實(shí)時(shí)操作系統(tǒng)的經(jīng)典思想相結(jié)合,為嵌入式開發(fā)者提供一個(gè)更安全、更高效的開發(fā)新選擇。


目錄


簡(jiǎn)介


項(xiàng)目特色


架構(gòu)設(shè)計(jì)


分模塊介紹


性能與驗(yàn)證


優(yōu)缺點(diǎn)


總結(jié)與展望

1

簡(jiǎn)介


RusT-Thread是一款基于 RT-Thread 理念,采用 Rust 語言打造的輕量級(jí)實(shí)時(shí)操作系統(tǒng)內(nèi)核,已在ARM Cortex-M4上成功實(shí)現(xiàn),并有望拓展至更多芯片平臺(tái)。

在線程調(diào)度上,它支持多線程創(chuàng)建、調(diào)度及優(yōu)先級(jí)管理,提供多種調(diào)度算法,如優(yōu)先級(jí)、優(yōu)先級(jí) + RR 等。同時(shí),在內(nèi)存分配上支持伙伴系統(tǒng)、小內(nèi)存分配器等多種內(nèi)存分配方式,滿足動(dòng)態(tài)內(nèi)存分配需求。此外,還實(shí)現(xiàn)了高精度定時(shí)器,支持單次和周期定時(shí)功能,并具備完整的異常和中斷處理機(jī)制。

RusT-Thread 的 Rust 實(shí)現(xiàn)保障內(nèi)存安全,模塊化設(shè)計(jì)便于擴(kuò)展和移植,支持資源受限的嵌入式系統(tǒng),為開發(fā)者提供了安全、高效、精簡(jiǎn)的 Rust 原生實(shí)時(shí)操作系統(tǒng)選擇。


2

項(xiàng)目特色


本項(xiàng)目是一個(gè)完全由Rust構(gòu)建的操作系統(tǒng)內(nèi)核。不同于本課程其他小組和前輩們的工作,我們放棄了C和Rust混合編譯改寫操作系統(tǒng)內(nèi)核的開發(fā)路徑,而是選擇從底層開始就用 Rust開發(fā),這種徹底的重構(gòu)能讓我們更好地利用Rust擁有的現(xiàn)代化語言特性,組織起結(jié)構(gòu)更加清晰,功能實(shí)現(xiàn)更加簡(jiǎn)練的代碼。同時(shí),我們還避免了混合編譯過程中的各種操作性問題和潛在的安全性風(fēng)險(xiǎn)。

本項(xiàng)目的架構(gòu)參考RT-Thread nano內(nèi)核實(shí)現(xiàn),在實(shí)現(xiàn)功能模塊時(shí)我們保留了大部分RT-Thread內(nèi)核的接口,確保熟悉RT-Thread內(nèi)核的開發(fā)者能低成本快速上手我們的內(nèi)核。RT-Thread的成功很難離開其眾多貢獻(xiàn)者帶來的豐富軟件包移植,我們希望我們的內(nèi)核也能為 RT-Thread社區(qū)中的Rust開發(fā)者提供一個(gè)底層平臺(tái),可以原生的用Rust實(shí)現(xiàn)各種組件,豐富這個(gè)操作系統(tǒng)的功能。


3

架構(gòu)概述


44f96f94-6f4d-11f0-9080-92fbcf53809c.jpg

RusT-Thread結(jié)構(gòu)

當(dāng)我們著手設(shè)計(jì) RusT-Thread 架構(gòu)時(shí),我們的目標(biāo)并不僅僅是復(fù)刻 RT-Thread,而是要用 Rust 的思想去重塑它。為此,我們將以下幾個(gè)關(guān)鍵原則融入了項(xiàng)目里:

安全性 :借助 Rust 的所有權(quán)系統(tǒng)與借用檢查機(jī)制,從編譯階段就徹底消除內(nèi)存安全隱患。同時(shí),通過其嚴(yán)格的并發(fā)模型有效防止數(shù)據(jù)競(jìng)爭(zhēng),能夠有效提升系統(tǒng)的并發(fā)安全性

可擴(kuò)展性 :我們將整個(gè)系統(tǒng)設(shè)計(jì)為高度模塊化。這種架構(gòu)使得無論是添加新的設(shè)備驅(qū)動(dòng)、文件系統(tǒng),還是集成復(fù)雜的網(wǎng)絡(luò)協(xié)議棧,都變得直觀而高效,為未來的功能拓展留出了充足的空間

性能:充分利用 Rust 的零成本抽象特性,在確保系統(tǒng)安全性的基礎(chǔ)上,對(duì)調(diào)度算法和內(nèi)存管理機(jī)制進(jìn)行深度優(yōu)化,從而全面提升系統(tǒng)的整體性能表現(xiàn)

易移植性:我們采用分層設(shè)計(jì)策略并構(gòu)建清晰的硬件抽象層,簡(jiǎn)化了系統(tǒng)對(duì)不同芯片架構(gòu)的適配過程。目前,該系統(tǒng)已成功支持 ARM Cortex-M4 芯片架構(gòu),未來也許會(huì)逐步擴(kuò)展對(duì)更多類型芯片的支持范圍


4

分模塊介紹


1 內(nèi)核服務(wù)層

內(nèi)核服務(wù)層作為 RusT-Thread 操作系統(tǒng)的核心基礎(chǔ),是連接硬件底層與上層應(yīng)用的關(guān)鍵橋梁,其核心功能及在 Rust 中的實(shí)現(xiàn)方案如下:

錯(cuò)誤處理機(jī)制:采用 Rust 的OptionResult枚舉類型替代傳統(tǒng)錯(cuò)誤碼,通過模式匹配清晰表達(dá)函數(shù)執(zhí)行結(jié)果。在編譯期對(duì)錯(cuò)誤處理邏輯進(jìn)行嚴(yán)格檢查,避免因錯(cuò)誤處理不當(dāng)引發(fā)的問題,確保系統(tǒng)穩(wěn)定運(yùn)行。

內(nèi)存操作函數(shù):利用 Rust 標(biāo)準(zhǔn)庫中的 Core::alloc模塊,結(jié)合自定義的內(nèi)存分配策略和數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)高效靈活的內(nèi)存分配與回收機(jī)制,優(yōu)化內(nèi)存使用效率,確保操作的正確性和安全性。

字符串操作函數(shù):借助 Rust 內(nèi)置的Stringstr類型及其操作方法,實(shí)現(xiàn)功能強(qiáng)大且安全高效的字符串處理功能,有效防止緩沖區(qū)溢出等問題,滿足系統(tǒng)對(duì)文本處理的需求。

格式化輸出功能:結(jié)合cortex_m_semihosting工具庫和 Rust 的格式化字符串宏(format!、println!等),實(shí)現(xiàn)數(shù)據(jù)格式化輸出功能。在QEMU模擬器環(huán)境下,通過半宿主功能將輸出數(shù)據(jù)發(fā)送至宿主機(jī)控制臺(tái),支持多種數(shù)據(jù)類型和輸出格式,滿足調(diào)試和信息展示的需求。

調(diào)試和斷言功能:借助 Rust 的DebugDisplay特性以及assert!、debug_assert!等宏,實(shí)現(xiàn)完善的調(diào)試和斷言功能。為自定義數(shù)據(jù)類型實(shí)現(xiàn)相關(guān)特質(zhì),以便在調(diào)試輸出時(shí)展示詳細(xì)信息;通過斷言條件檢查及時(shí)暴露問題,提高開發(fā)效率。

鏈表實(shí)現(xiàn):利用 Rust 的Vec等標(biāo)準(zhǔn)容器類型,結(jié)合手動(dòng)指針操作和數(shù)據(jù)結(jié)構(gòu)管理邏輯,構(gòu)建高效的鏈表結(jié)構(gòu)。通過存儲(chǔ)節(jié)點(diǎn)指針模擬鏈接關(guān)系,實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)操作,同時(shí)借助所有權(quán)系統(tǒng)和借用檢查機(jī)制確保操作的安全性和正確性。

我們單獨(dú)添加了 Cell 模塊,以更好地適配 Rust 的語言特性。Cell 模塊實(shí)現(xiàn)了一個(gè)中斷安全的共享數(shù)據(jù)容器RTIntrFreeCell,這是 RT-Thread 實(shí)時(shí)操作系統(tǒng)中的核心內(nèi)核服務(wù)組件之一。其核心目的就是在多線程和中斷環(huán)境下提供安全的共享數(shù)據(jù)訪問機(jī)制,通過自動(dòng)禁用和啟用中斷來防止數(shù)據(jù)競(jìng)爭(zhēng),具體體現(xiàn)在以下三個(gè)方面:

1. 中斷安全性:

在訪問共享數(shù)據(jù)時(shí)自動(dòng)調(diào)用rt_hw_interrupt_disable()禁用中斷

訪問結(jié)束后自動(dòng)調(diào)用rt_hw_interrupt_enable()恢復(fù)中斷

確保臨界區(qū)代碼能夠原子性地執(zhí)行,避免數(shù)據(jù)不一致的問題

2. RAII 資源管理:

使用RTIntrRefMut作為智能指針,利用 Rust 的 Drop 特質(zhì)實(shí)現(xiàn)自動(dòng)資源釋放

當(dāng)RTIntrRefMut超出作用域時(shí),自動(dòng)恢復(fù)中斷級(jí)別,降低了手動(dòng)管理資源的風(fēng)險(xiǎn)

3. 靈活的訪問方式:

提供exclusive_access()方法獲取獨(dú)占訪問權(quán)限

提供exclusive_session()方法在閉包中執(zhí)行臨界區(qū)代碼

提供as_ptr()as_mut_ptr()方法獲取原始指針,方便底層操作

提供field_ptr()field_mut_ptr()方法獲取結(jié)構(gòu)體字段的原始指針,增強(qiáng)靈活性

在 RusT-Thread 內(nèi)核中,我們使用這個(gè)核心模塊來保護(hù)那些需要同時(shí)被中斷服務(wù)程序和普通線程訪問的關(guān)鍵數(shù)據(jù),比如線程控制塊(TCB)、調(diào)度器狀態(tài)、定時(shí)器列表以及內(nèi)存管理的內(nèi)部數(shù)據(jù)。RTIntrFreeCell的作用就是提供一個(gè)“中斷鎖”,確保在任何時(shí)候數(shù)據(jù)訪問都是安全的,這對(duì)于保證高并發(fā)下系統(tǒng)的數(shù)據(jù)一致性和整體穩(wěn)定性至關(guān)重要。


2 硬件抽象層

硬件抽象層(hardware)是 RusT-Thread 操作系統(tǒng)在 Cortex-M4 架構(gòu)下的底層硬件支持模 塊,主要負(fù)責(zé) CPU 端口、上下文切換、異常處理和中斷管理等功能,為上層系統(tǒng)提供與硬件緊密相關(guān)的基礎(chǔ)服務(wù)。

硬件抽象層是操作系統(tǒng)的核心組成部分,通過這些模塊,RusT-Thread 能夠?qū)崿F(xiàn)高效、可靠的硬件資源管理和任務(wù)調(diào)度,為上層應(yīng)用提供穩(wěn)定的運(yùn)行環(huán)境。

模塊內(nèi)容如下:

hardware├── context.rs # 線程上下文切換,使用內(nèi)聯(lián)匯編實(shí)現(xiàn)線程上下文保存與恢復(fù)├── cpuport.rs # CPU 接口-Cortex-M4,定義了異常棧幀、棧幀、CPU關(guān)機(jī)、CPU 重啟├── exception.rs # 異常處理相關(guān)函數(shù)├── irq.rs # 中斷管理模塊,提供了中斷嵌套計(jì)數(shù)、鉤子設(shè)置、使能/禁用中斷等功能└── mod.rs # 統(tǒng)合上述模塊,提供對(duì)外接口

上下文切換模塊 (context.rs)

負(fù)責(zé)線程上下文的切換機(jī)制,主要功能包括:

線程上下文的保存與恢復(fù)

PendSV 中斷處理(實(shí)際執(zhí)行上下文切換)

提供rt_hw_context_switch、rt_hw_context_switch_interruptrt_hw_context_switch_to等上下文切換處理函數(shù)

實(shí)現(xiàn)線程間的高效切換,是多線程調(diào)度的核心機(jī)制

CPU 端口模塊 (cpuport.rs)

提供與 CPU 硬件直接相關(guān)的底層支持:

定義異常棧幀ExceptionStackFrame和棧幀StackFrame結(jié)構(gòu)

實(shí)現(xiàn)線程棧初始化函數(shù)rt_hw_stack_init

提供 CPU 關(guān)機(jī)rt_hw_cpu_shutdown和重啟rt_hw_cpu_reset等功能

可選的 FPU 支持(浮點(diǎn)運(yùn)算單元)

中斷管理模塊 (irq.rs)

實(shí)現(xiàn)中斷處理相關(guān)的功能:

中斷嵌套計(jì)數(shù)管理

提供中斷使能/禁用函數(shù)rt_hw_interrupt_disable/enable

中斷進(jìn)入/退出處理rt_interrupt_enter/leave

支持中斷鉤子函數(shù)設(shè)置(通過特性開關(guān)控制

獲取中斷嵌套層數(shù)rt_interrupt_get_nest

異常處理模塊 (exception.rs)

負(fù)責(zé)處理系統(tǒng)運(yùn)行中的各種異常:

提供硬件錯(cuò)誤處理(HardFault、MemManage、BusFault、UsageFault)

異常信息收集與輸出

支持異常鉤子機(jī)制rt_hw_exception_install

詳細(xì)的故障跟蹤與診斷功能


3進(jìn)程調(diào)度層

作為 RusT-Thread 操作系統(tǒng)的核心,進(jìn)程調(diào)度層負(fù)責(zé)管理和調(diào)度所有線程,確保它們能夠高效、公平地共享處理器資源,實(shí)現(xiàn)并發(fā)執(zhí)行,核心職責(zé)如下:

任務(wù)調(diào)度:依據(jù)預(yù)設(shè)調(diào)度策略,決定處理器執(zhí)行權(quán)的分配,保障高優(yōu)先級(jí)任務(wù)的及時(shí)響 應(yīng),同時(shí)兼顧任務(wù)的公平執(zhí)行。支持多種調(diào)度算法,具備靈活適應(yīng)不同應(yīng)用場(chǎng)景和實(shí)時(shí)性要求的能力

調(diào)度算法選擇 :提供優(yōu)先級(jí)調(diào)度算法(如優(yōu)先級(jí) + 時(shí)間片輪轉(zhuǎn))和多級(jí)反饋隊(duì)列調(diào)度算法等,用戶可根據(jù)實(shí)際需求靈活選擇調(diào)度算法,滿足不同任務(wù)對(duì)實(shí)時(shí)性和資源分配的需求

線程 API 接口 :為用戶提供了一系列豐富的接口,使用戶能夠更加便捷地對(duì)線程狀態(tài)進(jìn)行調(diào)整和控制,例如創(chuàng)建、刪除、掛起、恢復(fù)線程等操作,同時(shí)提供了獲取和設(shè)置線程屬性的接口,方便用戶根據(jù)實(shí)際需求對(duì)線程進(jìn)行精細(xì)化管理

45091624-6f4d-11f0-9080-92fbcf53809c.jpg

調(diào)度策略抽象 :通過定義 SchedulingPolicy特質(zhì),將多種調(diào)度算法封裝和抽象。以優(yōu)先級(jí)調(diào)度算法為例,實(shí)現(xiàn)了相應(yīng)的結(jié)構(gòu)體,包含線程優(yōu)先級(jí)隊(duì)列管理和時(shí)間片分配與輪轉(zhuǎn)機(jī)制;對(duì)于多級(jí)反饋隊(duì)列調(diào)度算法,設(shè)計(jì)了多級(jí)隊(duì)列數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)了任務(wù)根據(jù)執(zhí)行時(shí)間動(dòng)態(tài)調(diào)整隊(duì)列級(jí)別的邏輯?;谔刭|(zhì)的抽象方式使調(diào)度策略切換靈活,用戶在初始化時(shí)指定調(diào)度策略后,調(diào)度器即可根據(jù)具體實(shí)現(xiàn)執(zhí)行調(diào)度操作

/// 調(diào)度策略 traitpub traitSchedulingPolicy:Send+Sync{ /// 選擇下一個(gè)要運(yùn)行的線程 /// /// # 參數(shù) /// * `current_thread` - 當(dāng)前運(yùn)行的線程 /// /// # 返回值 /// * `Option<(Arc, bool)>` - (選中的線程, 是否需要將原線程重新插入就緒隊(duì)列) fn select_next_thread( &self, current_thread:&Option>, )->Option<(Arc, bool)>; /// 獲取策略名稱 fn get_policy_name(&self) ->&'staticstr;}

調(diào)度算法優(yōu)化 :引入位圖 + FFS(Find First Set)算法提升調(diào)度效率。位圖標(biāo)識(shí)各優(yōu)先級(jí)隊(duì)列的線程就緒狀態(tài),通過 FFS 算法快速定位最高優(yōu)先級(jí)隊(duì)列中的首個(gè)就緒線程。FFS 算法借助預(yù)計(jì)算查找表,將復(fù)雜位運(yùn)算轉(zhuǎn)化為簡(jiǎn)單數(shù)組訪問,實(shí)現(xiàn) O(1) 時(shí)間復(fù)雜度的最高優(yōu)先級(jí)線程查找,顯著提升調(diào)度器響應(yīng)速度和實(shí)時(shí)性能,確保系統(tǒng)及時(shí)響應(yīng)高優(yōu)先級(jí)任務(wù)

#[cfg(feature = "tiny_ffs")]const__LOWEST_BIT_BITMAP: [u8;37] = [ 0,1,2,27,3,24,28,32,4,17,25,31,29,12,32,14, 5,8,18,32,26,23,32,16,30,11,13,7,32,22,15,10, 6,21,9,20,19];
#[cfg(feature = "tiny_ffs")]pubfn__rt_ffs(value: u32) ->u8{ ifvalue ==0{ return0; } __LOWEST_BIT_BITMAP[((value & (value -1) ^ value) %37)asusize]}

該算法利用預(yù)計(jì)算查找表和數(shù)學(xué)運(yùn)算避免復(fù)雜位運(yùn)算循環(huán),實(shí)現(xiàn)了快速最低有效位查找。它專為嵌入式環(huán)境優(yōu)化,在資源受限設(shè)備上也能快速執(zhí)行,滿足實(shí)時(shí)系統(tǒng)低延遲要求。能快速確定線程就緒隊(duì)列中最高優(yōu)先級(jí)線程,確保調(diào)度器及時(shí)響應(yīng)高優(yōu)先級(jí)任務(wù),提升系統(tǒng)實(shí)時(shí)性和性能。

多級(jí)反饋隊(duì)列調(diào)度實(shí)現(xiàn) :在多級(jí)反饋隊(duì)列調(diào)度算法中,引入老化機(jī)制,使長期未被調(diào)度的線程逐漸升高優(yōu)先級(jí),防止低優(yōu)先級(jí)線程饑餓,增強(qiáng)調(diào)度算法公平性和適應(yīng)性。實(shí)現(xiàn)過程中,借助 Rust 語言零成本抽象特性,優(yōu)化代碼實(shí)現(xiàn),提升系統(tǒng)穩(wěn)定性和可維護(hù)性。


4 內(nèi)存管理層

在 RusT-Thread 中,我們實(shí)現(xiàn)了原本 RT-Thread 中的小內(nèi)存分配器,同時(shí)并支持了庫實(shí)現(xiàn)的buddy_system allocatorgood_memory allocator,可供用戶在實(shí)際場(chǎng)景中自由選擇,下面將對(duì)小內(nèi)存分配器作具體分析:

RusT-Thread 中的小內(nèi)存分配器主要體現(xiàn)在如下幾個(gè)文件中:

small_mem_impl.rs:核心算法實(shí)現(xiàn)

small_mem_allocator.rs、allocator.rs:分配器接口與適配

object.rs、safelist.rs:輔助對(duì)象和安全鏈表

oom.rs:內(nèi)存溢出處理

451df3be-6f4d-11f0-9080-92fbcf53809c.jpg

表示內(nèi)存塊的結(jié)構(gòu)體:

///RTSmallMemItem 結(jié)構(gòu)體表示一個(gè)小內(nèi)存塊的基本信息,主要用于管理內(nèi)存池中的單個(gè)內(nèi)存塊#[repr(c)]pub structRTSmallMemItem { ///內(nèi)存池指針 pub pool ptr: usize, #[cfg(target_pointer_width="64")]// 條件編譯,64位系統(tǒng)生效 pub resv:u32,//保留字段,用于對(duì)齊,64位系統(tǒng)下使用 ///下一個(gè)空閑塊的指針 pub next: usize, ///前一個(gè)空閑塊的指針 pub prev: usize, #[cfg(feature ="mem_trace")]//條件編譯,內(nèi)存跟蹤生效 #[cfg(target pointer_width="64")]//條件編譯,64位系統(tǒng)生效 pub thread:[u8;8],//線程ID,64位系統(tǒng)下使用 #[cfg(feature="mem_trace")]//條件編譯,內(nèi)存跟蹤生效 #[cfg(target pointer_width ="32")]//條件編譯,32位系統(tǒng)生效 pub thread:[u8;4],//線程ID,32位系統(tǒng)下使用}

小內(nèi)存分配算法的原理是通過維護(hù)一塊連續(xù)的內(nèi)存池,將其劃分為帶有頭部信息的內(nèi)存塊,并用鏈表管理空閑和已用塊。分配時(shí)遍歷空閑鏈表,找到足夠大的塊后分割并標(biāo)記為已用;釋放時(shí)將塊標(biāo)記為空閑,并嘗試與相鄰空閑塊合并以減少碎片。整個(gè)過程包含邊界檢查和中斷保護(hù),確保分配、釋放的安全性和原子性。

除了實(shí)現(xiàn)基本的小內(nèi)存算法外,我們還有如下亮點(diǎn):

邊界檢查與安全性提升

C 代碼主要依賴 RT_ASSERT 等宏進(jìn)行運(yùn)行時(shí)斷言,且大量裸指針操作,容易出現(xiàn)懸垂指針、越界、重復(fù)釋放等問題,這些斷言如果被關(guān)閉,代碼安全性大幅下降

debug_assert!((memasusize) >= ((*small_mem).heap_ptrasusize)); debugassert!((memasusize) < ((*small_mem).heap_end?as?usize));? debug?assert!(mem?is?used(mem));if?m.is_null()||size ==?0?{? ? return?ptr::null mut();? }

Rust 利用類型系統(tǒng)和所有權(quán)機(jī)制,天然防止了大部分內(nèi)存安全問題,同時(shí) rt_smem_free、rt_smem_alloc 等函數(shù)在操作前都做了空指針和邊界檢查

Rust 的 debug_assert! 只在 debug 模式下生效,release 下可關(guān)閉,但類型系統(tǒng)和生命周期機(jī)制依然提供了額外的安全保障

許多輔助函數(shù)(如 mem_is_used、mem_pool 等)都用 inline 和類型安全的方式實(shí)現(xiàn),減少了手動(dòng)錯(cuò)誤

中斷保護(hù)

C 語言通過rt_hw_interrupt_disable/rt_hw_interrupt_enable 手動(dòng)保護(hù)關(guān)鍵區(qū),防止并發(fā)破壞堆結(jié)構(gòu)

rt_base_t_level =rt_hw_interrupt_disable(); // ...關(guān)鍵區(qū). rt_hw_interrupt_enable(level);

Rust 同樣調(diào)用rt_hw_interrupt_disable/rt_hw_interrupt_enable,但更易于用 RAII(資源自動(dòng)釋放)等機(jī)制進(jìn)行封裝,減少人為失誤

letlevel =rt_hw_interrupt_disable();//...關(guān)鍵區(qū) ... rt_hw_interrupt_enable(level);

并且 Rust 代碼結(jié)構(gòu)更清晰,便于后續(xù)用 RAII 或作用域自動(dòng)恢復(fù)中斷,提升健壯性


5 線程通信

進(jìn)程間通信(IPC)是多任務(wù)操作系統(tǒng)中各個(gè)任務(wù)之間進(jìn)行數(shù)據(jù)交換和協(xié)同工作的重要手段。我們的 RusT - Thread 提供了信號(hào)量機(jī)制,而消息隊(duì)列、郵箱等作為拓展,我們尚未支持。

信號(hào)量工作示意圖如下圖所示,每個(gè)信號(hào)量對(duì)象都有一個(gè)信號(hào)量值和一個(gè)線程等待隊(duì)列,通過信號(hào)量的值是否為零,決定線程是否可以訪問臨界區(qū)的資源,當(dāng)信號(hào)量實(shí)例數(shù)目為零時(shí),再申請(qǐng)?jiān)撔盘?hào)量的線程就會(huì)被掛起在該信號(hào)量的等待隊(duì)列上,等待可用的資源。

453327d4-6f4d-11f0-9080-92fbcf53809c.jpg

在 RT-Thread 中,信號(hào)量相關(guān)操作有以下函數(shù)——?jiǎng)?chuàng)建、刪除、獲取、釋放,我們實(shí)現(xiàn)的思路和 C 類似,先實(shí)現(xiàn) ipc 的基礎(chǔ)操作,如_ipc_list_suspend掛起線程,_ipc_list_resume喚醒線程等等,然后,通過信號(hào)量的值,選擇不同的操作,實(shí)現(xiàn)信號(hào)量的相關(guān)操作即可。

4548104a-6f4d-11f0-9080-92fbcf53809c.jpg


6 時(shí)鐘控制層

時(shí)鐘節(jié)拍的產(chǎn)生

時(shí)鐘節(jié)拍由配置為中斷觸發(fā)模式的硬件定時(shí)器產(chǎn)生,當(dāng)中斷到來時(shí),將調(diào)用一次rt_tick_increase()函數(shù),通知操作系統(tǒng)已經(jīng)過去一個(gè)系統(tǒng)時(shí)鐘;不同硬件定時(shí)器中斷實(shí)現(xiàn)都不同,Rust_Thread 的中斷函數(shù)是在 QEMU 模擬器上的 stm32 系列單片機(jī)上實(shí)現(xiàn)的,具體的,程序中將使用#[exception]一個(gè)中斷處理函數(shù)SysTick(),在其中調(diào)用rt_tick_increase()函數(shù)。

在 Rust-Thread系統(tǒng)中,使用常數(shù) RT_TICK_PER_SECOND 控制時(shí)鐘周期長度。本系統(tǒng)中默認(rèn)主頻是 16MHZ,是通過 QEMU 模擬芯片內(nèi)部高速振蕩器實(shí)現(xiàn)的,默認(rèn) RT_TICK_PER_SECOND=1000,即一個(gè)時(shí)鐘周期 16000 個(gè)硬件周期。

時(shí)鐘中斷的管理

時(shí)鐘中斷管理核心函數(shù)rt_tick_increase()主要完成以下工作:

將全局變量RT_TICK 自增,這個(gè)變量記錄了系統(tǒng)從初始化到當(dāng)前經(jīng)過了多少個(gè)時(shí)鐘周期,叫做系統(tǒng)時(shí)間。

檢查當(dāng)前線程的時(shí)間片是否到期,若到期,則觸發(fā)線程調(diào)度

檢查是否有定時(shí)器到期,如果有,觸發(fā)定時(shí)器超時(shí)函數(shù)

時(shí)鐘管理中還包括系統(tǒng)時(shí)間的讀取和設(shè)定函數(shù),毫秒數(shù)和時(shí)鐘周期數(shù)的轉(zhuǎn)換函數(shù)等功能函數(shù)。

定時(shí)器的管理

RT-Thread 的定時(shí)器由定時(shí)器控制塊RtTimer控制,定時(shí)器控制塊全部在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存并按照超時(shí)時(shí)間升序掛載在動(dòng)態(tài)數(shù)組TIMERS中。定時(shí)器的管理主要包括定時(shí)器的創(chuàng)建、激活、修改、超時(shí)與停止。

創(chuàng)建:使用new方法創(chuàng)建,體現(xiàn)了面向?qū)ο蟮乃枷?/p>

激活:計(jì)算超時(shí)時(shí)刻,通過二分查找插入TIMERS數(shù)組,保證有序性

修改:使用enum封裝所有修改操作(如周期、定時(shí)值),符合 Rust 風(fēng)格且易于擴(kuò)展。修改在下次激活時(shí)生效

超時(shí):通過二分查找高效定位到期的定時(shí)器,執(zhí)行回調(diào)。周期性定時(shí)器會(huì)自動(dòng)重新激活,單次定時(shí)器則被移除

停止:TIMERS數(shù)組中移除并回收定時(shí)器


5

性能與驗(yàn)證


1 內(nèi)存性能測(cè)試

原生的 RT-Thread 官方并沒有給出一些具體的有關(guān)內(nèi)存性能的數(shù)據(jù),所以這里我們參照標(biāo)準(zhǔn)的 std 庫來比較分析 RusT-Thread 的性能。

我們?cè)?Linux(x86_64)平臺(tái)下,使用 Rust 重新實(shí)現(xiàn)了 RusT-Thread 的完全相同的內(nèi)存管理模塊,并對(duì)其進(jìn)行了適當(dāng)?shù)姆庋b,并使其接口與原系統(tǒng)保持一致。這樣,我們就可以在支持 std 庫和Criterion基準(zhǔn)測(cè)試框架的環(huán)境下,對(duì)內(nèi)存分配、釋放等核心操作進(jìn)行高效、可重復(fù)的性能測(cè)試,并與 Rust 標(biāo)準(zhǔn)庫分配器進(jìn)行公平對(duì)比。

測(cè)試代碼使用 Criterion 框架實(shí)現(xiàn),測(cè)試內(nèi)容包括小塊分配、混合分配、碎片處理、內(nèi)存利用率等多種典型場(chǎng)景

這種方法雖然不能完全反映嵌入式平臺(tái)的絕對(duì)性能,但可以有效比較不同分配算法的相對(duì)性能,為實(shí)際部署和優(yōu)化提供有價(jià)值的參考

具體測(cè)試結(jié)果如下:

4559248e-6f4d-11f0-9080-92fbcf53809c.jpg

該圖展示了 RusT-Thread 與標(biāo)準(zhǔn)分配器在進(jìn)行小塊內(nèi)存分配和混合內(nèi)存分配時(shí)的性能表現(xiàn):

Small Allocations 中,RusT-Thread 平均耗時(shí)約為 24.6μs,明顯優(yōu)于std的 77.7μs,表明 RusT-Thread 在頻繁的小對(duì)象分配中具有更低的管理開銷

Mixed Allocations 中,標(biāo)準(zhǔn)分配器表現(xiàn)優(yōu)異,耗時(shí)僅約 5.7μs,而 RusT-Thread 則為 31.4μs,可能是由于 RusT-Thread 對(duì)變長內(nèi)存塊的處理不如標(biāo)準(zhǔn)庫靈活高效

RusT-Thread 在固定小塊內(nèi)存操作中具有優(yōu)勢(shì),但在面對(duì)內(nèi)存尺寸變化復(fù)雜的情況時(shí)性能下降。不過這同時(shí)也嶄展現(xiàn)出不同應(yīng)用場(chǎng)景中,RusT-Thread 中小內(nèi)存分配算法的性能更加穩(wěn)定。


45681372-6f4d-11f0-9080-92fbcf53809c.jpg

該圖展示了在逐步增加內(nèi)存塊大小的條件下,RusT-Thread 和標(biāo)準(zhǔn)分配器的單次分配耗時(shí)變化趨勢(shì):

RusT-Thread 的分配時(shí)間基本穩(wěn)定在 7~8ns 范圍內(nèi),說明其設(shè)計(jì)對(duì)小中等大小塊分配進(jìn)行了優(yōu)化處理,性能幾乎不受塊大小影響

標(biāo)準(zhǔn)分配器的耗時(shí)隨著塊大小增加而變化更為劇烈,例如從 16B 的約 24ns 上升到 2048B時(shí)超過 47ns,說明其可能使用了更復(fù)雜的分配策略或存在內(nèi)存對(duì)齊開銷

可見,RusT-Thread 分配器的響應(yīng)速度更穩(wěn)定,適用于內(nèi)存塊尺寸變化不大的嵌入式任務(wù)場(chǎng)景。


457b2d68-6f4d-11f0-9080-92fbcf53809c.jpg

本圖對(duì)比了在進(jìn)行批量?jī)?nèi)存分配(10、100、1000 次)時(shí),兩種分配器的平均耗時(shí):

RusT-Thread 在 10~100 次批量分配中僅需 17μs 左右,而標(biāo)準(zhǔn)分配器耗時(shí)逐步上升到 60μs 以上

差距在批量操作中進(jìn)一步放大,表明 RusT-Thread 的批處理性能更優(yōu),內(nèi)部結(jié)構(gòu)對(duì)頻繁申請(qǐng)釋放有較強(qiáng)的適應(yīng)性

可以看出,RusT-Thread 分配器在多次重復(fù)分配的密集型任務(wù)中更具優(yōu)勢(shì),特別適用于任務(wù)頻繁上下文切換或數(shù)據(jù)緩沖場(chǎng)景。


458795f8-6f4d-11f0-9080-92fbcf53809c.jpg

該圖展示了常見四種內(nèi)存重分配路徑(如 64→128, 128→64, 64→256, 256→64)下的耗時(shí)比較:

所有場(chǎng)景中 RusT-Thread 的耗時(shí)都遠(yuǎn)低于標(biāo)準(zhǔn)分配器,例如 128→64 僅約 12.95ns,而標(biāo)準(zhǔn)庫約 89.6ns

表明 RusT-Thread 分配器可能采用就地?cái)U(kuò)展或快速搬遷機(jī)制,避免了額外的復(fù)制和元信息更新開銷

所以,RusT-Thread 對(duì) reallocation 操作進(jìn)行了優(yōu)化,在需要?jiǎng)討B(tài)改變內(nèi)存塊大小的場(chǎng)景中表現(xiàn)更加出色,這使得對(duì)于真實(shí)環(huán)境中的復(fù)雜情況的處理會(huì)更加優(yōu)秀。


2 模塊驗(yàn)證測(cè)試

測(cè)試部分代碼結(jié)構(gòu)如下:

RusT-thread/src/test├── README.md├── comprehensive_example.rs├── example.rs├── example_mfq.rs├── integration_test.rs├── mod.rs├── performance_test.rs├── switch_time_test.rs├── test_all.rs├── test_cell.rs├── test_excp.rs├── test_interupt.rs├── test_ipc.rs├── test_mem.rs├── test_scheduler.rs├── test_small_mem.rs├── test_thread.rs└── test_timer.rs


3 單元測(cè)試

我們?yōu)楦鱾€(gè)模塊編寫了詳細(xì)的單元測(cè)試用例,對(duì)模塊的功能進(jìn)行充分驗(yàn)證。例如,對(duì)線程管理模塊,測(cè)試了線程的創(chuàng)建、啟動(dòng)、掛起、恢復(fù)、刪除等基本操作,以及不同調(diào)度策略下的線程切換和優(yōu)先級(jí)管理;對(duì)內(nèi)存管理模塊,測(cè)試了內(nèi)存的分配、釋放、重分配等操作以及對(duì)標(biāo)準(zhǔn) alloc 的容器支持;對(duì)定時(shí)器模塊,測(cè)試了定時(shí)器的創(chuàng)建、啟動(dòng)、停止、重啟等操作,以及定時(shí)器回調(diào)函數(shù)的執(zhí)行等


4 集成測(cè)試

在模塊間集成測(cè)試中,我們重點(diǎn)關(guān)注各模塊協(xié)作及系統(tǒng)整體功能正確性,設(shè)計(jì)了以下典型測(cè)試場(chǎng)景:

并發(fā)性測(cè)試

并發(fā)線程創(chuàng)建:多線程同時(shí)創(chuàng)建 RT-Thread 線程,驗(yàn)證線程管理安全性

優(yōu)先級(jí)調(diào)度驗(yàn)證:創(chuàng)建不同優(yōu)先級(jí)線程并記錄執(zhí)行順序,確保調(diào)度器優(yōu)先級(jí)語義正確

內(nèi)存碎片化測(cè)試:模擬復(fù)雜內(nèi)存分配釋放場(chǎng)景,驗(yàn)證內(nèi)存管理器健壯性

壓力測(cè)試

大規(guī)模線程創(chuàng)建:創(chuàng)建 100 個(gè)線程同時(shí)運(yùn)行,測(cè)試系統(tǒng)高負(fù)載穩(wěn)定性

內(nèi)存分配壓力測(cè)試:進(jìn)行 1000 次隨機(jī)大小內(nèi)存分配釋放,驗(yàn)證內(nèi)存管理器性能

定時(shí)器密集測(cè)試:創(chuàng)建 50 個(gè)定時(shí)器同時(shí)運(yùn)行,測(cè)試時(shí)鐘系統(tǒng)處理能力

邊界條件和錯(cuò)誤處理

邊界值測(cè)試:測(cè)試最小 / 最大優(yōu)先級(jí)、最小內(nèi)存分配、零大小分配等邊界情況

錯(cuò)誤場(chǎng)景模擬:測(cè)試重復(fù)啟動(dòng)線程、重復(fù)掛起線程、無效線程 ID 等異常處理

資源耗盡測(cè)試:模擬內(nèi)存不足等資源耗盡場(chǎng)景,驗(yàn)證系統(tǒng)錯(cuò)誤處理機(jī)制

系統(tǒng)穩(wěn)定性測(cè)試

長時(shí)間運(yùn)行測(cè)試:驗(yàn)證系統(tǒng)長期穩(wěn)定性


5 性能基準(zhǔn)測(cè)試

為驗(yàn)證 RusT-Thread 的實(shí)時(shí)性能,我們?cè)O(shè)計(jì)了針對(duì) RTOS 核心指標(biāo)的性能基準(zhǔn)測(cè)試體系。測(cè)試重點(diǎn)關(guān)注時(shí)間確定性和系統(tǒng)響應(yīng)的可預(yù)測(cè)性,這是實(shí)時(shí)操作系統(tǒng)區(qū)別于通用操作系統(tǒng)的關(guān)鍵特征。我們選擇了四項(xiàng)核心指標(biāo)進(jìn)行評(píng)估:中斷延時(shí)測(cè)試驗(yàn)證系統(tǒng)對(duì)外部事件的響應(yīng)速度,響應(yīng)時(shí)間測(cè)試評(píng)估任務(wù)調(diào)度的實(shí)時(shí)性,上下文切換時(shí)間測(cè)試衡量線程切換效率,線程啟動(dòng)時(shí)間測(cè)試檢驗(yàn)系統(tǒng)資源分配性能。這些測(cè)試不僅幫助我們發(fā)現(xiàn)性能瓶頸和優(yōu)化空間,更重要的是為系統(tǒng)的實(shí)時(shí)性保證提供了量化依據(jù),確保 RusT-Thread 能夠滿足嵌入式和工業(yè)控制應(yīng)用的嚴(yán)格時(shí)間要求。

中斷延時(shí)測(cè)試

我們利用 Cortex-M 內(nèi)核自帶的 SysTick(系統(tǒng)滴答定時(shí)器)來精確測(cè)量中斷延時(shí)。SysTick本質(zhì)上是一個(gè) 24 位的硬件自減計(jì)數(shù)器。其工作原理如下:

計(jì)數(shù)與觸發(fā):計(jì)數(shù)器以系統(tǒng)時(shí)鐘頻率從一個(gè)預(yù)設(shè)的重載值(Reload Value)開始遞減。當(dāng)計(jì)數(shù)值從 1 減到 0 時(shí),硬件會(huì)立即觸發(fā) SysTick 中斷

自動(dòng)重載:在觸發(fā)中斷的同一時(shí)鐘周期,硬件會(huì)自動(dòng)將重載值重新加載到計(jì)數(shù)器中,使其無縫開始下一輪遞減,整個(gè)過程無需任何軟件干預(yù)

由于中斷服務(wù)程序的執(zhí)行會(huì)存在微小的延遲,而 SysTick 計(jì)數(shù)器在此期間并未停止。因此,我們可以在中斷服務(wù)程序的入口處,立即讀取此刻 SysTick 計(jì)數(shù)器的當(dāng)前值。通過這個(gè)差 值,我們就能精確計(jì)算出中斷延時(shí)。計(jì)算公式為:

4592f65a-6f4d-11f0-9080-92fbcf53809c.png

我們系統(tǒng)測(cè)得 1000 次平均中斷延時(shí)為 1.21us

響應(yīng)時(shí)間測(cè)試

事件響應(yīng)時(shí)間是指從事件發(fā)生到系統(tǒng)完成相應(yīng)處理的總時(shí)間,包括事件檢測(cè)、任務(wù)調(diào)度和執(zhí)行處理邏輯的全過程。此指標(biāo)衡量了系統(tǒng)對(duì)外部事件的端到端處理能力,是評(píng)估實(shí)時(shí)操作系統(tǒng)性能的綜合指標(biāo)。

在我們的測(cè)試中,使用隨機(jī)數(shù)生成器模擬事件的隨機(jī)生成,每隔相同時(shí)間生成一個(gè)隨機(jī)數(shù)并于一個(gè)給定的概率值比較,當(dāng)小于此概率值時(shí),就生成一個(gè)事件,此事件的優(yōu)先級(jí)也為隨機(jī)數(shù),可以證明,事件的間隔服從泊松分布。

我們將事件分為三種優(yōu)先級(jí):高中低,同時(shí)創(chuàng)建三個(gè)不同優(yōu)先級(jí)的處理程序來處理事件,測(cè)量平均響應(yīng)時(shí)間和各優(yōu)先級(jí)的響應(yīng)時(shí)間,結(jié)果如下:

45a4710a-6f4d-11f0-9080-92fbcf53809c.jpg

一般硬實(shí)時(shí)操作系統(tǒng)響應(yīng)時(shí)間的指標(biāo)為:

| 優(yōu)先級(jí) | 高 | 中 | 低 ||:----------: | |:--: | ||響應(yīng)時(shí)間(us)|1~5 |5~20|20~100|

可以看到我們?nèi)N優(yōu)先級(jí)事件的響應(yīng)時(shí)間均符合硬實(shí)時(shí)操作系統(tǒng)的要求。

上下文切換時(shí)間測(cè)試

上下文切換時(shí)間是指操作系統(tǒng)從一個(gè)線程切換到另一個(gè)線程所需的時(shí)間,包括保存當(dāng)前線程狀態(tài)和恢復(fù)目標(biāo)線程狀態(tài)的過程。該指標(biāo)對(duì)多任務(wù)系統(tǒng)的整體性能有顯著影響,它決定了系統(tǒng)在任務(wù)間切換的效率。上下文切換時(shí)間越短,系統(tǒng)在高負(fù)載下的響應(yīng)性越好,尤其在資源受限的嵌入式系統(tǒng)中,高效的上下文切換能顯著提高處理器利用率和系統(tǒng)吞吐量。

我們測(cè)試了兩個(gè)相同優(yōu)先級(jí)線程來回切換 5000 次的平均時(shí)間,并執(zhí)行了 100 次這樣的測(cè)試,求的線程切換的時(shí)間性能如下:

45b1805c-6f4d-11f0-9080-92fbcf53809c.jpg

線程創(chuàng)建時(shí)間測(cè)試

線程創(chuàng)建時(shí)間是指從發(fā)起創(chuàng)建線程請(qǐng)求到新線程可以被調(diào)度執(zhí)行所需的時(shí)間。該指標(biāo)反映了系統(tǒng)動(dòng)態(tài)資源分配和任務(wù)管理的效率。在需要頻繁創(chuàng)建臨時(shí)任務(wù)的應(yīng)用場(chǎng)景中(如 Web 服務(wù)器、動(dòng)態(tài)負(fù)載系統(tǒng)),高效的線程創(chuàng)建機(jī)制可以顯著降低系統(tǒng)開銷,提高資源利用率。對(duì)于嵌入式實(shí)時(shí)系統(tǒng),快速的線程創(chuàng)建能力也有助于系統(tǒng)在運(yùn)行時(shí)更靈活地調(diào)整工作負(fù)載,適應(yīng)變化的環(huán)境需求。

由于 flash 大小限制,單次測(cè)試創(chuàng)建 50 個(gè)線程的平均時(shí)間,再做 100 次測(cè)試求平均,得到測(cè)試結(jié)果如下:

45c5b900-6f4d-11f0-9080-92fbcf53809c.png

與 RT-Thread 性能對(duì)比

RT-Thread 官方給出了他們的性能測(cè)試結(jié)果如下圖:

45d8db5c-6f4d-11f0-9080-92fbcf53809c.jpg

其測(cè)試基于的硬件平臺(tái)是 Zynq 7020,該開發(fā)板的主頻為 800MHz,而我們使用的 QEMU模擬的是 stm32f405 的開發(fā)板,主頻為 168MHz ,在對(duì)比性能時(shí)應(yīng)考慮相關(guān)的硬件資源。

| 指標(biāo) |RT-Thread|Rust-Thread| 折合后的等效時(shí)間 ||:------------: | |:---------: | || 中斷延時(shí)(ns) | 321 | 1210 | 254 || 上下文切換(us) | 0.633 | 2.58 | 0.542 || 線程創(chuàng)建(us) | 2.969 | 2.60 | 0.546 |

綜上,我們重寫后的 RusT-Thread 操作系統(tǒng)的實(shí)時(shí)性與 RT-Thread 相當(dāng)甚至更加優(yōu)秀,這符合我們當(dāng)初制定的性能提升的目標(biāo)。


6

優(yōu)缺點(diǎn)


1 優(yōu)點(diǎn)

安全導(dǎo)向的設(shè)計(jì)語言。Rust 的所有權(quán)機(jī)制使得 RusT-Thread 操作系統(tǒng)在內(nèi)存安全和并發(fā)安全上很有優(yōu)勢(shì)

高度模塊化并且可以定制。在搭建 RusT-Thread 操作系統(tǒng)時(shí),我們基于 Rust 語言特性,建立了可模塊化的系統(tǒng)倉庫,定義改寫模塊方便快捷

平臺(tái)具備高度可擴(kuò)展性,雖然目前僅支持 Cortex-M4 平臺(tái),但模塊化的 Hardware 利于后續(xù)擴(kuò)展平臺(tái)

多樣的算法特性選擇。在線程調(diào)度上提供多種調(diào)度算法,如優(yōu)先級(jí)、優(yōu)先級(jí) + RR 等;在內(nèi)存管理上支持伙伴系統(tǒng)、小內(nèi)存分配器等多種內(nèi)存分配方式

性能優(yōu)秀。在 Rust 改寫后的系統(tǒng)線程上下文切換性能與原 C 程序性能相當(dāng)

測(cè)試點(diǎn)豐富。我們對(duì)各個(gè)模塊開發(fā)了功能測(cè)試程序,利于后續(xù)的調(diào)試開發(fā)


2 缺點(diǎn)

相關(guān)文檔尚不完善。由于時(shí)間精力,我們暫未維護(hù)起完善的文檔體系

Rust 所有權(quán)機(jī)制等致使代碼可讀性差。為開發(fā)帶來一定困難

外設(shè)周邊尚未開發(fā)支持

異常反饋系統(tǒng)尚不完善,待后續(xù)開發(fā)


6

總結(jié)與展望


歷經(jīng)數(shù)月的攻堅(jiān)克難,RusT-Thread 項(xiàng)目終于迎來了階段性成果。我們成功地將 RT-Thread Nano 內(nèi)核的核心功能,包括線程調(diào)度、內(nèi)存管理、中斷處理、時(shí)鐘服務(wù)、IPC 等,用 Rust語言進(jìn)行了高質(zhì)量的重構(gòu)與實(shí)現(xiàn)。這不僅是一次技術(shù)棧的遷移,更是在嵌入式實(shí)時(shí)操作系統(tǒng)領(lǐng)域,對(duì) Rust 語言安全性、并發(fā)性和現(xiàn)代語言特性的一次深度實(shí)踐與驗(yàn)證。

核心成果:安全性與性能的雙重提升

內(nèi)存安全基石:最大的收獲莫過于 Rust 強(qiáng)大的所有權(quán)系統(tǒng)和借用檢查機(jī)制帶來的根本性改變。通過RTIntrFreeCell等創(chuàng)新設(shè)計(jì),我們有效解決了嵌入式系統(tǒng)中全局共享數(shù)據(jù)訪問這一高危痛點(diǎn),將數(shù)據(jù)競(jìng)爭(zhēng)、野指針、緩沖區(qū)溢出等 C 時(shí)代常見的“幽靈”從編譯期就扼殺在搖籃里。內(nèi)核服務(wù)的錯(cuò)誤處理也因Option / Result變得更加健壯和可預(yù)測(cè)。

性能不妥協(xié):我們并非單純追求“安全”而犧牲效率。精心優(yōu)化的調(diào)度算法(如基于位圖+FFS 的優(yōu)先級(jí)調(diào)度、創(chuàng)新的多級(jí)反饋隊(duì)列)、高效的小內(nèi)存分配器實(shí)現(xiàn),以及 Rust 零成本抽象的特性,共同確保了 RusT-Thread 在 QEMU 模擬環(huán)境下的性能指標(biāo)(中斷延時(shí)、上下文切換、線程創(chuàng)建、響應(yīng)時(shí)間)與原版 C 實(shí)現(xiàn)的 RT-Thread Nano 相當(dāng)甚至略有優(yōu)勢(shì)。這證明了 Rust 完全有能力勝任對(duì)實(shí)時(shí)性要求苛刻的嵌入式場(chǎng)景。

代碼精簡(jiǎn)與清晰:Rust 的現(xiàn)代語言特性(如 trait、泛型、豐富的標(biāo)準(zhǔn)庫容器)顯著提升了代碼的表達(dá)力和可維護(hù)性。最直觀的體現(xiàn)是,在實(shí)現(xiàn)同等甚至更多功能(如更優(yōu)的定時(shí)器二分查找算法)的前提下,Rust-Thread 的核心代碼量(約 5500 行)相比原 C 版(約 9600 行)有了顯著的精簡(jiǎn)。模塊化設(shè)計(jì)和清晰的抽象也讓代碼結(jié)構(gòu)更易于理解和擴(kuò)展。

扎實(shí)的驗(yàn)證體系:我們構(gòu)建了涵蓋單元測(cè)試、集成測(cè)試和全面的性能基準(zhǔn)測(cè)試(內(nèi)存性 能、中斷延時(shí)、響應(yīng)時(shí)間、上下文切換、線程創(chuàng)建)的驗(yàn)證體系。詳實(shí)的數(shù)據(jù)不僅證明了系統(tǒng)的功能正確性,也為性能優(yōu)化和后續(xù)迭代提供了堅(jiān)實(shí)基礎(chǔ)。

挑戰(zhàn)與突破:在“裸機(jī)”上駕馭 Rust

項(xiàng)目過程并非一帆風(fēng)順。調(diào)試手段匱乏時(shí),我們深度依賴半宿主打印和內(nèi)聯(lián)匯編調(diào)試技巧;硬件對(duì)接和啟動(dòng)流程的復(fù)雜性,通過cortex-m、cortex-m-rt等庫結(jié)合內(nèi)聯(lián)匯編巧妙化解;匯編與 Rust 聯(lián)合編譯調(diào)試的難題,最終以內(nèi)聯(lián)匯編統(tǒng)一在 Rust 源碼中的方案優(yōu)雅解決;而困擾嵌入式開發(fā)的全局變量問題,則由RTIntrFreeCell+lazy_static的組合拳提供了安全可靠的 Rust 式解決方案。每一次挑戰(zhàn)的克服,都加深了我們對(duì) Rust 在嵌入式裸機(jī)環(huán)境應(yīng)用的理解。

展望未來:構(gòu)建更強(qiáng)大、更開放的 RusT-Thread 生態(tài)

RusT-Thread 的誕生只是一個(gè)起點(diǎn),我們對(duì)其未來充滿期待:

1. 功能深化與擴(kuò)展:

豐富軟件生態(tài):系統(tǒng)性地移植 RT-Thread 社區(qū)成熟的核心軟件包(網(wǎng)絡(luò)協(xié)議棧lwIP/PicoTCP、文件系統(tǒng) LittleFS/SPIFFS、GUI 組件等),是當(dāng)務(wù)之急。我們將致力于構(gòu)建標(biāo)準(zhǔn)化的 Rust-C 互操作層接口,讓海量的現(xiàn)有 C 語言資源能更順暢地融入 Rust 生態(tài)

高級(jí)內(nèi)核特性:實(shí)現(xiàn)更完善的內(nèi)存管理策略(Slab, MemHeap)、支持更豐富的 IPC 機(jī)制(消息隊(duì)列、郵箱、事件集)、探索多核(SMP)支持將是內(nèi)核層面的重要方向

人性化體驗(yàn):當(dāng)前錯(cuò)誤處理主要透?jìng)鞯讓渝e(cuò)誤碼。未來計(jì)劃引入結(jié)構(gòu)化的 Rust-native 錯(cuò)誤類型,并集成分級(jí)日志與堆棧追蹤功能,讓異常反饋更清晰、調(diào)試更高效

2. 生態(tài)建設(shè)與普及:

廣泛的硬件支持:目前已在 Cortex-M4 上驗(yàn)證。下一步將適配更多主流架構(gòu)如 Cortex- M0+/M3/M7 和 RISC-V,目標(biāo)是覆蓋更廣泛的物聯(lián)網(wǎng)和邊緣計(jì)算硬件平臺(tái)

清晰的開發(fā)者體驗(yàn):完善多級(jí)文檔體系是生態(tài)繁榮的關(guān)鍵:

代碼級(jí):維護(hù)詳盡的 rustdoc API 文檔,包含示例和安全性說明

模塊級(jí):編寫硬件抽象層(HAL)指南、驅(qū)動(dòng)移植教程、核心模塊設(shè)計(jì)解析等

入門級(jí):提供面向應(yīng)用開發(fā)者的、易于上手的使用手冊(cè)和豐富的示例項(xiàng)目,顯著降低 Rust嵌入式開發(fā)的門檻

工具鏈優(yōu)化:持續(xù)優(yōu)化代碼體積(如替換重型打印宏)、提升構(gòu)建體驗(yàn),并探索更好的調(diào)試支持集成(如更深入的 GDB 支持)

RusT-Thread 項(xiàng)目是一次勇敢的嘗試,它證明了 Rust 在資源受限的實(shí)時(shí)操作系統(tǒng)領(lǐng)域不僅可行,更能帶來顯著的安全性和開發(fā)效率提升。我們重構(gòu)的不僅是一套代碼,更是在探索嵌入式系統(tǒng)開發(fā)的未來范式。代碼已開源,這只是一個(gè)開始。我們熱切期待更多對(duì) Rust 和嵌入式系統(tǒng)感興趣的開發(fā)者加入,共同打磨 RusT-Thread,將其打造成為一個(gè)真正安全、高效、易用的開源實(shí)時(shí)操作系統(tǒng)選擇,為國產(chǎn)嵌入式基礎(chǔ)軟件生態(tài)注入新的活力!安全至上,性能無憂,Rust 讓嵌入式未來更可期。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1427

    瀏覽量

    42203
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1496

    瀏覽量

    43472
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    237

    瀏覽量

    7393
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何對(duì)RT-Thread內(nèi)核有基本的了解?

    RT-Thread 的時(shí)鐘管理以時(shí)鐘節(jié)拍為基礎(chǔ),時(shí)鐘節(jié)拍是 RT-Thread 操作系統(tǒng)中最小的時(shí)鐘單位。
    的頭像 發(fā)表于 07-19 10:12 ?7640次閱讀
     如何對(duì)<b class='flag-5'>RT-Thread</b><b class='flag-5'>內(nèi)核</b>有基本的了解?

    RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程)

    在前面我們RT-Thread Studio工程基礎(chǔ)之上講一講RT-Thread內(nèi)核啟動(dòng)流程.
    的頭像 發(fā)表于 06-20 00:30 ?6185次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(二、<b class='flag-5'>RT-Thread</b><b class='flag-5'>內(nèi)核</b>啟動(dòng)流程)

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:19 ?9次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 設(shè)備模型rt_device的理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - 設(shè)備模型<b class='flag-5'>rt</b>_device的理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象鏈表結(jié)構(gòu)深入理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:23 ?6次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對(duì)象鏈表結(jié)構(gòu)深入理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象初始化鏈表組織方式

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:24 ?3次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對(duì)象初始化鏈表組織方式

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象操作API

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)
    發(fā)表于 01-25 18:26 ?7次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記 - <b class='flag-5'>內(nèi)核</b>對(duì)象操作API

    2022 RT-Thread全球技術(shù)大會(huì):RT-Thread軟件包

    RT-Thread在2022年上半年新增幾十個(gè)軟件包:rtt-rust、LuatOS、gui-guider-demo。
    的頭像 發(fā)表于 05-27 14:12 ?1391次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b>軟件包

    大佬帶你理解RT-Thread內(nèi)核并上手實(shí)踐

    內(nèi)核是操作系統(tǒng)最重要的部分,學(xué)習(xí)RT-Thread也是從最基本的內(nèi)核開始。 ? RT-Thread內(nèi)核要怎么學(xué)?編者覺得首先應(yīng)該是從軟件架構(gòu)
    發(fā)表于 06-30 17:10 ?1790次閱讀

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

    RT-Thread文檔_RT-Thread 簡(jiǎn)介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡(jiǎn)介

    RT-Thread文檔_內(nèi)核基礎(chǔ)

    RT-Thread文檔_內(nèi)核基礎(chǔ)
    發(fā)表于 02-22 18:28 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內(nèi)核</b>基礎(chǔ)

    RT-Thread文檔_內(nèi)核移植

    RT-Thread文檔_內(nèi)核移植
    發(fā)表于 02-22 18:31 ?4次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內(nèi)核</b>移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread v5.0.2 發(fā)布

    ://github.com/RT-Thread/rt-thread/releases/tag/v5.0.2 RT-Thread 迎來了全新的版本 v5.0.2,自 v5.0.0?版本發(fā)布以來,
    的頭像 發(fā)表于 10-10 18:45 ?2397次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發(fā)布