亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

RusT-Thread:基于Rust面向資源受限嵌入式設(shè)備的操作系統(tǒng)的實(shí)踐 | 技術(shù)集結(jié)

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

掃碼添加小助手

加入工程師交流群

摘要

隨著物聯(lián)網(wǎng)嵌入式系統(tǒng)的發(fā)展,實(shí)時(shí)操作系統(tǒng)(RTOS)的安全性和性能需求日益提高。傳統(tǒng)基于C語(yǔ)言的RTOS在內(nèi)存安全和并發(fā)控制方面存在局限,容易導(dǎo)致緩沖區(qū)溢出、數(shù)據(jù)競(jìng)爭(zhēng)等問(wèn)題。本項(xiàng)目以RT-Thread為基礎(chǔ),使用Rust語(yǔ)言重構(gòu)其內(nèi)核,形成了全新的RusT-Thread系統(tǒng)。系統(tǒng)采用模塊化架構(gòu),涵蓋內(nèi)核服務(wù)、進(jìn)程調(diào)度、內(nèi)存管理、線程通信時(shí)鐘控制等核心功能,并充分利用Rust的所有權(quán)模型與類(lèi)型系統(tǒng),實(shí)現(xiàn)內(nèi)存安全與并發(fā)安全保障。項(xiàng)目創(chuàng)新性地引入改進(jìn)的多級(jí)反饋隊(duì)列調(diào)度算法、中斷安全數(shù)據(jù)容器(RTIntrFreeCell)、內(nèi)聯(lián)匯編與動(dòng)態(tài)–靜態(tài)數(shù)據(jù)分離等技術(shù),在保證功能兼容性的同時(shí)優(yōu)化了代碼簡(jiǎn)潔性與可維護(hù)性。通過(guò)單元測(cè)試、集成測(cè)試和性能基準(zhǔn)測(cè)試,RusT-Thread在中斷延時(shí)、上下文切換和線程創(chuàng)建時(shí)間等關(guān)鍵指標(biāo)上表現(xiàn)出與RT-Thread相當(dāng)甚至更優(yōu)的實(shí)時(shí)性能。該工作不僅展示了Rust在系統(tǒng)軟件開(kāi)發(fā)中的可行性與優(yōu)勢(shì),也為未來(lái)安全可靠的嵌入式RTOS設(shè)計(jì)提供了參考。

關(guān)鍵詞


Rust;RTOS;RT-Thread;內(nèi)存安全;并發(fā)安全;多級(jí)反饋隊(duì)列調(diào)度;嵌入式系統(tǒng)

作者:羅浩民,陳琳波,劉時(shí),李丁,趙于洋

1 簡(jiǎn)介

RusT-Thread是一款基于RT-Thread理念,采用Rust語(yǔ)言打造的輕量級(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),為開(kāi)發(fā)者提供了安全、高效、精簡(jiǎn)的Rust原生實(shí)時(shí)操作系統(tǒng)選擇。

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


2 項(xiàng)目特色

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

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

3 架構(gòu)概述

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

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

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

性能:充分利用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)的適配過(guò)程。目前,該系統(tǒng)已成功支持ARM Cortex-M4芯片架構(gòu),未來(lái)也許會(huì)逐步擴(kuò)展對(duì)更多類(lèi)型芯片的支持范圍。

5c26a2ce-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 1.RusT-Thread overall architecture

圖1. RusT-Thread總體架構(gòu)圖




4 RusT-Thread 模塊介紹

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

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

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

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

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

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

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

鏈表實(shí)現(xiàn):利用Rust的Vec等標(biāo)準(zhǔn)容器類(lèi)型,結(jié)合手動(dòng)指針操作和數(shù)據(jù)結(jié)構(gòu)管理邏輯,構(gòu)建高效的鏈表結(jié)構(gòu)。通過(guò)存儲(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的語(yǔ)言特性。Cell模塊實(shí)現(xiàn)了一個(gè)中斷安全的共享數(shù)據(jù)容器RTIntrFreeCell,這是RT-Thread實(shí)時(shí)操作系統(tǒng)中的核心內(nèi)核服務(wù)組件之一。其核心目的就是在多線程和中斷環(huán)境下提供安全的共享數(shù)據(jù)訪問(wèn)機(jī)制,通過(guò)自動(dòng)禁用和啟用中斷來(lái)防止數(shù)據(jù)競(jìng)爭(zhēng),具體體現(xiàn)在以下三個(gè)方面:

1.中斷安全性

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


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


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

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.靈活的訪問(wèn)方式


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


4.2 硬件抽象層

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

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

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

5c3c2374-bbbd-11f0-8ce9-92fbcf53809c.jpg

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

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


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


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

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


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

2. CPU端口模塊(cpuport.rs)

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


定義異常棧幀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)算單元)

