Autor Tema: Mesclando C y Asambler  (Leído 4029 veces)

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

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Mesclando C y Asambler
« en: 08 de Septiembre de 2006, 18:50:28 »
Buenas Gente, Estoy incursionando en esto de programación de PIC en C y estoy usando el C18 de Microchip,

Mi idea es no tirar todo lo que tengo escrito en asambrer porque funciona bien, pero quiero agregarles a mi proyecto nuevas opciones display LCD con menú y ese tipo de cosas, y lo quiero programar en C por ser más simple.

Entonces mi intención seria llamar una rutina en C desde asambler.

en un pdf en la page 43 dice como:    http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_C18_Users_Guide_51288j.pdf

Les paso el ejemplo:

EXAMPLE 3-1:
Given the following prototype for a C function:
char add (auto char x, auto char y);
to call the function add with values x = 0x61 and y = 0x65, the value for y must be
pushed onto the software stack followed by the value of x. The return value, since it is
8 bits, will be returned in WREG (see Table 3-2), i.e.,

EXTERN add ; defined in C module ; <---  aparentemente con esto el mpasm lo compila sin preguntar que es
...
MOVLW 0x65
MOVWF POSTINC1 ; y = 0x65 pushed onto stack
MOVLW 0x61
MOVWF POSTINC1 ; x = 0x61 pushed onto stack
CALL add  ;                                                          <--  luego se llama la funcion como si fuera asm
MOVWF result ; result is returned in WREG
...


Pero el Mplink me tira el error :

MPLINK 4.02, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - Coff file format for 'D:\hdc5\PIC18\Exit28_C_01\Main_prog_02.o' is out of date.
Errors    : 1

Por ahí si alguien las tiene mas clara en C , me pueda dar una mano.

Muchas Gracias
Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: Mesclando C y Asambler
« Respuesta #1 en: 08 de Septiembre de 2006, 19:11:00 »
Buenas

No soy experto en c, pero se suele llamar al "asembler" desde el C normalmente y no al contrario.

Mira quel linker sea el del C18.

Yo suelo mezclar los dos sin problema.

las funciones desde el C declaras como extern. y en asm como global. (llamando desde c)

en fin....



Xavi (Barcelona)

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Re: Mesclando C y Asambler
« Respuesta #2 en: 08 de Septiembre de 2006, 19:53:49 »
gracias Javisus, no entiendo por que me tira el error ese y no encuentro info sobre el error

en asambrer pongo    
        extern low_interrupt
   call   low_interrupt

y en c

#pragma code my_overlay_scn=0xEFFFF
void low_interrupt() {
     int J;
    J=J+1;
    }
#pragma code

Compila los dos el .asm y el .c por separado, pero en el momento del link maldito, me manda a perder

Error - Coff file format for 'D:\hdc5\PIC18\Exit28_C_01\Main_prog_02.o' is out of date.
Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Re: Mesclando C y Asambler
« Respuesta #3 en: 08 de Septiembre de 2006, 21:43:49 »
Solucionado !!!!

Ahora parece que el link  no entiende que el programa principal es el que esta en asm y no en c por lo que me dice

MPLINK 4.02, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - could not find definition of symbol 'main' in file 'E:\Program Files\Microchip\MCC18\lib/c018i.o'.
Errors    : 1

me pide el void main
Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Mesclando C y Asambler
« Respuesta #4 en: 09 de Septiembre de 2006, 07:36:51 »
¿Puedes poner el programa o la parte del mismo con el código en asm y el c? es que no te veo que indicas al compilador que las lineas que escribes van a ser en asm, mediante las instrucciones:
Código: ASM
  1. _asm
  2.  
  3.  
  4.    _endasm


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Mesclando C y Asambler
« Respuesta #5 en: 09 de Septiembre de 2006, 17:00:42 »
GustavoT, uso C18 y ensamblador y aún nunca tuve que unirlos pero sí he leído lo que has referenciado en tu post anterior.

Antes que nada, es importante aclarar que las descripciones que da microchip son para llamar funciones de C desde el ensamblador (en adelante assembler) y para hacer llamado a funciones de assembler desde el C.

Lo que tienes que comprendes es que siempre compilaremos centrandonos en un proyecto en C18.  Las razones son varias pero piensa en que para que tu código en C funcione, no es solo tratar el código ensamblador que genera... además todo ese paso de parámetros usa un stack de software que lo hace el C mismo.  Todo eso es lo que se inicializa al principio del programa.

