Атомарные операции в ARM strex и ldrex - могут ли они работать с регистрами ввода / вывода?

Предположим, яm изменяет несколько битов в регистре ввода-вывода с отображением в памяти, и это 'Возможно, что другой процесс или и ISR могут изменять другие биты в том же регистре.

Можно ли использовать ldrex и strex для защиты от этого? Я имею в виду, что они могут в принципе, потому что вы можете использовать ldrex, а затем изменить бит (ы) и вернуть его обратно, и если strex завершится неудачно, это означает, что другая операция могла изменить reg, и вам придется начинать заново. Но можно ли использовать механизм strex / ldrex в области без кэширования?

Я пробовал это на Raspberry Pi с регистром ввода / вывода, сопоставленным с пользовательским пространством, и операция ldrex выдает ошибку шины. Если я изменю ldrex / strex на простой ldr / str, он будет работать нормально (но уже не атомарно). Кроме того, подпрограммы ldrex / strex работают нормально на обычной оперативной памяти. Указатель выровнен на 32 бита.

Так ли это ограничение механизма strex / ldrex? или проблема с реализацией BCM2708, или как ядро настроило это? (или что-то еще, может быть, ямы неправильно отобразили)?

Ответы на вопрос(4)

Ваш ответ на вопрос