Con el link de RICHI ahi puedo comprender por que usar volatile en variables globales que afecten a las interrupciones. Eso es lo que necesitaba, un ejemplo
Al parecer el calificador volatile es un tema muy amplio, leo diferentes ideas y me confundo más, parece que necesitamos a un experto para que nos saque de dudas.
En resumen tenes que pensar en ASM para entenderlo o seguir la costumbre:
- volatile a todo aquello que pueda cambiarlo el hardware ( normalmente definido como volatile dentro del .h del micro que trae el compilador )
- volatile a variables globales que se modifiquen en el programa y en la interrupcion, pero esto no soluciona el tema de la atomicidad(no se la traduccion atomicity) por lo que explique y requiere de un bloqueo, desactivar las interrupciones ( para caso de no tener un RTOS ).
- Cuando te enfrentas a varios threads o hilos / task (RTOS) tambien deberias tenerlo en cuenta de usar volatile en variables globales que son compartidas por las tareas. Aunque deberias usar Queue y otras cosas mas.
- Si declaraste volatile a una variable en un archivo y luego usas extern para usarlo en otro archivo, asegurate que tambien este definido como extern volatile.
Casos que hay que tener en cuenta (este si que no lo sabia ):
- el compilador C puede mover las instrucciones para el caso de los volatiles y no cumplir exactamente con el orden del programa escrito en C, esto esta explicado en el 1er link que paso RICHI punto 5, y da un muy buen ejemplo pasado a ASM, en el que se ejecuta el ready=1; antes que la otra instruccion(que estaba antes de esa), que si va el caso de que ocurra una interrupcion seria un error. Y hay que aplicar otras soluciones, memory-lock (si es que lo ofrece el compilador), call a una funcion, declarar todo como volatile, etc.
Este ultimo algunos dicen que no es asi y otros dicen que si, ahi en el link provee un codigo ASM de lo generado y se ve que si. Otros como el 3er link dice que usar volatile ( imagino que siempre y cuando se trate de todas variables como volatile ) no modificaria el orden del programa.
En fin, para todos gracias por haberme solucionado las dudas a mi tambien, y con ejemplos y todo
Volatile static char dato @0x100,
Con respecto a lo de static, lo que tengo entendido es que habla sobre la permanencia y el linkage(ni idea de la traduccion) del dato.
Definido dentro de la funcion habla sobre la permanencia, es que no se destruye.
Definido fuera de la funcion lo que lo diferencia de una variable "global" cualquiera es que lo restringe solamente al archivo ese.
La diferencia entre:
Archivo1.c
int x=0;
static int i=0;
es que:
Archivo2.c
extern int x; // Valido
extern int i; // No valido
Con respecto a la permanencia:
Ejemplo sacado de internet:
#include <stdio.h>
void foo()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf("a = %d, sa = %d\n", a
, sa
); }
int main()
{
int i;
for (i = 0; i < 10; ++i)
foo();
}
Salida del printf:
a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60
Como ves "a" se crea y se destruye en esa funcion , mientras que "sa" por ser static no se destruye