rust - 生锈的静态物体
问题描述
通常在嵌入式设置中,我们需要声明静态结构(驱动程序等),以便在编译时知道并分配它们的内存。有什么方法可以在 rust 中实现类似的东西吗?例如,我想要一个 uart 驱动结构
struct DriverUart{
...
}
和一个相关的 impl 块。现在,我想避免使用名为 的函数new()
,而是想在某个地方先验地分配此内存(或者拥有一个new
可以在任何代码块之外静态调用的函数)。在 CI 中,只需将此结构的实例化放在某个头文件中,它将被静态分配并全局可用。我还没有在 rust 中找到任何类似的东西。如果不可能,那为什么?什么是最好的为什么我们可以实现类似的东西?
谢谢!
解决方案
现在,我想避免使用名为 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_static
或once_cell
实例化 simili-statics 的东西。
当然,Rust 是一种安全的语言,而静态是共享状态,如果不通过线程安全的内部可变容器(例如原子,或者尽管它们当前是非常量的)来缓解,可变静态是非常不安全Mutex
的。不清楚它们是否可以否则),静态被认为总是在线程之间共享。
推荐阅读
- python - Python Flask 应用程序路由运行不正常
- vue.js - VuePress/Vue:使用 GitLab CI 构建期间未使用的插件
- python - Python面板按钮回调函数
- php - exec("mysqldump") 返回 2 但该命令在命令行中工作
- javascript - Webrtc 媒体流正在工作,但数据通道关闭(根本不启动)
- python - “正面”出现的概率是多少?
- python - 有没有办法从 Python 使用 IBM 查询加速器?
- php - 如何设置每行 4 个项目?(PHP/HTML/CSS) 非表
- c++ - Returning from exe entry point does not terminate the process on Windows 10
- teamcity - TeamCity 构建功能“拉取请求”是否会自动运行合并构建?