Autor Tema: variable global en c30.  (Leído 3264 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
variable global en c30.
« en: 09 de Diciembre de 2010, 11:33:45 »
hola, ando intentando pasar una variable de un modulo a otro y no lo consigo, me explico.
Tengo un programa para un dspic que consta de tres ficheros: adc.c,lcd.c y main.c.
en el adc.c realizo todas las tareas del cad y es tambien donde está la rutina de interrupcion del cad. Ahí necesito definir una variable llamada AdcResult a la que asigno el valor del ADCBUF0, para luego acceder a ella desde el main. Entonces no puedo declarar AdcResult como variable local del adc.c sino que tiene que ser una variable global compartida por los dos modulos.

¿cómo puedo hacer esto?

un saludo.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: variable global en c30.
« Respuesta #1 en: 09 de Diciembre de 2010, 11:37:54 »
Si la declaras como global dentro del modulo "adc.c" debería ser visible desde el main, siempre y cuando en este último esté la invocación a "adc.c"

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: variable global en c30.
« Respuesta #2 en: 09 de Diciembre de 2010, 11:42:02 »
La puedes declarar en main.c como

int AdcRseult;

y luego en adc.c como

external int AdcResult;

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: variable global en c30.
« Respuesta #3 en: 09 de Diciembre de 2010, 11:53:59 »
O al revés, declararla en ADC.c y colocarla como extern en main.

Modulay, en los compiladores de Microchip, como se trabaja con el proyecto, por lo general no se llama a un *.c


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: variable global en c30.
« Respuesta #4 en: 09 de Diciembre de 2010, 12:38:36 »
Hola, es buen criterio de programación la encapsulación de los datos. La idea es que las variables del módulo solo sean accedidas dentro del mismo módulo y que probeas una función para obtener ese valor, la cosa seria asi:

Modulo adc.h
Código: C
  1. ...
  2. unit8 GetADCResult( void );
  3. ...

Modulo ad.c
Código: C
  1. ...
  2. static uint8 LastADCValue;
  3.  
  4. unit8 GetADCResult( void )
  5. {
  6.   return( LastADCValue );
  7. }
  8.  
  9. interrupt ADC( void )
  10. {
  11.   LastADCValue = ADCBUF0;
  12. }

La variable global al módulo ADC es LastADCValue que solo este módulo accede, la función GetADCResult solo retorna el valor de la misma. Como esta función esta declarada en un H tiene visibildad global, pero ningún módulo externo puede alterar su valor.
Para los puristas seguramente esta solución demande más código en ROM, que es cierto, pero no deja de ser un buen criterio de programación que por ser criterio su valor de verdad es totalmente subjetivo.

Saludos !

« Última modificación: 09 de Diciembre de 2010, 12:57:12 por RICHI777 »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: variable global en c30.
« Respuesta #5 en: 09 de Diciembre de 2010, 12:54:20 »
...

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: variable global en c30.
« Respuesta #6 en: 10 de Diciembre de 2010, 07:31:34 »
Hola, es buen criterio de programación la encapsulación de los datos. La idea es que las variables del módulo solo sean accedidas dentro del mismo módulo y que probeas una función para obtener ese valor, la cosa seria asi:

Modulo adc.h
Código: C
  1. ...
  2. unit8 GetADCResult( void );
  3. ...

Modulo ad.c
Código: C
  1. ...
  2. static uint8 LastADCValue;
  3.  
  4. unit8 GetADCResult( void )
  5. {
  6.   return( LastADCValue );
  7. }
  8.  
  9. interrupt ADC( void )
  10. {
  11.   LastADCValue = ADCBUF0;
  12. }

La variable global al módulo ADC es LastADCValue que solo este módulo accede, la función GetADCResult solo retorna el valor de la misma. Como esta función esta declarada en un H tiene visibildad global, pero ningún módulo externo puede alterar su valor.
Para los puristas seguramente esta solución demande más código en ROM, que es cierto, pero no deja de ser un buen criterio de programación que por ser criterio su valor de verdad es totalmente subjetivo.

Saludos !



es cierto que es un buen criterio de programación estructurada, pero... no iría un poco más lento que haciendolo directamente con la variable declarada como externa?


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: variable global en c30.
« Respuesta #7 en: 10 de Diciembre de 2010, 09:52:05 »
Hola,

Citar
es cierto que es un buen criterio de programación estructurada, pero... no iría un poco más lento que haciendolo directamente con la variable declarada como externa?

Correcto es mas lento, con el extern el compilador sabe exactamente donde se encuentra la variable. De esta manera se agrega el costo de la llamada a la función. Pero como casi todas las cosas en estos temas se trata de una decisión de trade-off ( compensación, balance ), se gana en encapsulación pero se pierde en perfomance, lo importante es saber donde existe el limite.

Saludos !

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: variable global en c30.
« Respuesta #8 en: 10 de Diciembre de 2010, 18:18:58 »
pues muchas gracias, al final opté por la variable externa porque necesito que se transfiera lo más rápido posible,

un saludo. :)