Contenido>Indice>Intro CursoC51

EL TIPO DE ALMACENAMIENTO "VOLATILE"


Una situación muy corriente con dispositivos externos es que los valores de sus registros cambian sin intervención de la CPU. Un buen ejemplo es el chip de reloj, los registros que almacenan el tiempo transcurrido cambian continuamente sin que intervenga la CPU. Considérese lo siguiente:

unsigned int xdata *milisegundos = 0x8000 ; // Puntero al chip de reloj
         
tiempo = *milisegundos ; -> (1)  // Leer valor del registro del reloj

array[x] = tiempo ;     

tiempo = *milisegundos ;  -> (2)  // Segundo acceso al registro 

array[y] = tiempo ;

Aquí el valor escrito en el array es el valor de *milisegundos, un registro del chip de reloj.

El programa se compila sin errores pero no trabaja bien ¿Por qué?. La razón reside en que el optimizador de compilador da por supuesto que al no haberse producido ninguna escritura entre (1) y (2), el valor de *milisegundos no ha cambiado. Por ello optimiza el código correspondiente al segundo acceso haciendo que array[y] == array[x].

La solución es declarar *milisegundos como "volatile", así:

unsigned int volatile xdata *milisegundos = 0x8000 ;

De esta forma el optimizador no eliminará el código correspondiente al segundo acceso. 


   Contenido>Indice>Intro CursoC51