3.中斷管理模塊(irq.rs)

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


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


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


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


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


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

4.異常處理模塊(exception.rs)

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


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


異常信息收集與輸出


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


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






4.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)度算法等,用戶(hù)可根據(jù)實(shí)際需求靈活選擇調(diào)度算法,滿足不同任務(wù)對(duì)實(shí)時(shí)性和資源分配的需求。

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

5c466014-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 2.Process state transition

圖2.進(jìn)程狀態(tài)轉(zhuǎn)換圖

調(diào)度策略抽象:通過(guò)定義SchedulingPolicy特質(zhì),將多種調(diào)度算法封裝和抽象。以?xún)?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)度策略切換靈活,用戶(hù)在初始化時(shí)指定調(diào)度策略后,調(diào)度器即可根據(jù)具體實(shí)現(xiàn)執(zhí)行調(diào)度操作。

5c58da6e-bbbd-11f0-8ce9-92fbcf53809c.jpg

調(diào)度算法優(yōu)化:引入位圖+ FFS(Find First Set)算法提升調(diào)度效率。位圖標(biāo)識(shí)各優(yōu)先級(jí)隊(duì)列的線程就緒狀態(tài),通過(guò)FFS算法快速定位最高優(yōu)先級(jí)隊(duì)列中的首個(gè)就緒線程。FFS算法借助預(yù)計(jì)算查找表,將復(fù)雜位運(yùn)算轉(zhuǎn)化為簡(jiǎn)單數(shù)組訪問(wèn),實(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ù)。

5c6a2e72-bbbd-11f0-8ce9-92fbcf53809c.jpg

該算法利用預(yù)計(jì)算查找表和數(shù)學(xué)運(yùn)算避免復(fù)雜位運(yùn)算循環(huán),實(shí)現(xiàn)了快速最低有效位查找。它專(zhuā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ī)制,使長(zhǎng)期未被調(diào)度的線程逐漸升高優(yōu)先級(jí),防止低優(yōu)先級(jí)線程饑餓,增強(qiáng)調(diào)度算法公平性和適應(yīng)性。實(shí)現(xiàn)過(guò)程中,借助Rust語(yǔ)言零成本抽象特性,優(yōu)化代碼實(shí)現(xiàn),提升系統(tǒng)穩(wěn)定性和可維護(hù)性。





4.4 內(nèi)存管理層

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

RusT-Thread中的小內(nèi)存分配器主要體現(xiàn)在如下幾個(gè)文件中,具體的內(nèi)存數(shù)據(jù)組織方式如圖3所示:


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


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


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


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


5c75507c-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 3.Memory data organization method

圖3.內(nèi)存數(shù)據(jù)組織方式

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

5c8710fa-bbbd-11f0-8ce9-92fbcf53809c.jpg

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

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

(1)邊界檢查與安全性提升

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

5c97cdd2-bbbd-11f0-8ce9-92fbcf53809c.jpg

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

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

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

(2)中斷保護(hù)

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

5ca1aeb0-bbbd-11f0-8ce9-92fbcf53809c.jpg

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

5cb78a64-bbbd-11f0-8ce9-92fbcf53809c.jpg

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





4.5 線程通信層

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

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

5cc81744-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 4.Semaphore working diagram

圖4.信號(hào)量工作示意圖

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

5cd4e06e-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 5. Semaphore related operation functions

圖5.信號(hào)量相關(guān)操作函數(shù)





4.6 時(shí)鐘控制層


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



