1 个不稳定版本
0.1.0 | 2021 年 3 月 16 日 |
---|
789 在 嵌入式开发 中
9,323 每月下载量
19KB
185 行
volatile-mem
一个用于管理易失性内存的 Rust 库。
lib.rs
:
这个包提供了一个类型 Volatile
,用于管理易失性内存或数据。
Volatile
对象不包含对易失性内存的指针或引用,而是易失性数据的容器。这意味着对 Volatile
对象的指针是对易失性内存的指针。因此,创建类型的局部变量或参数 Volatile
几乎没有意义。您通常使用某种类型的指针或对 Volatile
对象的引用。
除了 Volatile
之外,该包还提供了两种额外的易失性类型。它们是 VolatileReadOnly
和 VolatileWriteOnly
。从技术上讲,这些只是类型定义,分别将 Volatile
的只读和只写变体别名为别名。但是,这些变体仅通过这些别名可用。默认的 Volatile
变体允许读写。
Volatile
旨在用于读取或写入与程序外部某些进程通信的内存。一个常见的用例是内存映射 I/O。
安全性
通常,Volatile
会从一个原始指针创建,该指针带有典型的指针安全问题。特别是,必须保证有关易失性内存位置的以下内容。
请注意,即使数据大小为零,指针也必须非空且正确对齐。
不要忘记,即使创建对未初始化数据的引用(即使这些数据从未使用过)也是立即未定义的行为。因此,在任何情况下都不要直接创建对未初始化数据的引用(与对VolatileWriteOnly
或MaybeUninit
的引用相对,后者可以安全地处理未初始化数据)。
就像在C中一样,操作是否是volatile与涉及多个线程并发访问的问题无关。在这一点上,volatile访问的行为与非原子访问完全相同。特别是,对同一位置的写入操作与其他操作(读取或写入)之间的竞争条件是未定义的行为。
免责声明
Rust文档中包含以下关于volatile读取和写入的说明
Rust目前没有严格和正式定义的内存模型,因此这里“volatile”的确切语义可能会随时间而变化。但话虽如此,语义几乎总是会非常类似于C11对volatile的定义。
编译器不应更改volatile内存操作的相对顺序或数量。然而,对零大小类型的volatile内存操作[...]是空操作,可以忽略。