Atomare Operationen in ARM strex und ldrex - können Sie die Arbeit auf der I/O-Register?

Glaube, ich bin ändern von ein paar bits in eine memory-mapped-I/O-register, und es ist möglich, dass ein anderer Prozess oder und ISR werden konnte, ändern die anderen bits im gleichen register.

Kann ldrex und strex verwendet werden, um einen Schutz gegen diese? Ich meine, Sie können im Prinzip kann man da ldrex, und dann ändern Sie den bit(s), und strex es zurück, und wenn Sie das strex scheitert es bedeutet eine weitere operation haben sich die reg, und Sie müssen erneut starten. Aber können Sie das strex/ldrex-Mechanismus verwendet werden, auf ein " non-cacheable area?

Ich habe versucht, diese auf den raspberry pi, mit I/O-register zugeordnet, in userspace, und die ldrex-Betrieb gibt mir ein bus-Fehler. Wenn ich die ldrex/strex zu einem einfachen ldr/str funktioniert es einwandfrei (ist aber nicht atomar nicht mehr...) Auch, die ldrex/strex-Routinen funktionieren auf normalen RAM. Zeiger 32-bit-ausgerichtet.

Ist dies also eine Einschränkung des strex/ldrex-Mechanismus? oder ein problem mit der BCM2708-Implementierung, oder die Art und Weise, die der kernel hat es eingerichtet? (oder somethinge anderes - vielleicht habe ich es falsch zugeordnet)?

InformationsquelleAutor greggo | 2013-04-14
Schreibe einen Kommentar