MMIOに対するvolatileアクセス
pointer::read_volatile
とpointer::write_volatile
を使います。- 絶対に参照を保持してはいけません。
addr_of!
を用いると、中間的な参照を作らずに構造体のフィールドにアクセスすることができます。
- Volatileアクセス:MMIO領域に対するreadやwriteは副作用があることがあるので、コンパイラやハードウェアが実行順序を変更したり、複製したり、省略したりできないようにするためのものです。
- 通常は、例えばある可変参照に対してライトしリードすると、コンパイラはライトしたのと同じ値がリードで読み出されると想定し、実際にメモリをリードする必要はないと判断します。
- ハードウェアへのvolatileアクセスを行うための既存のクレートには参照を保持するものがありますが、これは健全ではありません。参照が存在する間はいつでもコンパイラがその参照を外して(MMIO領域にアクセスして)しまう可能性があります。
- 構造体のポインタからそのフィールドへのポインタを得るには
addr_of!
マクロを使ってください。