在嵌入式设置中,我们经常需要声明静态结构体(驱动程序等)它们的内存是已知的,并在编译时分配。在rust中有什么方法可以达到类似的效果吗?例如,我想要有一个驱动程序结构
struct DriverUart{
...
}
和关联的impl块。现在,我想避免有一个名为new()
的函数,相反,我想在某个地方先验地分配这个内存(或者有一个可以在外部静态调用的new
函数)任何代码块)。在C中,我会简单地把这个结构体的实例化在一些头文件中,它将被静态分配和全局可用。我在铁锈中没有发现类似的东西。如果不可能,那为什么呢?为什么我们能达到类似的效果呢?
谢谢!
现在,我想避免有一个名为new()的函数,相反,我想在某个地方先验地分配这个内存(或者有一个可以在任何代码块之外静态调用的新函数)。在C中,我会简单地把这个结构体的实例化在一些头文件中,它将被静态分配和全局可用。我在铁锈中没有发现类似的东西。如果不可能,那为什么呢?为什么我们能达到类似的效果呢?
https://doc.rust-lang.org/std/keyword.static.html
你可以在Rust中做同样的事情,没有标题,只要所有的元素都是const
:
struct DriverUart {
whatever: u32
}
static thing: DriverUart = DriverUart { whatever: 5 };
如果你需要计算非const表达式,那么这显然是行不通的,你需要使用lazy_static
或once_cell
之类的东西来实例化类似静态。
当然,由于Rust是一种安全的语言,静态是共享的状态,可变静态如果不通过线程安全的内部可变性容器(例如,原子或Mutex
,尽管它们目前是非const的,并且不清楚它们是否会成为其他类型)来缓解,则会非常不安全,静态被认为总是在线程之间共享。