#volatile #memory #write #read #data #reading #read-only

no-std volatile-mem

一个用于管理易失性内存的库

1 个不稳定版本

0.1.0 2021 年 3 月 16 日

789嵌入式开发

Download history 932/week @ 2024-04-08 1404/week @ 2024-04-15 1850/week @ 2024-04-22 1210/week @ 2024-04-29 1116/week @ 2024-05-06 1286/week @ 2024-05-13 1454/week @ 2024-05-20 1776/week @ 2024-05-27 939/week @ 2024-06-03 1596/week @ 2024-06-10 1787/week @ 2024-06-17 1681/week @ 2024-06-24 1705/week @ 2024-07-01 2642/week @ 2024-07-08 3270/week @ 2024-07-15 1661/week @ 2024-07-22

9,323 每月下载量

Apache-2.0

19KB
185

volatile-mem

一个用于管理易失性内存的 Rust 库。


lib.rs:

这个包提供了一个类型 Volatile,用于管理易失性内存或数据。

Volatile 对象不包含对易失性内存的指针或引用,而是易失性数据的容器。这意味着对 Volatile 对象的指针是对易失性内存的指针。因此,创建类型的局部变量或参数 Volatile 几乎没有意义。您通常使用某种类型的指针或对 Volatile 对象的引用。

除了 Volatile 之外,该包还提供了两种额外的易失性类型。它们是 VolatileReadOnlyVolatileWriteOnly。从技术上讲,这些只是类型定义,分别将 Volatile 的只读和只写变体别名为别名。但是,这些变体仅通过这些别名可用。默认的 Volatile 变体允许读写。

Volatile 旨在用于读取或写入与程序外部某些进程通信的内存。一个常见的用例是内存映射 I/O。

安全性

通常,Volatile 会从一个原始指针创建,该指针带有典型的指针安全问题。特别是,必须保证有关易失性内存位置的以下内容。

  • 内存必须对读取和/或写入有效。

  • 内存必须正确对齐。

  • 内存必须指向已正确初始化的数据类型,除非是Volatile仅写入

请注意,即使数据大小为零,指针也必须非空且正确对齐。

不要忘记,即使创建对未初始化数据的引用(即使这些数据从未使用过)也是立即未定义的行为。因此,在任何情况下都不要直接创建对未初始化数据的引用(与对VolatileWriteOnlyMaybeUninit的引用相对,后者可以安全地处理未初始化数据)。

就像在C中一样,操作是否是volatile与涉及多个线程并发访问的问题无关。在这一点上,volatile访问的行为与非原子访问完全相同。特别是,对同一位置的写入操作与其他操作(读取或写入)之间的竞争条件是未定义的行为。

免责声明

Rust文档中包含以下关于volatile读取和写入的说明

Rust目前没有严格和正式定义的内存模型,因此这里“volatile”的确切语义可能会随时间而变化。但话虽如此,语义几乎总是会非常类似于C11对volatile的定义

编译器不应更改volatile内存操作的相对顺序或数量。然而,对零大小类型的volatile内存操作[...]是空操作,可以忽略。

无运行时依赖