時(shí)鐘節(jié)拍由配置為中斷觸發(fā)模式的硬件定時(shí)器產(chǎn)生,當(dāng)中斷到來(lái)時(shí),將調(diào)用一次rt_tick_increase()函數(shù),通知操作系統(tǒng)已經(jīng)過(guò)去一個(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í)鐘周期長(zhǎng)度。本系統(tǒng)中默認(rèn)主頻是16MHZ,是通過(guò)QEMU模擬芯片內(nèi)部高速振蕩器實(shí)現(xiàn)的,默認(rèn)RT_TICK_PER_SECOND = 1000,即一個(gè)時(shí)鐘周期16000個(gè)硬件周期。


4.6.2 時(shí)鐘中斷的管理



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

將全局變量RT_TICK自增,這個(gè)變量記錄了系統(tǒng)從初始化到當(dāng)前經(jīng)過(guò)了多少個(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ù)。


4.6.3 定時(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ū)ο蟮乃枷搿?/span>

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

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

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

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


5 RusT-Thread 性能與驗(yàn)證測(cè)試

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

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

我們?cè)?a href="http://www.qiaming.cn/v/tag/538/" target="_blank">Linux(x86_64)平臺(tái)下,使用Rust重新實(shí)現(xiàn)了RusT-Thread的完全相同的內(nèi)存管理模塊,并對(duì)其進(jìn)行了適當(dāng)?shù)姆庋b,并使其接口與原系統(tǒng)保持一致。這樣,我們就可以在支持std庫(kù)和Criterion基準(zhǔn)測(cè)試框架的環(huán)境下,對(duì)內(nèi)存分配、釋放等核心操作進(jìn)行高效、可重復(fù)的性能測(cè)試,并與Rust標(biāo)準(zhǔn)庫(kù)分配器進(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é)果如圖6所示。

5ce946ee-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 6.Memory performance test results

圖6.內(nèi)存性能測(cè)試結(jié)果

圖6展示了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ì)象分配中具有更低的管理開(kāi)銷(xiāo)。

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

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

5d05a97e-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 7. Trend of single allocation time changes for RusT-Thread and standard allocator

圖7. RusT-Thread和標(biāo)準(zhǔn)分配器的單次分配耗時(shí)變化趨勢(shì)

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

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

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

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

5d12a0ca-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 8. Average time taken by RusT-Thread allocator and standard allocator for bulk memory allocation

圖8. RusT-Thread分配器與標(biāo)準(zhǔn)分配器在進(jìn)行批量?jī)?nèi)存分配時(shí)的平均耗時(shí)

圖8對(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)景。

5d2cf920-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 9.Time comparison under four memory reallocation paths

圖9.四種內(nèi)存重分配路徑下的耗時(shí)比較

圖9展示了常見(jiàn)四種內(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.95 ns,而標(biāo)準(zhǔn)庫(kù)約89.6 ns

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

所以,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)秀。


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

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

5d3a4e86-bbbd-11f0-8ce9-92fbcf53809c.jpg



5.3 單元測(cè)試

我們?yōu)楦鱾€(gè)模塊編寫(xiě)了詳細(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í)行等。





5.4 集成測(cè)試

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

1.并發(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í)語(yǔ)義正確。


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

2.壓力測(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)處理能力。

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


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


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


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

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

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





5.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í)間要求[4][5]。


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



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

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

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

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

中斷延時(shí)=(重載值?當(dāng)前值)/系統(tǒng)時(shí)鐘頻率

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

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


事件響應(yīng)時(shí)間是指從事件發(fā)生到系統(tǒng)完成相應(yīng)處理的總時(shí)間,包括事件檢測(cè)、任務(wù)調(diào)度和執(zhí)行處理邏輯的全過(guò)程。此指標(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í)的處理程序來(lái)處理事件,測(cè)量平均響應(yīng)時(shí)間和各優(yōu)先級(jí)的響應(yīng)時(shí)間,結(jié)果如圖10所示。

5d46164e-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 10.Event response time test results

圖10.事件響應(yīng)時(shí)間測(cè)試結(jié)果

一般硬實(shí)時(shí)操作系統(tǒng)響應(yīng)時(shí)間的指標(biāo)如表1所示。

Table 1.Hard real-time operating system response time indicators

表1.硬實(shí)時(shí)操作系統(tǒng)響應(yīng)時(shí)間指標(biāo)

5d580318-bbbd-11f0-8ce9-92fbcf53809c.png

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

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


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

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

Table 2.Time performance of thread switching