Son cosas que van "en código" no en el compilador en sí.  Irán después en el ejecutable final.

Una vez comprendido esto, tu "main" no lo puedes obviar nunca.  Eso es porque en tu archivo de linker si te fijas, cuando lo simulas, al final, hace una llamada a una funcion externa "main". 

Si quieres cambiar eso, deberás recompilar el código de 'booteo e inicialización' por así llamarlo.

Entonces, en tu proyecto en C, le agregarás funciones en assembler.  A partir de ahí, puedes ir de un lado para el otro.  Que tus funciones en assembler llamen a funciones en C18 y viceversa pero, tu inicialización fue hecha para C18.

Las funciones en assembler seran "ensambladas" pero debes respetar la convención del C18 para el pasaje de parámetros y para la "respuesta" de las funciones.

En cuanto al Linker, da lo mismo si es el del assembler o el del C18, en realidad si tienes las últimas versiones de ambos el linker es el mismo.  Por eso es un linker porque trabaja una vez que ya se "compiló en C" o se "ensambló en assembler".  Trabaja directamente sobre los archivos .o

Volviendo al assembler, debes tener en claro los conceptos de "relocatable code" en assembler, para comprender porque hace "extern" de un lado y "global" del otro.

vszener lo que tu sugieres es correcto, pero no es lo que nuestro amigo estaba hablando.  Hacer un par de líneas de código en ensamblador se hace como tu dices, pero mezclar código completo en C y assembler se hace como GustavoT apuntaba.

Espero haber aclarado el tema.

Saludos


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Re: Mesclando C y Asambler
« Respuesta #6 en: 09 de Septiembre de 2006, 17:26:00 »
Lo que tienes que comprendes es que siempre compilaremos centrandonos en un proyecto en C18.  Las razones son varias pero piensa en que para que tu código en C funcione, no es solo tratar el código ensamblador que genera... además todo ese paso de parámetros usa un stack de software que lo hace el C mismo.  Todo eso es lo que se inicializa al principio del programa.

Son cosas que van "en código" no en el compilador en sí.  Irán después en el ejecutable final.

Una vez comprendido esto, tu "main" no lo puedes obviar nunca.  Eso es porque en tu archivo de linker si te fijas, cuando lo simulas, al final, hace una llamada a una funcion externa "main". 


Gracias maunix , me quedo claro que no se puede, no por lo menos de una forma simple

Luego con mas tiempo estudiare cuales son mi opciones
Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Mesclando C y Asambler
« Respuesta #7 en: 09 de Septiembre de 2006, 17:35:54 »
Lo que tienes que comprendes es que siempre compilaremos centrandonos en un proyecto en C18.  Las razones son varias pero piensa en que para que tu código en C funcione, no es solo tratar el código ensamblador que genera... además todo ese paso de parámetros usa un stack de software que lo hace el C mismo.  Todo eso es lo que se inicializa al principio del programa.

Son cosas que van "en código" no en el compilador en sí.  Irán después en el ejecutable final.

Una vez comprendido esto, tu "main" no lo puedes obviar nunca.  Eso es porque en tu archivo de linker si te fijas, cuando lo simulas, al final, hace una llamada a una funcion externa "main". 


Gracias maunix , me quedo claro que no se puede, no por lo menos de una forma simple

Luego con mas tiempo estudiare cuales son mi opciones

Gustavo, tal vez me has mal interpretado, pero SI se puede.  El punto es que debes armar tu proyecto centrándote en el C18 y luego acoplarle el ensamblador a éste.

Ahora bien si tu código es muy específico y ajustado, es muy probable que la migración sea tediosa y lenta.

Mezclar código, está pensado para si tu código está pensado en ser portátil, por más que sea en ensamblador, hay formas de hacerlo así y el "relocatable mode" para generar tu proyecto en ensamblador es un paso. 

Lo demás, es ingenio y algo de conocimientos para hacer que tus códigos puedan ser lo más portables posibles dentro de una familia de PICs.

Lamento que no sean buenas noticias para tí, al menos no por ahora.

