Autor Tema: Que significa instrucciones con ##x##?  (Leído 3426 veces)

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

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Que significa instrucciones con ##x##?
« en: 03 de Abril de 2015, 13:18:27 »
Estoy revisnado un firm de un dsPIC y me encuentro con esto:

#define _IC_INIT(x, y, z) \
{ \
   IC##x##CO##z = IC2VAL; \
   IC##x##CO##y = IC1VAL; \
   _IC##x##IP = INT_PRI_IC; \
   _IC##x##IF = 0; \
   _IC##x##IE = 1; \
}
#define IC_INIT(x, y, z) _IC_INIT(x, y, z)

y más abajo se usa así:

   if (NUM_INPUTS > 0) IC_INIT(1, REGTOK1, REGTOK2);

que significan esos # y que se esta haciendo en esos define?

Saludos!
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Que significa instrucciones con ##x##?
« Respuesta #1 en: 03 de Abril de 2015, 13:28:43 »
Algo parecido tengo acá:

Código: [Seleccionar]
//#define REGTOK1 N1
#define ICBNE(x, y) IC##x##CO##y##bits.ICBNE

#define _IC_TIME(x, y) \
static inline uint16_t ic_time(void) \
{ \
uint16_t time = 0; \
_IC##x##IF = 0; \
while (ICBNE(x, y)) time = IC##x##BUF; \
return time; \
}
#define IC_TIME(x, y) _IC_TIME(x, y)

IC_TIME(PPM_IC, REGTOK1);

#define _IC_INTERRUPT(x) _IC##x##Interrupt(void)
#define IC_INTERRUPT(x) _IC_INTERRUPT(x)

#define _IC_PIN(x) IC_PIN##x
#define __IC_PIN(x) _IC_PIN(x)

extern int one_hertz_flag;

// PPM Input on Channel PPM_IC
void __attribute__((__interrupt__,__no_auto_psv__)) IC_INTERRUPT(PPM_IC)
{

sds.
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Que significa instrucciones con ##x##?
« Respuesta #2 en: 03 de Abril de 2015, 14:28:17 »
Ok, ya entendi para que se usa. Todo esto "##x##" se reemplaza por el parámetro que pasemos en el lugar de x. Des ese modo se pueden escribir fuinciones reutilizables!!!!


sds
-
Leonardo Garberoglio

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Que significa instrucciones con ##x##?
« Respuesta #3 en: 03 de Abril de 2015, 15:35:40 »
Pues yo tampoco lo sabia, es una información muy útil.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Que significa instrucciones con ##x##?
« Respuesta #4 en: 03 de Abril de 2015, 15:59:59 »
Si, si. Lo estoy viendo en un sistema que debe medir el ancho de pulso en 8 pines distintos. El programa original tenía 8 ISR, 8 inicializaciones, etc. Despues de varias versiones, llegó a la actual que es el codigo que mostré, donde con esos #define genéricos y pasando argumentos se consigue reducir el código "escrito" notablemente. No así el codigo generado, ya que el compilador cambiará los defines por lo que iría en cada lugar.

Sds.
-
Leonardo Garberoglio

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Que significa instrucciones con ##x##?
« Respuesta #5 en: 03 de Abril de 2015, 16:10:25 »
Pues ya ves si ahorras tiempo, además imagino así de primeras combinar esto con los punteros a funciones, k lo utilice ampliamente, cuando hice un RTOS para pic, k con una definicion genérica creas las funciones TASK.

combinar estas dos cosas puede ser una técnica muy buena para crear codigo, aunque si un tercero quiere leer el código se puede cagar en quien lo escriba Haha.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Que significa instrucciones con ##x##?
« Respuesta #6 en: 03 de Abril de 2015, 16:17:49 »
Pues ya ves si ahorras tiempo, además imagino así de primeras combinar esto con los punteros a funciones, k lo utilice ampliamente, cuando hice un RTOS para pic, k con una definicion genérica creas las funciones TASK.

combinar estas dos cosas puede ser una técnica muy buena para crear codigo, aunque si un tercero quiere leer el código se puede cagar en quien lo escriba Haha.

Si, a mi me toco leer eso y me estaba volviendo locoooooo, no entendía nada. Por suerte me di cuenta de buscar en versiones viejas del sistema ya que me imaginaba que todas esas cosas no las habrían implementado de una. Encontre una version donde eso no estaba y fui tradujendo las cosas.
Por cierto porque a veces se usan registros con _ y otras no?

Código: [Seleccionar]
#define _IC_INIT(x, y, z) \
{ \
IC##x##CO##z = IC2VAL; \
IC##x##CO##y = IC1VAL; \
_IC##x##IP = INT_PRI_IC; \
_IC##x##IF = 0; \
_IC##x##IE = 1; \
}
#define IC_INIT(x, y, z) _IC_INIT(x, y, z)

Ahí tenemos el registro ICxCON1 = IC2VAL sin _ pero tenemos ICxIP con el _ y tambien hay una doble definicion:
primero el _IC_INIT y despues el IC_INIT

sds.
-
Leonardo Garberoglio

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Que significa instrucciones con ##x##?
« Respuesta #7 en: 03 de Abril de 2015, 16:51:35 »
Pues cuando yo he hecho algunos proyectos con c y ensamblador, ( no sentencias metidas en c si no .c y .inc) cuando tienes que llamar a funciones de C desde ensamblador por ejemplo hay k poner obligatoriamente el guion bajo, esto hace k el compilador sepa k es una fuuncion de C así k sera algo de eso, o puede que simplemente sea simplemente un carácter mas del nombre y no signifique nada. Busca a ver en el código si tienes ensamblador o algo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Que significa instrucciones con ##x##?
« Respuesta #8 en: 04 de Abril de 2015, 03:21:18 »
No conocía la sintaxis de esas directivas, pero puede ser útil.
Gracias por la info, elgarbe