表2.線程切換的時(shí)間性能

5d684516-bbbd-11f0-8ce9-92fbcf53809c.jpg

5.5.4 線程創(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)開(kāi)銷(xiāo),提高資源利用率。對(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é)果如表3所示。

Table 3.Average thread creation time

表3.線程平均創(chuàng)建時(shí)間

5d72e12e-bbbd-11f0-8ce9-92fbcf53809c.jpg



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

RT-Thread官方給出了他們的性能測(cè)試結(jié)果如圖11[6]。


5d84ffbc-bbbd-11f0-8ce9-92fbcf53809c.jpg

5d9d8334-bbbd-11f0-8ce9-92fbcf53809c.jpg

Figure 11. RT-Thread official performance test results

圖11. RT-Thread官方性能測(cè)試結(jié)果

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

Table 4.Performance comparison between RusT-Thread and RT-Thread

表4.RusT-Thread與RT-Thread性能對(duì)比

5da5ae38-bbbd-11f0-8ce9-92fbcf53809c.jpg

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


7 RusT-Thread優(yōu)點(diǎn)和缺點(diǎn)



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

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

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

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

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

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

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


7.2 缺點(diǎn)

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

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

3.外設(shè)周邊尚未開(kāi)發(fā)支持。

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


8 總結(jié)與展望

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



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

1.內(nèi)存安全基石

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

2.性能不妥協(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)景。

3.代碼精簡(jiǎn)與清晰

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

4.扎實(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ǔ)。



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

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



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

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

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

