JALv2Variables volátiles (var volatile)Esto es un verdadero dolor de cabeza tanto para ser explicarlo como para entenderlo. De echo, en el día de la fecha, me parece que lo he entendido; pero que lamentablemente no estoy seguro.
He estado buscando explicación por internet, y he dado con las siguientes páginas donde lo explican mejor:
Página 1Página 2Algo que hay que dejar en claro, es que la palabra VOLATILE no es una instrucción; por lo tanto no aparece en ASM pero si se trabaja; incluso sin que el usuario lo sepa. Esto es a nivel de compilación.
Las ventajas que tienen los lenguajes de alto nivel, es la optimización de nuestro programa escrito. Incluso, hay compiladores en que se puede desabilitar la optimización y ver si nuestro programa funciona. Por ejemplo, tenemos dos variables asignadas de tamaño byte y llamadas AA y ZZ respectivamente. De acuerdo a nuestro programa, estas dos variables pueden llegar a compartir la misma posición de memoria RAM
Otra optimización muy importante, es la generación del código en lenguaje de máquina, y es en ASM donde el usuario debe buscar una buena optimización.
Volatile, que puede ser traducido como temporal (ya que se evapora), es en realidad la indicación a nuestro compilador que deseamos que NO se debe optimizar. En el ejemplo de las dos variables anteriores (AA y ZZ) si las declaramos como volatile obligamos al compilador que no compartan la misma ubicación en la RAM (por dar un ejemplo).
NOTA: En la optimización de las variables, no quiere decir que todas las variables que creamos vayan a compartir una sola dirección en la memoria RAM. Esto lo analizará el compilador, viendo si se afectan unas con otras; si se cruzan o no, ect.
A nivel de generación del código en lenguaje de máquina, lo que también se garantiza es que no se modifique dicha varaible declarada volatile.
Por ejemplo, podemos hacer lo siguiente en ASM:
AA equ 0x20 ; AA ubicada en la posición de memoria RAM 0x20
MOVLW 0X10 ; Cargo con W 0x10
MOVWF AA ; Y se lo paso a AA
MOVLW 0x09 ;Cargo con W 0x09
ADDWF AA,F ; Sumo 0x09 + 0x10 (AA) y el resultado lo guardo en AA
O lo siguiente:
AA equ 0x20 ; AA ubicada en la posición de memoria RAM 0x20
MOVLW 0X10 ; Cargo con W 0x10
MOVWF AA ; Y se lo paso a AA
MOVLW 0x09 ;Cargo con W 0x09
ADDWF AA,W ; Sumo 0x09 + 0x10 (AA) y el resultado lo guardo en W
No hay nada raro en hacer esto, y lo escribiremos de una manera u otro si necesitamos o no, que la variable AA sea o no sea modificado.
Al menos en JALv2 (y versiones anteriores) esto no se puede elegir. En ningún momento podemos optar si queremos que un resultado sea guardado en el registro de trabajo en la memoria RAM. De echo, cada vez que hagamos una operación matemática, siempre guardaremos el resultado en la RAM:
X = X +1
X = C + B
X = B + X
W = W + X (W es una variable y no el registro de trabajo).
Concejos:Todas las variables que tiene un efecto (cuando se lee o se escribe) que es leída fuera del programa debe ser declarada volátil. Ejemplos evidentes son los registros de funciones especiales. Para mostrar el caso extremo: un programa que no accede a las variables volátiles también podría estar vacío, ya que no tiene efectos leídos. En otras palabras, si no se la declara volatile, el compilador lo puede omitir no generándola y haciendo que nuestro programa funcione mal y no saber por que es.
Ante la duda, declarar las variables como volatile; o al menos las que más se usan o son de mayor importancia; por ejemplo, la variable que se le carga un valor para ser enviado por el puerto serial; o donde se le cargan los valores de lectura a través del puerto serial.
Si un programa no funciona como debe ser y no es posible encontrar el error, hacer las variables volátiles. Esto es un motivo por el cual, la creación de variables deben ser echas todas juntas, o en el mismo lugar y no desparramado por todo el programa.