Veränderbarer globaler Zustand
Leider ist Hardware im Grunde nichts anderes als veränderbarer globaler Zustand, was auf einen Rust-Entwickler sehr beängstigend wirken kann. Hardware existiert unabhängig von den Strukturen des Codes, den wir schreiben, und kann jederzeit durch die reale Welt verändert werden.
Wie sollten unsere Regeln sein?
Wie können wir zuverlässig mit diesen Peripheriegeräten interagieren?
- Verwenden Sie stets
volatile-Methoden für Lese- oder Schreibzugriffe auf Peripheriespeicher, da sich dieser jederzeit ändern kann. - Auf Softwareebene sollten wir in der Lage sein, eine beliebige Anzahl von Lesezugriffen auf diese Peripheriegeräte bereitzustellen.
- Wenn eine Software Lese- und Schreibzugriff auf ein Peripheriegerät haben soll, sollte sie die einzige Referenz auf dieses Peripheriegerät besitzen.
Der Borrow-Checker
Die letzten beiden dieser Regeln klingen verdächtig ähnlich wie das, was der Borrow Checker bereits tut!
Stellen Sie sich vor, wir könnten die Besitzrechte an diesen Peripheriegeräten weitergeben oder unveränderliche bzw. veränderliche Referenzen darauf anbieten?
Nun, das ist möglich, aber für den Borrow Checker benötigen wir genau eine Instanz jedes Peripheriegeräts, damit Rust dies korrekt verarbeiten kann. Glücklicherweise existiert in der Hardware nur eine Instanz jedes Peripheriegeräts, aber wie können wir dies in der Struktur unseres Codes sichtbar machen?