Operacje atomowe w ARM strex i ldrex - czy mogą działać na rejestrach I / O?

Przypuśćmy, że modyfikuję kilka bitów w odwzorowanym w pamięci rejestrze I / O i jest możliwe, że inny proces lub ISR może modyfikować inne bity w tym samym rejestrze.

Czy ldrex i strex mogą być użyte do ochrony przed tym? Chodzi mi o to, że mogą w zasadzie dlatego, że możesz ldrex, a następnie zmienić bit (y), i strex go z powrotem, a jeśli strex zawiedzie, oznacza to, że inna operacja mogła zmienić reg i musisz zacząć od nowa. Ale czy mechanizm strex / ldrex może być używany na obszarze nie podlegającym buforowaniu?

Próbowałem tego na raspberry pi, z rejestrem we / wy zamapowanym w przestrzeni użytkownika, a operacja ldrex daje mi błąd magistrali. Jeśli zmienię ldrex / strex na prosty ldr / str, to działa dobrze (ale nie jest już atomowy ...) Również procedury ldrex / strex działają poprawnie w zwykłej pamięci RAM. Wskaźnik jest wyrównany 32-bitowo.

Czy jest to ograniczenie mechanizmu strex / ldrex? lub problem z implementacją BCM2708 lub sposób skonfigurowania jądra? (lub coś innego- może źle to zamapowałem)?

questionAnswers(4)

yourAnswerToTheQuestion