(1)豐富軟件生態(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語(yǔ)言資源能更順暢地融入Rust生態(tài)。

(2)高級(jí)內(nèi)核特性

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

(3)人性化體驗(yàn)

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

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

(1)廣泛的硬件支持

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

(2)清晰的開(kāi)發(fā)者體驗(yàn)

完善多級(jí)文檔體系是生態(tài)繁榮的關(guān)鍵:

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


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


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

(3)工具鏈優(yōu)化

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

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



致謝

本項(xiàng)目來(lái)自于中國(guó)科學(xué)技術(shù)大學(xué)操作系統(tǒng)H課大作業(yè),在這里感謝任課老師邢凱對(duì)本項(xiàng)目的指導(dǎo),感謝課程助教團(tuán)隊(duì)對(duì)本項(xiàng)目的幫助!



參考文獻(xiàn)


5db5e4ce-bbbd-11f0-8ce9-92fbcf53809c.gif

[1]RT-Thread文檔中心[EB/OL].

https://www.rt-thread.org/document/site/#/,2025-04-21.

[2]Klabnik,S. and Nichols, C. (2018) The Rust Programmi ng Language. No Starch Press.

[3]陳渝,尹霞,張峰.Rust語(yǔ)言機(jī)制與安全性[C]//第39次全國(guó)計(jì)算機(jī)安全學(xué)術(shù)交流會(huì)論文集.2024.

[4]胡霜,華保健,歐陽(yáng)婉容,樊淇梁.語(yǔ)言安全研究綜述[J].信息安全學(xué)報(bào),2023, 8(6):64-83.

[5]Criterion測(cè)試工具[EB/OL].

https://docs.rs/criterion/latest/criterion/, 2025-05-23.Pompeii, E. (2024) How to Benchmark Rust Code with Criterion.

[6]https://bencher.dev/learn/benchmarking/rust/criterio n/

[7]千鋒教育第3章RT-Thread內(nèi)核介紹[EB/OL].

https://zhuanlan.zhihu.com/p/641915283, 2025-04-21.

[8]樂(lè)鑫科技ust+嵌入式:強(qiáng)力開(kāi)發(fā)組合[EB/OL].

https://zhuanlan.zhihu.com/p/628575325,2025-04-21.

[9]RT-Thread產(chǎn)品性能[EB/OL].

https://www.rt-thread.com/products/Performance-38.html, 2025-04-21.

(作者單位:中國(guó)科學(xué)技術(shù)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,安徽 合肥)


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

    關(guān)注

    37

    文章

    7289

    瀏覽量

    128307
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    860

    瀏覽量

    122446
  • 嵌入式設(shè)備
    +關(guān)注

    關(guān)注

    0

    文章

    118

    瀏覽量

    17614
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    238

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    大家好,我們是中國(guó)科學(xué)技術(shù)大學(xué)操作系統(tǒng)原理與設(shè)計(jì)(H)課oooooS小組。這個(gè)項(xiàng)目是我們的課程大作業(yè):參考RT-Thread架構(gòu),使用Rust搭建一個(gè)原生的
    的頭像 發(fā)表于 08-02 11:03 ?3012次閱讀
    RT-<b class='flag-5'>Thread</b> 遇上 <b class='flag-5'>Rust</b>:安全內(nèi)核 <b class='flag-5'>RusT-Thread</b> 的誕生

    開(kāi)啟全新AI時(shí)代 智能嵌入式系統(tǒng)快速發(fā)展——“第六屆國(guó)產(chǎn)嵌入式操作系統(tǒng)技術(shù)與產(chǎn)業(yè)發(fā)展論壇”圓滿結(jié)束

    粵港澳大灣區(qū)國(guó)家技術(shù)創(chuàng)新中心操作系統(tǒng)業(yè)務(wù)負(fù)責(zé)人柯善風(fēng)做了“國(guó)創(chuàng)面向工業(yè)機(jī)器人的OS解決方案和落地實(shí)踐”專(zhuān)題報(bào)告??律骑L(fēng)介紹國(guó)創(chuàng)中心的發(fā)展情況,分享了
    發(fā)表于 08-30 17:24

    淺析RT-Thread嵌入式操作系統(tǒng)系統(tǒng)架構(gòu)及文件結(jié)構(gòu)

    ??RT-Thread,全稱(chēng)是 Real Time-Thread,顧名思義,它是一個(gè)嵌入式實(shí)時(shí)多線程操作系統(tǒng)。??RT-Thread 主要采
    發(fā)表于 12-21 06:58

    怎樣去使用Rust進(jìn)行嵌入式編程呢

    使用Rust進(jìn)行嵌入式編程Use Rust for embedded development篇首語(yǔ):Rust的高性能、可靠性和生產(chǎn)力使其適合于嵌入式
    發(fā)表于 12-22 07:20

    RUST嵌入式開(kāi)發(fā)中的應(yīng)用是什么

    Rust是一種編程語(yǔ)言,它使用戶(hù)能夠構(gòu)建可靠、高效的軟件,尤其是用于嵌入式開(kāi)發(fā)的軟件。它的特點(diǎn)是:高性能:Rust具有驚人的速度和高內(nèi)存利用率??煽啃裕涸诰幾g過(guò)程中可以消除內(nèi)存錯(cuò)誤。生產(chǎn)效率:優(yōu)秀
    發(fā)表于 12-24 08:34

    嵌入式實(shí)時(shí)操作系統(tǒng)原理與最佳實(shí)踐

    嵌入式實(shí)時(shí)操作系統(tǒng)原理與最佳實(shí)踐,下來(lái)看看
    發(fā)表于 07-29 17:11 ?182次下載

    嵌入式操作系統(tǒng)是什么_嵌入式操作系統(tǒng)有哪些

    嵌入式操作系統(tǒng)(Embedded OperatingSystem,簡(jiǎn)稱(chēng):EOS)是指用于嵌入式系統(tǒng)操作系統(tǒng)。
    發(fā)表于 04-08 14:36 ?2.1w次閱讀

    Rust開(kāi)發(fā)操作系統(tǒng)教程之如何自制一個(gè)操作系統(tǒng)

    ,當(dāng)然如果你是老手或者是對(duì)Rust一竅不通的人,通過(guò)這篇文章也能清楚的了解如何制作一個(gè)微型的、有Terminal的操作系統(tǒng) 首先讓我們了解一下Rust,[Rust是一門(mén)
    發(fā)表于 06-05 17:51 ?0次下載
    <b class='flag-5'>Rust</b>開(kāi)發(fā)<b class='flag-5'>操作系統(tǒng)</b>教程之如何自制一個(gè)<b class='flag-5'>操作系統(tǒng)</b>

    為什么要用Rust進(jìn)行嵌入式開(kāi)發(fā)

    提示信息 為什么要用 Rust 進(jìn)行嵌入式開(kāi)發(fā) Rust 的設(shè)計(jì)理念:既要安全,也要高性能。Rust 的設(shè)計(jì)理念完全是嵌入式開(kāi)發(fā)所需要的。
    的頭像 發(fā)表于 11-06 10:04 ?3497次閱讀

    基于Rust語(yǔ)言的高可靠、開(kāi)源嵌入式Hypervisor

    Rust-Shyper 是北京航空航天大學(xué)計(jì)算機(jī)學(xué)院王雷教授團(tuán)隊(duì)設(shè)計(jì)開(kāi)發(fā)的虛擬機(jī)監(jiān)控器,該系統(tǒng)基于 Rust 語(yǔ)言,實(shí)現(xiàn)了一個(gè)高可靠、嵌入式 Hypervisor。2023 年 2
    的頭像 發(fā)表于 05-24 16:31 ?2722次閱讀
    基于<b class='flag-5'>Rust</b>語(yǔ)言的高可靠、開(kāi)源<b class='flag-5'>嵌入式</b>Hypervisor

    適合嵌入式設(shè)備開(kāi)發(fā)的編程語(yǔ)言—Rust語(yǔ)言

    Rust語(yǔ)言是二十一世紀(jì)的語(yǔ)言新星。Rust被人廣泛承認(rèn)的一點(diǎn),就是因?yàn)樗苓\(yùn)行在多樣的目標(biāo)上,從桌面和服務(wù)器設(shè)備,到資源有限的嵌入式
    發(fā)表于 09-12 09:39 ?4143次閱讀
    適合<b class='flag-5'>嵌入式</b><b class='flag-5'>設(shè)備</b>開(kāi)發(fā)的編程語(yǔ)言—<b class='flag-5'>Rust</b>語(yǔ)言

    基于Rust嵌入式符合ACID的鍵值數(shù)據(jù)庫(kù)

    surrealkv -- 基于 Rust 的 low level、版本化、嵌入式、符合 ACID 的鍵值數(shù)據(jù)庫(kù)
    的頭像 發(fā)表于 12-28 11:29 ?1407次閱讀

    嵌入式系統(tǒng)中集成Rust和Qt的實(shí)踐

    Rust 擁有豐富的庫(kù)生態(tài)系統(tǒng),用于序列化和反序列化、異步操作、解析不安全輸入、線程、靜態(tài)分析等,而 Qt 是一個(gè) C++ 工具包,支持跨各種平臺(tái)的豐富的、基于 GUI 的應(yīng)用程序,從 iOS 到
    發(fā)表于 05-03 10:26 ?3003次閱讀
    在<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>中集成<b class='flag-5'>Rust</b>和Qt的<b class='flag-5'>實(shí)踐</b>

    新書(shū)發(fā)布——《RT-Thread嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核、驅(qū)動(dòng)和應(yīng)用開(kāi)發(fā)技術(shù)

    我們非常高興地宣布,由鄭苗秀、沈鴻飛和廖建尚編著的《RT-Thread嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核、驅(qū)動(dòng)和應(yīng)用開(kāi)發(fā)技術(shù)》一書(shū)正式發(fā)布。本書(shū)的編寫(xiě)團(tuán)隊(duì)由多位在
    的頭像 發(fā)表于 09-03 08:06 ?1659次閱讀
    新書(shū)發(fā)布——《RT-<b class='flag-5'>Thread</b><b class='flag-5'>嵌入式</b>實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b>內(nèi)核、驅(qū)動(dòng)和應(yīng)用開(kāi)發(fā)<b class='flag-5'>技術(shù)</b>》

    【好書(shū)推薦】RT-Thread第22本相關(guān)書(shū)籍!《嵌入式實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā)實(shí)踐》| 技術(shù)集結(jié)

    教學(xué)的首選平臺(tái)。本次推薦的第22本RT-Thread相關(guān)書(shū)籍——《嵌入式實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā)實(shí)踐(基于英飛凌PSoC62和RT-Thread)》
    的頭像 發(fā)表于 10-16 18:46 ?237次閱讀
    【好書(shū)推薦】RT-<b class='flag-5'>Thread</b>第22本相關(guān)書(shū)籍!《<b class='flag-5'>嵌入式</b>實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b>開(kāi)發(fā)<b class='flag-5'>實(shí)踐</b>》| <b class='flag-5'>技術(shù)</b><b class='flag-5'>集結(jié)</b>