Autor Tema: inline para funciones  (Leído 2123 veces)

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

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
inline para funciones
« en: 11 de Mayo de 2009, 07:15:47 »
hola, tengo un problema de desbordamiento de pila(demasiadas llamadas a funciones), por lo que me gustaría en determinadas llamadas, copiar el código tal cual para evitar que se me desborde.

En c++ existe un modificador "inline", que hace esto que yo quiero hacer.

Por lo que veo en C18 no existe, ¿existe algun modificador similar? ¿o alguna idea para no hacerlo en plan bestia copiando y pegando?

un ejemplito por si no se entiende (suponer que la función sumaUno está por ahí declarada, y l oque hace es sumar uno al parámetro de entrada):


Esto es lo que pone:

Código: [Seleccionar]
void main (void){
  char suma = SumaUno(7);

}


Pues una vez compilado, quiero que en vez de que el ensamblador me envíe a la posición de memoria donde está definida sumaUno, copie esa zona de memoria al main.


Gracias. Saludos

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: inline para funciones
« Respuesta #1 en: 11 de Mayo de 2009, 10:08:20 »
Hola, una solución seria usar macros.

Saludos !

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: inline para funciones
« Respuesta #2 en: 12 de Mayo de 2009, 04:02:32 »
Hola, gracias, justo eso estaba intentando, era por si había algo más simple, como cambiar las opciones de compilador... o... lo que fuera.

El problema es que no se como hacerlo. Estoy buscando información por internet y no consigo más que liarme.

En algunas partes me dice que las defina como:

Código: [Seleccionar]

#define funcionMacro        funcion

Pero probando en un proyecto simple veo (en el código ensamblador) que el salto se hace igualmente, con lo que no consigo el funcionamiento que busco


Por otros lados veo:

Código: [Seleccionar]

label macro [arg1, arg2]
 //código que sea
endm

Esto no me compila, no se si lo estoy escribiendo mal, (estoy probando todas las combinaciones que se me ocurren), o que el compilador C18 no permite realizar la declaración así, o...

¿Podeís informarme un poquito de como se hace esto de las macros?

Gracias. Saludos

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: inline para funciones
« Respuesta #3 en: 12 de Mayo de 2009, 09:56:02 »
Hola, mi problema ahora es que ya he conseguido crear una macro, pero sigue sin funcionar como yo quiero.

Lo hago en un archivo con extensión asm, en este mismo defino y llamo a la macro y hace lo que tiene que hacer (copiar el código)

Sin embargo, no consigo incluirlo en C. Me da errores de compilación.

¿Cual es la sintaxis para incluir un fichero asm?

Vamos, el equivalente a:

Código: [Seleccionar]

#include "libreria.h"



Gracias. Saludos

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: inline para funciones
« Respuesta #4 en: 12 de Mayo de 2009, 10:55:49 »
Hola lo que yo te comentaba era una cosa asi:

Código: C
  1. int8 Max( int8 A, int8 B )
  2. {
  3.    return (( A > B ) ? ( A ) : ( B ));
  4. }

En este caso Max es una función, pero podria ser reemplazada por una macro, con lo cual el compilador reemplazara el código de la misma en la invocación sin tener que usar el stack para la invocación a la función.

Código: C
  1. #define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

Esa es la idea, espero te sirva.

Saludos !

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: inline para funciones
« Respuesta #5 en: 13 de Mayo de 2009, 03:31:29 »
Gracias de nuevo Richi, pero esto ya lo sabía... yo lo que quiero es incluir una función más compleja que eso... y el define solo se puede para una línea, ¿no?. Para eso, estoy buscando documentación de macros, pero no consigo que funcione.

Según voy descubriendo, el tema está en que la macro tiene que programarse en ensamblador, pero no puedo meterla tal cual en un .c (con _asm/_endasm), da error, entonces la he metido en un archivo .asm en el mismo proyecto, pero no se como incluirla o llamarla. El ensamblador, de momento, algo super simple y con funcionalidad nula (es sólo una prueba) es así:

Código: [Seleccionar]

macro1 MACRO []
movlw 5
nop
movlw 20
nop
endm



Gracias. Saludos

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: inline para funciones
« Respuesta #6 en: 13 de Mayo de 2009, 09:50:39 »
Hola Cucu, las macros en "C" pueden tener mas de una linea, solamente se agrega el caracter "\"

Código: C
  1. /* Get low byte from word */
  2. #define LO( Data )                                           \
  3.            (( byte ) ((( word )( Data )) & 0xFF ))           \

No trabajo con PICs entonces no te puedo ayudar con el CCS o C18.

Saludos !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: inline para funciones
« Respuesta #7 en: 13 de Mayo de 2009, 11:26:43 »
En C18 seria de la siguiente forma:

Código: C
  1. #define Cargar(Data1, Data2){PORTB=Data1; \
  2. Delay10KTCYx(20); \
  3. PORTB=Data2; \
  4. Delay10KTCYx(20);} \
  5.  
  6. void main(void){
  7.        
  8.         TRISB=0x00;
  9.  
  10.         Cargar(0xFF,0xAA);
  11.         while(1){
  12.         }
  13. }
No contesto mensajes privados, las consultas en el foro

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: inline para funciones
« Respuesta #8 en: 14 de Mayo de 2009, 03:52:21 »
Gracias por las respuestas, he probado el ejemplo de Suky y funciona perfectamente, pero sigo sin conseguir lo que quiero, es esto;

Código: [Seleccionar]

#define sumaDos(numero) {\
char numero1,numero2;
numero1 = numero+1 ;\
numero2 = numero1+1;\
}\

void main (void){
  char i;
  i = sumaDos(3);
}



Vamos, lo que me gustaría es poder definir variables, y devolver "numero2".

Pero no funciona, he probado definiendo como función que devuelve, con return, sin return... pero nada... ¿Es que no se puede hacer?

Gracias. Saludos
« Última modificación: 14 de Mayo de 2009, 04:03:17 por cucu »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: inline para funciones
« Respuesta #9 en: 14 de Mayo de 2009, 04:28:47 »
Debes entender que el compilador reemplaza el texto de la llamada de la macro por el texto que hay dentro de la macro. Y no veo como puedas hacer lo que mencionas.  :?
No contesto mensajes privados, las consultas en el foro