Atomare Operationen in ARM Strex und LDREX - können sie mit E / A-Registern arbeiten?

Angenommen, ich ändere einige Bits in einem speicherabgebildeten E / A-Register, und es ist möglich, dass ein anderer Prozess oder ein anderes ISR andere Bits in demselben Register ändern.

Kann man mit ldrex und strex davor schützen? Ich meine, sie können im Prinzip, weil Sie ldrex können und dann das (die) Bit (s) ändern und es wieder strexen. Wenn das Strex ausfällt, bedeutet dies, dass möglicherweise eine andere Operation die Ausrichtung geändert hat und Sie neu beginnen müssen. Aber kann der Strex / Ldrex-Mechanismus in einem nicht cachefähigen Bereich verwendet werden?

Ich habe dies auf Himbeer-Pi versucht, mit einem E / A-Register, das dem Benutzerbereich zugeordnet ist, und die ldrex-Operation gibt mir einen Busfehler. Wenn ich das ldrex / strex in ein einfaches ldr / str ändere, funktioniert es einwandfrei (ist aber nicht mehr atomar ...). Außerdem funktionieren die ldrex / strex-Routinen auf normalem RAM einwandfrei. Der Zeiger ist 32-Bit ausgerichtet.

Ist dies eine Einschränkung des Strex / Ldrex-Mechanismus? oder ein Problem mit der BCM2708-Implementierung oder der Art und Weise, wie der Kernel es eingerichtet hat? (oder etwas anderes - vielleicht habe ich es falsch abgebildet)?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage