Operaciones atómicas en ARM strex y ldrex: ¿pueden funcionar en los registros de E / S?
Supongamos que estoy modificando algunos bits en un registro de E / S mapeado en memoria, y es posible que otro proceso o ISR puedan estar modificando otros bits en el mismo registro.
¿Se pueden usar ldrex y strex para protegerse contra esto? Quiero decir, pueden, en principio, porque puede ldrex, y luego cambiar los bits, y eliminarlos por strex, y si el strex falla, significa que otra operación puede haber cambiado el registro y usted debe comenzar de nuevo. Pero, ¿se puede usar el mecanismo strex / ldrex en un área no almacenable en caché?
He intentado esto en la frambuesa pi, con un registro de E / S asignado en el espacio de usuario, y la operación ldrex me da un error de bus. Si cambio el ldrex / strex a un simple ldr / str, funciona bien (pero ya no es atómico ...) Además, las rutinas ldrex / strex funcionan bien en la RAM normal. El puntero está alineado a 32 bits.
Entonces, ¿es esto una limitación del mecanismo de strex / ldrex? ¿O un problema con la implementación de BCM2708, o la forma en que el núcleo lo ha configurado? (o algo más, tal vez lo he mapeado mal)?