电竞比分网-中国电竞赛事及体育赛事平台

分享

國外Rust程序員分享:從頭開始編寫一個實時操作系統(tǒng)(RTOS)

 西北望msm66g9f 2025-01-17 發(fā)布于山東
本文是經(jīng)過嚴格查閱相關(guān)權(quán)威文獻和資料,形成的專業(yè)的可靠的內(nèi)容。全文數(shù)據(jù)都有據(jù)可依,可回溯。特別申明:數(shù)據(jù)和資料已獲得授權(quán)。本文內(nèi)容,不涉及任何偏頗觀點,用中立態(tài)度客觀事實描述事情本身。

文章結(jié)尾有最新熱度的文章,感興趣的可以去看看。

文章有點長(2418字閱讀時長:5分),期望您能堅持看完,并有所收獲


圖片

大家好,今天我繼續(xù)給大家分享干貨。熟悉我的人,都知道我真正的干貨一般在中間和末尾部分。請耐心看完!謝謝。

我們使用 Rust 探索了嵌入式系統(tǒng),重點關(guān)注硬件交互、高效內(nèi)存管理以及并發(fā)特性。關(guān)鍵要點包括 Rust 獨特的所有權(quán)模型、用于嵌入式編程的 no_std 環(huán)境,以及使用諸如 em)bedded-hal 這類庫來與硬件外設(shè)進行交互。這些基礎(chǔ)內(nèi)容對于我們今天深入探究使用 Rust 進行 RTOS 編程來說至關(guān)重要。

理解實時操作系統(tǒng)(RTOS)

實時操作系統(tǒng)(RTOS,Real-Time Operating System)是一種專門設(shè)計用于在嚴格時間限制內(nèi)處理任務(wù)的操作系統(tǒng)。它的核心目標是確保系統(tǒng)能夠在預(yù)定的時間內(nèi)完成特定任務(wù),廣泛應(yīng)用于對實時性、可靠性和性能要求極高的領(lǐng)域,如航空航天、工業(yè)自動化、醫(yī)療設(shè)備和嵌入式系統(tǒng)等。

圖片

RTOS 的關(guān)鍵特性

  • · 任務(wù)調(diào)度:對任務(wù)進行優(yōu)先級排序以滿足截止期限要求。
  • · 確定性行為:確保執(zhí)行時間可預(yù)測。
  • · 資源管理:高效地管理內(nèi)存、CPU 和輸入/輸出(I/O)。
  • · 中斷處理:以最小的延遲來處理中斷。

Rust 的安全特性和并發(fā)模型與這些 RTOS 的特性契合良好,能確保在對時間敏感的應(yīng)用中實現(xiàn)高可靠性。

開始使用 Rust 進行 RTOS 編程

為 RTOS 開發(fā)配置 Rust

要用 Rust 編寫 RTOS 程序,您需要為嵌入式開發(fā)配置您的項目。以下是逐步的設(shè)置步驟:

  1. 1. 安裝 Rust 工具鏈
    • · 安裝 nightly 版本的工具鏈和 rustup:
rustup install nightly
rustup default nightly
  1. 1. 添加所需目標:對于嵌入式系統(tǒng)中常用的 ARM Cortex-M 處理器:
rustup target add thumbv7em-none-eabihf
  1. 1. 使用合適的庫
    • · cortex-m-rt:用于在 Cortex-M 設(shè)備上提供運行時支持。
    • · rtic:一個用于 Rust 的實時中斷驅(qū)動并發(fā)框架。
  2. 2. 配置 Cargo.toml:以下是 rtic 的示例配置:
[dependencies]
cortex-m-rt = '0.7'
cortex-m = '0.7'
cortex-m-rtic = '1.0'

Rust 中 RTOS 的基本概念

Rust 使我們能夠為 RTOS 編寫基于任務(wù)的、具有確定性的代碼。以下是使用 rtic 框架編寫 RTOS 任務(wù)的示例結(jié)構(gòu):

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use cortex_m::interrupt::free as critical_section;

#[rtic::app(device = stm32f4::stm32f407)]
mod app {
    #[shared]
    struct Shared {
        counter: u32,
    }

    #[local]
    struct Local {
        led: Led,
    }

