首页 > 解决方案 > 生锈的静态物体

问题描述

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

struct DriverUart{
...
}

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

谢谢!

标签: ruststaticembedded

解决方案


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

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

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

struct DriverUart {
    whatever: u32
}

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

如果您需要评估非常量表达式,那么这显然不起作用,您需要使用类似lazy_staticonce_cell实例化 simili-statics 的东西。

当然,Rust 是一种安全的语言,而静态是共享状态,如果不通过线程安全的内部可变容器(例如原子,或者尽管它们当前是非常量的)来缓解,可变静态是非常不安全Mutex的。不清楚它们是否可以否则),静态被认为总是在线程之间共享。


推荐阅读