Palabra clave volátil en lenguaje C

Debido a razones de tiempo, la palabra clave volátil aún no se ha resumido, por lo que publicaré algunos buenos blogs de resumen para evitar el olvido posterior.

1. "Palabra clave de reaprendizaje en lenguaje C volátil"

2. "El uso y significado de volátil en lenguaje C"

3. "Explicación detallada de la palabra clave volátil en C"

 

La palabra clave volátil es necesaria en las siguientes situaciones:

1. Registros de hardware de dispositivos paralelos (como registros de estado)

Los registros de hardware mapeados en memoria generalmente también necesitan agregar voliate, porque cada lectura y escritura en ellos puede tener un significado diferente.     

       #define GPC1CON * ((volatile unsigned int *) 0xE0200080)
       #define GPC1DAT * ((volatile unsigned int *) 0xE0200084)
       #define GPC1PUD * ((volatile unsigned int *) 0xE0200088)

       2. Variables no automáticas a las que se accederá en una subrutina de servicio de interrupción (Variables no automáticas)

      Dado que la velocidad de acceso a los registros es más rápida que la de la RAM, los compiladores generalmente realizan optimizaciones para reducir el acceso a la RAM externa, por ejemplo:

static int i=0; //i 为非自动变量
int main(void)
{
     ...
     while (1){
     //由于编译器判断在 main 函数里面没有修改过 i,因此可能只执行一次对从i到某寄存器的读操作,
     //然后每次if判断都只使用这个寄存器里面的“i副本”,导致 dosomething 永远也不会被调用。
     if (i) dosomething();
   }
/* Interrupt service routine. */
void ISR_2(void)
{
      i=1;
}

3. Variables compartidas por varias tareas en aplicaciones multiproceso

Cuando dos subprocesos necesitan usar una determinada variable y el valor de la variable se cambiará, debe declararse con volatile. La función de esta palabra clave es evitar que el compilador optimizador cargue la variable de la memoria en el registro de la CPU. Si la variable se carga en el registro, entonces dos subprocesos pueden usar la variable en la memoria y el otro en el registro, lo que provocará la ejecución incorrecta del programa. Volátil significa que el compilador debe recuperar la variable de la memoria cada vez que manipula la variable, en lugar de usar el valor en el registro existente.
 

volatile  BOOL  bStop  =  FALSE;  //bStop  为共享全局变量
(1) 在一个线程中:  
  while(  !bStop  )  {  ...  }  
  bStop  =  FALSE;  
  return;    
 
(2) 在另外一个线程中,要终止上面的线程循环:  
  bStop  =  TRUE;  
  while(  bStop  ); 

Espere a que termine el hilo anterior. Si bStop no usa la declaración volátil, entonces este bucle será un bucle infinito, porque bStop se ha leído en el registro, el valor de bStop en el registro nunca será FALSO, más volátil, el programa se está ejecutando Cuando el valor de bStop se lee de la memoria cada vez, no habrá bucle sin fin.

 

 

Supongo que te gusta

Origin blog.csdn.net/zwb_578209160/article/details/106038308
Recomendado
Clasificación