Use pointer::read_volatile and pointer::write_volatile.
Never hold a reference.
addr_of! lets you get fields of structs without creating an intermediate
reference.
Volatile access: read or write operations may have side-effects, so prevent
the compiler or hardware from reordering, duplicating or eliding them.
Usually 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 exist, the compiler may choose to
dereference it.
Use the addr_of! macro to get struct field pointers from a pointer to the
struct.