【问题标题】:Static objects in rust生锈的静态物体
【发布时间】:2021-08-25 08:24:28
【问题描述】:

在嵌入式设置中,我们经常需要声明静态结构(驱动程序等),以便 它们的内存是已知的并在编译时分配。 有什么方法可以在 rust 中实现类似的东西吗? 例如,我想要一个 uart 驱动结构

struct DriverUart{
...
}

和一个相关的 impl 块。 现在,我想避免使用名为new() 的函数,而是想在某个地方先验地分配此内存(或者拥有一个可以在外部静态调用的new 函数 任何代码块)。 在 C 语言中,我只需将此结构的实例化放在某个头文件中,它将被静态分配并全局可用。 我还没有在 rust 中找到任何类似的东西。 如果不可能,那为什么?什么是最好的,为什么我们可以实现类似的目标?

谢谢!

【问题讨论】:

  • 标签应该表明问题是关于什么的。不是它包含的内容。删除了 C 标记。

标签: rust static embedded


【解决方案1】:

现在,我想避免使用名为 new() 的函数,而是想在某个地方先验地分配此内存(或者拥有一个可以在任何代码块之外静态调用的新函数)。在 C 语言中,我只需将此结构的实例化放在某个头文件中,它将被静态分配并全局可用。我还没有在 rust 中找到任何类似的东西。如果不可能,那为什么?什么是最好的,为什么我们可以实现类似的目标?

https://doc.rust-lang.org/std/keyword.static.html

你可以在 Rust 中做同样的事情,没有标题,只要所有元素都是const

struct DriverUart {
    whatever: u32
}

static thing: DriverUart = DriverUart { whatever: 5 };

如果您需要计算非 const 表达式,那么这显然行不通,您需要使用 lazy_staticonce_cell 之类的东西来实例化 simili-statics。

当然,如果 Rust 是一种安全的语言,而静态是共享状态,mutable statics are wildly unsafe 如果不通过线程安全的内部可变性容器(例如原子或 Mutex 尽管目前不是const,并且不清楚它们是否可以是其他的),静态被认为总是在线程之间共享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多