MMIOに対するvolatileアクセス

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