ARM поддерживает 32-битные выровненные чтения, которые являются атомарными в отношении прерываний.Однако убедитесь, что ваш компилятор не пытается кэшировать значение в регистре!Либо пометьте его как volatile
, либо используйте явный барьер памяти - в GCC это можно сделать следующим образом:
int tmp = yourvariable;
__sync_synchronize(yourvariable);
Обратите внимание, однако, что в текущих версиях GCC предусмотрен полный барьер памяти для __sync_synchronize
, а не только для одной переменной, поэтому volatile
, вероятно, лучше для ваших нужд.
Кроме того, обратите внимание, что ваша переменная будет выровнена автоматически, если вы не делаете что-то странное (т.е. явно указываетерасположение структуры в памяти или запрос упакованной структуры).Нераспределенные переменные в ARM не могут быть прочитаны атомарно, поэтому убедитесь, что они выровнены, или отключите прерывания во время чтения.