// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
const SOME_DEVICE_REGISTER: *mut u64 = 0x800_0000 as _;
// SAFETY: このアドレスには何らかのデバイスがマップされています。
unsafe {
SOME_DEVICE_REGISTER.write_volatile(0xff);
SOME_DEVICE_REGISTER.write_volatile(0x80);
assert_eq!(SOME_DEVICE_REGISTER.read_volatile(), 0xaa);
}
- volatile アクセス: 読み書き操作には副作用があり得るため、コンパイラやハード ウェアがそれらを並べ替えたり、重複させたり、取り除いたりするのを防ぎます。
- たとえば可変参照経由で書き込みの後に読み取りを行うと、コンパイラは読み取 った値が直前に書き込んだ値と同じだと仮定し、実際にはメモリを読まないことがあります。
- ハードウェアへの volatile アクセス用の既存のクレートの中には参照を保持する ものもありますが、これは非健全です。参照があると、コンパイラはそれを デリファレンスする可能性があります。
- 構造体へのポインタからフィールドへのポインタを取得するには
&raw を使用してください。
- 古いバージョンの Rust との互換性のために、代わりに
addr_of! マクロを使 用できます。