Never hold a reference to a location being accessed with these methods. Rust may read from (or write to, for &mut) a reference at any time.
Use &raw to get fields of structs without creating an intermediate reference.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
const SOME_DEVICE_REGISTER: *mut u64 = 0x800_0000 as _;
// SAFETY: Some device is mapped at this address.
unsafe {
SOME_DEVICE_REGISTER.write_volatile(0xff);
SOME_DEVICE_REGISTER.write_volatile(0x80);
assert_eq!(SOME_DEVICE_REGISTER.read_volatile(), 0xaa);
}
Volatile access: read or write operations may have side-effects, so prevent the compiler or hardware from reordering, duplicating or eliding them.
If you write and then read, e.g. via a mutable reference, the compiler may assume that the value read is the same as the value just written, and not bother actually reading memory.
Some existing crates for volatile access to hardware do hold references, but this is unsound. Whenever a reference exists, the compiler may choose to dereference it.
Use &raw to get struct field pointers from a pointer to the struct.
For compatibility with old versions of Rust you can use the addr_of! macro instead.