TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Maria33 en 02 de Julio de 2009, 08:38:33
-
Hola, estoy programando un pic18f46j11 y tengo una duda a la hora de usar variables globales en mi proyecto.
¿Cual es la diferencia entre la declaración de una variable "Extern" o "Volatile"?
¿Como puedo crear una variable que modificaré en el tratamiento de una interrupción y usaré posteriormente en el código?
Gracias
-
Extern: La variable declarada pertenece a otro módulo, por lo que no es necesario reservar memoria para ella. Se puede utilizar la variable aunque todavía no halla sido declarada.
Volatile:el contenido de la variable puede cambiar.
En el caso de una variable que se utiliza en una interrupción y después en el resto de código se debe definir como volatile.
-
Pero entonces, cuando yo declaro una variable como extern si cambia en un módulo, ¿al coger el valor en el módulo contrario tb ha cambiado?
-
probe de la siguiente manera en C30 que debe ser similar al C18:
necesita utilizar una variable en el main pero dicha variable iba a ser modificada en una libreria incluida en el main, entonces hice asi:
en el archivo principal "main.c" declare como global la variable "henry":
//---------------------------
#include "teclado.h"
int henry;//variable global
main()
{
henry=1;
inicializa_teclado();//luego de esta funcion henry=15
while(1)
{
henry++;//henry= 16 y sigue sumando ....
}
}
//---------------------------
en el archivo "teclado.h" puse lo siguiente
//---------------------------
extern int henry;//declaro el uso de esta variable global en todas las funciones de la libreria teclado.h
void inicializa_teclado(); //inicializa la variable henry=15
void busca_tecla();
//---------------------------
de esta manera la variable "henry" mantiene su valor y es modificable a traves de dichos ficheros y nunca se destruye ni cambia de direccion para ojos del compilador.
-
Al colocar extern, dentro del módulo se puede utilizar, pero en algún otro módulo debe ser declarada para reservar su espacio de memoria. Útil para ser uso eficaz de la memoria y no estar declarando varias variables que tendrán un mismo resultado.
-
Al colocar extern, dentro del módulo se puede utilizar, pero en algún otro módulo debe ser declarada para reservar su espacio de memoria. Útil para ser uso eficaz de la memoria y no estar declarando varias variables que tendrán un mismo resultado.
Suky, tu comentario refiere a algo distinto de lo que expuse? si fuese asi te rogaria un ejemplo para tenerlo más claro. saludos :-/ :-/
-
Seria mas o menos asi:
Modulo1.c
Modulo2.c
Si otro modulo requiere el uso repetis la declaracion del modulo2, lo que dijo Sulky es que al menos en un modulo tenes que hacer la declaracion formal, como esta en modulo1.c
Saludos !
-
Exacto, gracias RICHI! :wink:
-
De nada hermano, con respecto a la declaracion volatile, el uso de la misma es para instruir al compilador para que no realize ningun tipo de optimizacion sobre el contexto de la misma, un caso estupido pero clarificador es este:
int Pepe;
Pepe = 1;
Pepe = 1;
Pepe = 1;
Cualquier compillador normal descarta las dos ultimas asignaciones porque se da cuenta de que son asignaciones repetitivas, ahora si yo cambio por esto:
volatile int Pepe;
Pepe = 1;
Pepe = 1;
Pepe = 1;
El compilador no optimiza nada y si ven el dissambler veran que las 3 asignaciones son generadas.
Saludos !
P.D.
Si su compilador no descarta las dos ultimas asignaciones del primer ejemplo, entonces descarten al compilador !
-
P.D.
Si su compilador no descarta las dos ultimas asignaciones del primer ejemplo, entonces descarten al compilador !
jejej asi mismo es caballero, gracias por hacer la aclaración, me falto más orden en mi propuesta pero apuntaba a lo mismo.
-
Muchisimas gracias a todos por vuestras explicaciones me ha ayudado a comprender el funcionamiento de las variables globales. Un saludo
-
Muchisimas gracias a todos por vuestras explicaciones me ha ayudado a comprender el funcionamiento de las variables globales. Un saludo
jejej para cuando lo necesite señorita :g)