如何在Rust中进行实时编程?

7
我正在考虑在硬实时编程中使用Rust来替代C/C++。我已经确定了两个可能存在的问题:
1)我该如何避免调用Rust的垃圾回收机制(GC)?有人建议可以通过避免使用托管指针和非实时安全库(例如Rust标准库)来解决此问题,那么这样做是否足以确保我的实时任务永远不会调用垃圾回收机制?
2)如何将我的实时任务映射到操作系统线程?我知道Rust标准库实现了N:M并发模型,但实时任务必须直接对应一个操作系统线程。是否有一种方法可以生成此类型的线程?
1个回答

6

1)我如何避免调用Rust的GC?我看到一些建议可以通过简单避免托管指针和非实时安全库(例如Rust的标准库)来实现这一点——这足以保证我的实时任务永远不会调用GC吗?

是的,避免使用@将避免GC。(目前Rust实际上并没有实现GC,因此所有代码都自动避免了GC。)

2)如何将我的实时任务映射到操作系统线程?我知道Rust的标准库实现了N:M并发模型,但实时任务必须直接对应一个操作系统线程。有没有一种方法可以生成这种类型的线程?

std::task::spawn_sched(std::task::SingleThreaded, function)(当#10095实现后奇怪的格式将被修复),例如:

use std::task;
fn main() {
    do task::spawn_sched(task::SingleThreaded) {
        println("on my own thread");
    }
}

话虽如此,Rust的运行时和标准库目前还没有为实时编程做好准备,但你可以使用#[no_std]示例)来运行“无运行时”,这会给你与C/C++完全相同的情况,除了语言差异和缺乏标准库(尽管Rust的FFI意味着你可以相对容易地调用libc,而rust-core项目旨在成为一个最小的stdlib,甚至不需要libc即可工作)。


我对 #[no_std] 的理解是它适用于整个 crate。如果我在 #[no_std] 的 crate 中编译实时代码为库,然后将其与应用程序的其余部分链接,这样我就可以在非实时代码中使用 Rust 的运行时和标准库了吗? - crosstalk
它是整个板条箱范围内的;是的,那可能是可能的,但我从未尝试过。 - huon
谢谢。我已经学习了足够的Rust来测试它,而且它可以正常工作。如果我早知道这么容易,我就会早些时候自己测试它了。 - crosstalk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接