国外Rust程序员分享:从头开始编写一个实时操作系统(RTOS)

创作不易,方便的话点点关注,谢谢
本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身。

文章结尾有最新热度的文章,感兴趣的可以去看看。

文章有点长(2418字阅读时长:5分),期望您能坚持看完,并有所收获


 

大家好,今天我继续给大家分享干货。熟悉我的人,都知道我真正的干货一般在中间和末尾部分。请耐心看完!谢谢。

我们使用 Rust 探索了嵌入式系统,重点关注硬件交互、高效内存管理以及并发特性。关键要点包括 Rust 独特的所有权模型、用于嵌入式编程的 no_std 环境,以及使用诸如 em)bedded-hal 这类库来与硬件外设进行交互。这些基础内容对于我们今天深入探究使用 Rust 进行 RTOS 编程来说至关重要。

理解实时操作系统(RTOS)

实时操作系统(RTOS,Real-Time Operating System)是一种专门设计用于在严格时间限制内处理任务的操作系统。它的核心目标是确保系统能够在预定的时间内完成特定任务,广泛应用于对实时性、可靠性和性能要求极高的领域,如航空航天、工业自动化、医疗设备和嵌入式系统等。

RTOS 的关键特性

  • • 任务调度:对任务进行优先级排序以满足截止期限要求。
  • • 确定性行为:确保执行时间可预测。
  • • 资源管理:高效地管理内存、CPU 和输入/输出(I/O)。
  • • 中断处理:以最小的延迟来处理中断。

Rust 的安全特性和并发模型与这些 RTOS 的特性契合良好,能确保在对时间敏感的应用中实现高可靠性。

开始使用 Rust 进行 RTOS 编程

为 RTOS 开发配置 Rust

要用 Rust 编写 RTOS 程序,您需要为嵌入式开发配置您的项目。以下是逐步的设置步骤:

  1. 1. 安装 Rust 工具链
  • • 安装 nightly 版本的工具链和 rustup:
rustup install nightly
rustup default nightly
  1. 1. 添加所需目标:对于嵌入式系统中常用的 ARM Cortex-M 处理器:
rustup target add thumbv7em-none-eabihf
  1. 1. 使用合适的库
  • • cortex-m-rt:用于在 Cortex-M 设备上提供运行时支持。
  • • rtic:一个用于 Rust 的实时中断驱动并发框架。
  • 2. 配置 Cargo.toml:以下是 rtic 的示例配置:
  • [dependencies]
    cortex-m-rt = "0.7"
    cortex-m = "0.7"
    cortex-m-rtic = "1.0"

    Rust 中 RTOS 的基本概念

    Rust 使我们能够为 RTOS 编写基于任务的、具有确定性的代码。以下是使用 rtic 框架编写 RTOS 任务的示例结构:

    #![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();
        }
    }

    解释

    • • 共享和局部资源:任务间共享的变量以及特定任务所独有的局部变量。
    • • 任务:使用 #[task] 宏定义,由中断触发。
    • • 临界区:保护共享资源免受竞态条件的影响。

    实现一个简单的 RTOS 项目

    让我们使用 Rust 和 RTOS 的概念来实现一个基本的 LED 闪烁应用程序。

    项目概述

    该应用程序基于定时器中断来切换 LED 的状态,以此演示任务调度和确定性执行。

    硬件要求

    • • 基于 ARM Cortex-M 的微控制器(例如,STM32)。
    • • 开发板(例如,STM32F4 Discovery)。

    代码实现

    1. 1. 创建项目
    • • 初始化一个新的 Rust 项目:
    cargo new rtos_led_blink --bin
    cd rtos_led_blink
    1. 1. 配置 Cargo.toml:添加 rtic 以及目标相关的依赖项:
    [dependencies]
    cortex-m-rt = "0.7"
    cortex-m = "0.7"
    cortex-m-rtic = "1.0"
    stm32f4xx-hal = "0.9"
    1. 1. 编写应用程序代码:以下是 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 开发的优势

    • • 内存安全性:消除了空指针解引用和数据竞争问题。
    • • 高性能:与 C/C++ 性能相当,且具备额外的安全保障。
    • • 并发支持:便于进行多任务处理以及中断驱动编程。

    使用 Rust 进行 RTOS 开发面临的挑战

    • • 学习曲线:对于不熟悉 Rust 所有权模型的开发者来说,学习难度较大。
    • • 生态系统成熟度:相较于基于 C 语言的 RTOS,支持有限。
    • • 调试:在嵌入式环境中需要专门的工具。

    结论

    实时操作系统与 Rust 相结合,为嵌入式系统带来了无与伦比的安全性和高性能。通过利用 Rust 的所有权和类型安全等特性,开发者能够满怀信心地构建满足严格实时要求的应用程序。此处列出的示例项目和练习为您开启 RTOS 之旅提供了一个坚实的起点。以上就是我的分享。这些分析皆源自我的个人经验,希望上面分享的这些东西对大家有帮助,感谢大家!

    点个“在看”不失联

    最新热门文章推荐:

    C++编程中最容易忽视的关键点,你注意到了吗?

    高手必备:如何像专业人士一样优化C++代码?

    C++开发中被低估的std::vector,竟是性能与安全的双重保障!

    Go并发模式:我后悔没有早点掌握的5种并发模式

    告别繁琐!Go1.23中的iter包如何简化你的代码逻辑

    一文读懂C++20std::span:语法、用例全攻略

    C++ 高手进阶之路:精通 std::mutex,拿捏多线程同步

    码农必看:C++23 新特性揭秘:std::expected 告别繁琐错误码与异常处理

    码农必看:C++20编译时计算如何优化你的代码?

    C++虚函数:看似神秘,实则背后都是精心设计

    用C++构建音乐播放器MusikCube,两三兆却功能强大令人惊叹

    别再盲目找库!Rust 编程最关键的10个库都在这儿了

    为什么大家都在用Rust提升Python性能?真相让人意想不到!

    必看!Discord从Go切换到Rust语言背后带来提升性能并降低延迟

    深度解析C语言指针,三大实用场景助你编程升级!

    用C语言重现Linux中mkdir命令,你绝对想不到如此简单!

    C语言模拟多态性:结构体与函数指针的巧妙运用

    从零开始:用C语言打造简化版GCC,探索编译器工作原理!


    参考文献:《rust技术文档》《RTOS实时系统》

    Real-Time Operating Systems (RTOS) with Rust

     

    请使用浏览器的分享功能分享到微信等