可変なグローバル状態
残念ながら、ハードウェアは基本的に可変なグローバル状態そのものであり、Rust 開発者にとっては非常に恐ろしく感じられるかもしれません。ハードウェアは、私たちが書くコードの構造とは独立して存在し、現実世界によっていつでも変更される可能性があります。
私たちのルールはどうあるべきでしょうか?
これらのペリフェラルと、どうすれば信頼性高くやり取りできるのでしょうか?
- ペリフェラルのメモリはいつでも変化しうるため、読み書きには常に
volatileメソッドを使用する - ソフトウェアでは、これらのペリフェラルに対する読み取り専用アクセスは、いくつでも共有できるべきである
- あるソフトウェアがペリフェラルへの読み書きアクセスを持つべき場合、そのソフトウェアがそのペリフェラルへの唯一の参照を保持するべきである
借用チェッカー
この最後の 2 つのルールは、すでに借用チェッカーが行っていることと、どこか不気味なほど似ています!
これらのペリフェラルの所有権を受け渡したり、それらへの不変参照や可変参照を提供したりできるとしたらどうでしょうか?
実際、それは可能です。しかし借用チェッカーのためには、Rust がこれを正しく扱えるよう、各ペリフェラルについてインスタンスがちょうど 1 つだけ存在している必要があります。幸い、ハードウェア上では任意のペリフェラルのインスタンスは 1 つしかありません。では、そのことをコードの構造の中でどのように表現すればよいのでしょうか?