Autor Tema: Utilización de directivas del preprocesador  (Leído 5768 veces)

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Utilización de directivas del preprocesador
« en: 15 de Diciembre de 2006, 02:47:07 »
Desconozco si es la traducción correcta de las preprocessor directives pero es sobre este tema sobre el que tengo dudas.

Conozco algunas directivas, como #define, #ifdef, #endif pero no he encontrado ningún documento donde vengan todas explicadas, así como las normas sintácticas que las regulan.
Por ejemplo, me gustaría saber si se pueden manejar variables y operaciones matemáticas dentro de dichas directivas.

Concretamente mi problema es resolverlo con C30, aunque desconozco si estas directivas forman parte del estándar de C o es algo propio de cada compilador.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Utilización de directivas del preprocesador
« Respuesta #1 en: 15 de Diciembre de 2006, 03:08:19 »
Yo recuerdo haber traducido algo de eso en la ayuda del MKB, esta por la pagina 60 aunque no aclara mucho sobre que rutinas o no se pueden usar. Pero imagino que se podran usar cosas segun entiendo es para excluir o no partes de codigo o ejecuciones de programa.

En linux cuando se compilan paquetes siempre vienen esas directivas ya que si se tiene lo necesario -librerias por ejemplo- ejecuta algo y si no hace otra cosa.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Utilización de directivas del preprocesador
« Respuesta #2 en: 15 de Diciembre de 2006, 09:25:13 »
Al menos el CCS permite usar variables globales en estas directivas, no expresiones (por lo que pude constatar, pero puedo estar equivocado)

#BIT  id = x.y
Elements: id is a valid C identifier,
x is a constant or a C variable,
y is a constant 0-7.
 
Examples:
#bit T0IF = 0xb.2
...             
T0IF = 0; // Clear Timer 0 interrupt flag


int result;
#bit result_odd = result.0
...
if (result_odd)


y en todas las asignaciones tipo #BYTE id = XX  también se pueden poner variables pero no expresiones, por ej
int k=5;
#byte puerto_a = k      // funciona
#byte puerto_a = k+1  // no funciona

     

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re: Utilización de directivas del preprocesador
« Respuesta #3 en: 15 de Diciembre de 2006, 14:38:30 »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Utilización de directivas del preprocesador
« Respuesta #4 en: 15 de Diciembre de 2006, 15:05:46 »
Yo no creo que sea asi, mira esta asignacion que hago en un programa para referirme a la memoria EEPROM:

Código: [Seleccionar]
enum Mapa_Memoria
 {
    CTE_CALIB = 0x40,                        //es una Float, ocupa 4 lugares
    LIMITE_INF_PRES = (CTE_CALIB + 4),       //es una Int16, ocupa 2 lugares
    LIMITE_SUP_PRES = (LIMITE_INF_PRES + 2), //es una Int16, ocupa 2 lugares
    LIMITE_MAX_TEMP = (LIMITE_SUP_PRES + 2), //es una Int16, ocupa 2 lugares
    eeOFFSET = (LIMITE_MAX_TEMP + 2),        //es una Int16, ocupa 2 lugares
    eeSPAN = (eeOFFSET + 2),                 //es una Int16, ocupa 2 lugares
    LIMITE_CALIB = (eeSPAN + 2),             //es una Int16, ocupa 2 lugares
    Numero_Conv_AD = (LIMITE_CALIB + 2)      //es una Int8, ocupa 1 lugar
 };

Del mismo modo deberias poder asignar posiciones de memoria para tu programa, pero recuerda siempre que el CCS siempre sera mas eficiente asignandola ya que luego la reutiliza para usar las mismas posiciones para las variables locales en una funcion... :lol: :lol:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Utilización de directivas del preprocesador
« Respuesta #5 en: 15 de Diciembre de 2006, 16:11:29 »
Cada compilador tiene las suyas exclusivas pero hay muchas que son estandar,como por ejemplo el #define.
Este #define se usa para definir etiquetas,al igual que #bit o #byte.Estas últimas lo que hacen es asociar esa etiqueta que se define,con una dirección de memoria (#byte) o con un bit de una dirección de memoria concreta (#bit).
Esto para lo que vale es para poder crear cierto orden y legibilidad,pudiendo usarse para simplificar el código.
El #define lo que hace es asociar una etiqueta a la expresión que le pongas después,por lo que cada vez que en tu código aparezca la etiqueta lo que está apareciendo realmente es la expresión.


Código: [Seleccionar]
#define FALSO FALSE
#define VERDADERO TRUE
#define incrementa_uno(x) (x = x + 1)

void programita()
  {
   if(!condicion)
     {
     incrementa_uno(numero);
     condicion = VERDADERO;
     }
  }

O sea,un #define no es un recurso para realizar operaciones ni tareas,es un simple sustituto,una etiqueta que te sirve para hacer tu codigo más legible.
En la ayuda de CCS vienen explicadas todas las directivas del mismo,no se si en C30 también vendrán explicadas,pero debería...

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Utilización de directivas del preprocesador
« Respuesta #6 en: 15 de Diciembre de 2006, 18:54:01 »
Entonces, Modulay, el abuso de los #define complejos puede consumir mas memoria que hacer una función ¿no?