Un abrazo
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Re: Mesclando C y Asambler
« Respuesta #8 en: 09 de Septiembre de 2006, 17:56:56 »
Lo que pasa es que el proyecto ya esta armado y es grande y complicado, loq que quiero haces es ponerle un LDC con menú, configuraciones y esas cosas, y programar eso en asambrer debe ser muy complicado por lo que se me ocurrió armar la rutina en C y que corra sobre el proyecto en asambrer ya escrito.

La otra que me quedaría seria agregar un micro que trabaje exclusivamente con el LDC programado en C, luego por algún bus serial paso todo los datos entre los dos micros.

Gracias maunix, fuiste de gran ayuda, estaba bastante terco con esto de escribir la rutina en C.

Últimamente eso de C y assambler me tiene un poco aturdido y eso que lo mio es la electrónica y no la programación.
Es duro darse cuenta que por mas que assambre esta muy bueno es muy tedioso de escribir y el C es tan simple y elegante.

Si antes me decian C o asambler, la respuesta era asambler sin pensarlo, ahora seria: C ....  No, Asambre .....  No, los Dos ......  No, Ninguno.......  mmm donde hay un revolver ?
« Última modificación: 09 de Septiembre de 2006, 18:02:32 por GustavoT »
Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Mesclando C y Asambler
« Respuesta #9 en: 10 de Septiembre de 2006, 15:33:00 »
Lo que pasa es que el proyecto ya esta armado y es grande y complicado, loq que quiero haces es ponerle un LDC con menú, configuraciones y esas cosas, y programar eso en asambrer debe ser muy complicado por lo que se me ocurrió armar la rutina en C y que corra sobre el proyecto en asambrer ya escrito.

La otra que me quedaría seria agregar un micro que trabaje exclusivamente con el LDC programado en C, luego por algún bus serial paso todo los datos entre los dos micros.

Me parece excelente idea, en tu caso me parece que es mejor gastar unos $ más pero reutilizar el código que tanto esfuerzo te logró depurar.


Gracias maunix, fuiste de gran ayuda, estaba bastante terco con esto de escribir la rutina en C.

Últimamente eso de C y assambler me tiene un poco aturdido y eso que lo mio es la electrónica y no la programación.
Es duro darse cuenta que por mas que assambre esta muy bueno es muy tedioso de escribir y el C es tan simple y elegante.

Si antes me decian C o asambler, la respuesta era asambler sin pensarlo, ahora seria: C ....  No, Asambre .....  No, los Dos ......  No, Ninguno.......  mmm donde hay un revolver ?

Idem!  Programo en assembler en los 16F y en C en los 18F.  El assembler de los 18F lo conozco porque he hecho algunas cosas con él y es bueno siempre conocer a fondo la arquitectura.  Te saca de muchos apuros cuando suceden los problemas.

En los 16F tengo tantos macros y rutinas creadas que realmente me da fiaca pasarme al C, es que codifico todo en asm y en forma rápida, pasando parámetros a funciones, etc.

Tengo programas que sin tablas ocupan casi los 8K del pic 16F más grande... y eso sí que es imposible pasarlo al C salvo que cambie de arquitectura por 18F.  Es por eso que aún sigo en el ensamblador.  Cuando tengo que "tocar" esos software, pues bueno, lo hago en ensamblador.

También me costó arrancar con el C, pero ciertos proyectos que tuve en manos de una lógica realmente engorrosísima y un control que incluía cálculos matemáticos intensos me hizo iniciarme.

Creo que lo mejor es programar en C pero sin olvidar la arquitectura.  Tengo mucho codigo en 16F que lo migraré a los 18F para usarlo en ellos y haré lo que tu quieres hacer, pero será cuando realmente los tenga que usar.

En los PICs y en cualquier microcontrolador no es posible abstraerse como se hace en una PC donde hay normas y protocolos de intercomunición para todo.  Aquí trabajamos directamente con el hardware y es ahí donde las cosas son "similares" pero "diferentes".  Entonces hacer algo a medida del hardware y que sea portable 100% es sencillamente imposible, salvo que sea una rutina de multiplicación o algo así, pero si se algo muy ligado al hardware y los pics son diferentes, habrá que "cambiar" algo con casi total seguridad.

Ojo, esto no lo digo yo, lo dicen todos los 'gurues' de microchip en su foro. Gente con 25 años de experiencia programando microprocesadores y microcontroladores!  A esos, trato de escucharlos porque de ellos se aprende y mucho.

 :) :)

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)