    #[init]
    fn init(ctx: init::Context) -> (Shared, Local, init::Monotonics()) {
        let led = Led::new(ctx.device.GPIOA);
        (Shared { counter: 0 }, Local { led }, init::Monotonics())
    }

    #[task(binds = TIM2, shared = [counter], local = [led])]
    fn toggle(ctx: toggle::Context) {
        let counter = ctx.shared.counter;
        let led = ctx.local.led;

        critical_section(|_| {
            *counter += 1;
        });

        led.toggle();
    }
}

解釋

  • · 共享和局部資源:任務(wù)間共享的變量以及特定任務(wù)所獨有的局部變量。
  • · 任務(wù):使用 #[task] 宏定義,由中斷觸發(fā)。
  • · 臨界區(qū):保護共享資源免受競態(tài)條件的影響。

實現(xiàn)一個簡單的 RTOS 項目

讓我們使用 Rust 和 RTOS 的概念來實現(xiàn)一個基本的 LED 閃爍應(yīng)用程序。

項目概述

該應(yīng)用程序基于定時器中斷來切換 LED 的狀態(tài),以此演示任務(wù)調(diào)度和確定性執(zhí)行。

硬件要求

  • · 基于 ARM Cortex-M 的微控制器(例如,STM32)。
  • · 開發(fā)板(例如,STM32F4 Discovery)。

代碼實現(xiàn)

  1. 1. 創(chuàng)建項目
    • · 初始化一個新的 Rust 項目:
cargo new rtos_led_blink --bin
cd rtos_led_blink
  1. 1. 配置 Cargo.toml:添加 rtic 以及目標相關(guān)的依賴項:
[dependencies]
cortex-m-rt = '0.7'
cortex-m = '0.7'
cortex-m-rtic = '1.0'
stm32f4xx-hal = '0.9'
  1. 1. 編寫應(yīng)用程序代碼:以下是 LED 閃爍項目的完整代碼:
#![no_std]
#![no_main]

use cortex_m_rt::entry;
use panic_halt as _;
use stm32f4xx_hal::{pac, prelude::*, timer::Timer};

#[entry]
fn main() ->! {
    let dp = pac::Peripherals::take().unwrap();
    let cp = cortex_m::Peripherals::take().unwrap();

    let rcc = dp.RCC.constrain();
    let clocks = rcc.cfgr.freeze();
    let gpioc = dp.GPIOC.split();

    let mut led = gpioc.pc13.into_push_pull_output();

    + let mut timer = Timer::syst(cp.SYST, 1.hz(), clocks);

    loop {
        if timer.wait().is_ok() {
            led.toggle();
        }
    }
}

運行步驟

  1. 1. 使用 cargo build --release 編譯代碼。
  2. 2. 使用諸如 OpenOCD 之類的工具將二進制文件燒錄到微控制器上。
  3. 3. 觀察 LED 以 1 赫茲的頻率閃爍。

使用 Rust 進行 RTOS 開發(fā)的優(yōu)勢

  • · 內(nèi)存安全性:消除了空指針解引用和數(shù)據(jù)競爭問題。
  • · 高性能:與 C/C++ 性能相當,且具備額外的安全保障。
  • · 并發(fā)支持:便于進行多任務(wù)處理以及中斷驅(qū)動編程。

使用 Rust 進行 RTOS 開發(fā)面臨的挑戰(zhàn)

  • · 學(xué)習(xí)曲線:對于不熟悉 Rust 所有權(quán)模型的開發(fā)者來說,學(xué)習(xí)難度較大。
  • · 生態(tài)系統(tǒng)成熟度:相較于基于 C 語言的 RTOS,支持有限。
  • · 調(diào)試:在嵌入式環(huán)境中需要專門的工具。

結(jié)論

實時操作系統(tǒng)與 Rust 相結(jié)合,為嵌入式系統(tǒng)帶來了無與倫比的安全性和高性能。通過利用 Rust 的所有權(quán)和類型安全等特性,開發(fā)者能夠滿懷信心地構(gòu)建滿足嚴格實時要求的應(yīng)用程序。此處列出的示例項目和練習(xí)為您開啟 RTOS 之旅提供了一個堅實的起點。以上就是我的分享。這些分析皆源自我的個人經(jīng)驗,希望上面分享的這些東西對大家有幫助,感謝大家!

圖片
點個“在看”不失聯(lián)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多