significa que microcontrolador mega libreria c gcc arduino avr

microcontrolador - que es avr-gcc



¿Por qué esta barrera del compilador no impone el orden? (0)

Estaba viendo la documentación en el sitio web de Atmel y encontré este ejemplo donde explican algunos problemas con el reordenamiento.

Aquí está el código de ejemplo:

#define cli() __asm volatile( "cli" ::: "memory" ) #define sei() __asm volatile( "sei" ::: "memory" ) unsigned int ivar; void test2( unsigned int val ) { val = 65535U / val; cli(); ivar = val; sei(); }

En este ejemplo, están implementando un mecanismo crítico similar a una región. La instrucción cli deshabilita las interrupciones y la instrucción sei las habilita. Normalmente, me gustaría guardar el estado de interrupción y restaurar a ese estado, pero estoy divagando ...

El problema que observan es que, con la optimización habilitada, la división en la primera línea realmente se mueve después de la instrucción cli. Esto puede causar algunos problemas cuando intenta estar dentro de la región crítica durante el menor tiempo posible.

¿Cómo es posible esto si el cli () MACRO se expande a un asm en línea que tapona explícitamente la memoria? ¿Cómo es que el compilador puede mover cosas antes o después de esta declaración?

Además, modifiqué el código para incluir barreras de memoria antes de cada enunciado en forma de __asm volatile("" ::: "memory"); y no parece cambiar nada.

También eliminé el trozo de memoria de los MACRO cli () y sei (), y el código generado fue idéntico.

Por supuesto, si declaro que el argumento de la función test2 es volátil, no hay ningún reordenamiento, lo cual supongo que es porque las declaraciones volátiles no se pueden reordenar con respecto a otras declaraciones volátiles (que técnicamente es el asm en línea). ¿Mi suposición es correcta?

¿Se pueden reordenar los accesos volátiles con respecto a los volátiles asm en línea?

¿Pueden los accesos no volátiles reordenarse con respecto a los volátiles asm en línea?

Lo que es extraño es que Atmel afirma que necesita la tarjeta de memoria para imponer el orden de los accesos volátiles con respecto al ASM. Eso no tiene ningún sentido para mí.

Si la barrera del compilador no es la solución adecuada para esto, entonces, ¿cómo podría evitar que cualquier código externo "gotee" en la región crítica?

Si alguien pudiera arrojar algo de luz, lo agradecería.

Gracias