Si uso #define incrementa_uno(x) (x = x + 1)  cada vez que uso el incrementa_uno(numero); escribo realmente (numero = numero + 1) pero si hago void imcrementa_uno(int* x){ x= x+1;} solo lo escribo una vez y todas las demás seran solo calls ... ¿cierto?

En el ejemplo este probablemente no sea este el caso ya que incrementar un posición de memoria es mas pequeño en instrucciones que un call a una dirección pasando un parámetro, pero se entiende lo que quiero decir ...  :mrgreen:



Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Utilización de directivas del preprocesador
« Respuesta #7 en: 15 de Diciembre de 2006, 19:20:47 »
Es obvio que deben sustituir algunas expresiones en las que clarifiquen y faciliten la lectura del programa. Llegado el caso, el abuso de las mismas puede distorsionar tanto el lenguaje que no sea reconocido por alguien que sepa C.

Mi pregunta concreta persigue resolver un problema que tengo al intentar implementar un retardo variable en C30, que dependa de los MIPS a los que tenga configurado el micro. Lo mejor será poner un ejemplo:

#define MIPS 40
#define RETRASO (MIPS-15)

Ya sé que la segunda de las sentencias es errónea pero, ¿sabéis cómo podría implementarla?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Utilización de directivas del preprocesador
« Respuesta #8 en: 15 de Diciembre de 2006, 19:46:06 »
Puedes usar el define que te determina los mips como parámetro a una función,aunque claro eso también lo puedes hacer con una constante.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Utilización de directivas del preprocesador
« Respuesta #9 en: 16 de Diciembre de 2006, 02:58:19 »
Para lo que pretendo hacer no me sirve utilizar una función, porque sólo entrar en la misma y salir con un return come varios ciclos de instrucción que no puedo permitirme.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Utilización de directivas del preprocesador
« Respuesta #10 en: 16 de Diciembre de 2006, 09:04:41 »
Pues no le veo otra forma posible,o eso o algún algoritmo repetitivo en el que tengas controlados el número de ciclos que consumes en función del retardo que quieres obtener.
Hazlo en asm y actuando sobre el PC,te será más fácil controlar la temporización.

Desconectado djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
Re: Utilización de directivas del preprocesador
« Respuesta #11 en: 16 de Diciembre de 2006, 10:27:54 »
Es obvio que deben sustituir algunas expresiones en las que clarifiquen y faciliten la lectura del programa. Llegado el caso, el abuso de las mismas puede distorsionar tanto el lenguaje que no sea reconocido por alguien que sepa C.

Mi pregunta concreta persigue resolver un problema que tengo al intentar implementar un retardo variable en C30, que dependa de los MIPS a los que tenga configurado el micro. Lo mejor será poner un ejemplo:

#define MIPS 40
#define RETRASO (MIPS-15)

Ya sé que la segunda de las sentencias es errónea pero, ¿sabéis cómo podría implementarla?


Buenas amigos!!!

Manolo prueba este código puede que te valga para lo que quieres hacer ;)


Código: [Seleccionar]
#DEFINE MIPS 40
#IF MIPS == 40
     INT CONST RETARDO = MIPS-15;
#ENDIF

PD: El Geshi ya no está en la actualización del foro???  :cry:

Saludos!
Diego J.

Saludos desde Cádiz, España
Web personal: http://www.microtronic.es

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Utilización de directivas del preprocesador
« Respuesta #12 en: 16 de Diciembre de 2006, 12:13:10 »
Es obvio que deben sustituir algunas expresiones en las que clarifiquen y faciliten la lectura del programa. Llegado el caso, el abuso de las mismas puede distorsionar tanto el lenguaje que no sea reconocido por alguien que sepa C.

Mi pregunta concreta persigue resolver un problema que tengo al intentar implementar un retardo variable en C30, que dependa de los MIPS a los que tenga configurado el micro. Lo mejor será poner un ejemplo:

#define MIPS 40
#define RETRASO (MIPS-15)

Ya sé que la segunda de las sentencias es errónea pero, ¿sabéis cómo podría implementarla?


Buenas amigos!!!

Manolo prueba este código puede que te valga para lo que quieres hacer ;)


Código: [Seleccionar]
#DEFINE MIPS 40
#IF MIPS == 40
     INT CONST RETARDO = MIPS-15;
#ENDIF

PD: El Geshi ya no está en la actualización del foro???  :cry:

Saludos!
Diego J.

Yo haria asi:

Código: [Seleccionar]
#DEFINE MIPS 40
#IF DEFINED MIPS
     INT CONST RETARDO = MIPS-15;
#ELSE
     INT CONST RETARDO = Algun_Valor_Fijo;
#ENDIF

Suerte !! :-/ :-/

Marcos
« Última modificación: 16 de Diciembre de 2006, 12:16:45 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Utilización de directivas del preprocesador
« Respuesta #13 en: 16 de Diciembre de 2006, 12:48:27 »
Disculpad la paja mental.

Esto funciona perfectamente: #define RETRASO (MIPS-15)

No sé cómo lo probé para concluir que no funcionaba.

Espero poder terminar mis rutinas de retardo en breve y las postearé.