TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Jordi en 14 de Febrero de 2008, 15:41:03
-
¡Hola!,
me estoy iniciando con el código reubicable por las ventajas que presenta. Bueno pues estas son mis primeras pruebas y fallidas :(. El código de retardos lo encontré por el foro y me pareció bueno para hacer las pruebas por su sencillez.
Bueno lo que pasa es que si añado el código de retardos el programa no me encuentra el punto de entrada, y si no lo pongo pues me entra en el main perfectamente. La cuestión es que no puede haber código por encima del programa principal no se porqué. Si lo intento poner debajo el compilador no sabe resolver los símbolos.
El simulador me da error CORE-E0002: Stack under flow error occurred from instruction at 0x000800
Gracias por adelantado
Adjunto programa y el map file
LIST P=16F873A
#include "P16F873A.INC"
#include "c_Externo.inc"
EXTERN Retardo_10micros,Retardo_5micros,Retardo_4micros
udata
dato res 1
reset CODE 0
pagesel main
goto main
principal CODE 0x05
pagesel Retardo_10micros
call Retardo_10micros
goto $
END
Aqui viene c_Externo.inc
GLOBAL Retardo_10micros,Retardo_5micros,Retardo_4micros
retardos CODE
Retardo_10micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_5micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_4micros ; La llamada "call" aporta 2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
END
.map
MPLINK 4.11, Linker
Linker Map File - Created Thu Feb 14 18:35:13 2008
Section Info
Section Type Address Location Size(Bytes)
--------- --------- --------- --------- ---------
.cinit romdata 0x000005 program 0x000004
retardos code 0x000007 program 0x00000e
Program Memory Usage
Start End
--------- ---------
0x000005 0x00000d
9 out of 4229 program addresses used, program memory utilization is 0%
Symbols - Sorted by Name
Name Address Location Storage File
--------- --------- --------- --------- ---------
Retardo_10micros 0x000007 program extern c_Externo.inc
Retardo_4micros 0x00000d program extern c_Externo.inc
Retardo_5micros 0x00000c program extern c_Externo.inc
Symbols - Sorted by Address
Name Address Location Storage File
--------- --------- --------- --------- ---------
Retardo_10micros 0x000007 program extern c_Externo.inc
Retardo_5micros 0x00000c program extern c_Externo.inc
Retardo_4micros 0x00000d program extern c_Externo.inc
-
Pues bien, por lo visto hay que hacer un .asm y un .inc. En el .asm v¡ene todo el código definido en su correspondiente sección CODE y arriba de la sección un GLOBAL con todos los nombres de las funciones. Luego en el .inc viene un EXTERN con todos los nombres de las funciones declaradas en el GLOBAL. Se añade el .inc al programa principal y todo solucionado!
osea .asm
GLOBAL funcion1,funcion2
datos UDATA_SHR
dato1 res 1
codigo CODE
funcion1
nop
return
funcion2
nop
return
END
.inc
EXTERN funcion1,funcion2
programa principal
reset CODE 0
goto main
PROG1 CODE
main
nop
nop
call funcion1
goto $
END
Espero que os sirva de algo
-
el que conoce sobre ese tema es Maunix, se ha tratado varias veces en foro, para simplificar la busqueda, escribe la palabra clave: relotocable por el autor: Maunix
-
Gracias PalitroqueZ, aunque ya lo he solucionado me estoy mirando los post de Maunix que me dan bastante información. Por cierto por relotocable no encontré nada, es relocatable.
Un saludo,
Jordi
-
Gracias PalitroqueZ, aunque ya lo he solucionado me estoy mirando los post de Maunix que me dan bastante información. Por cierto por relotocable no encontré nada, es relocatable.
Un saludo,
Jordi
gracias por la correccion, se ve que no conozco el tema :8}
-
Palitroquez gracias por tus palabras. :)
Jordi ya ando de nuevo por acá (estuve ausente unos días), según el mensaje que leo estas teniendo un 'underflow' del stack.
Eso solo es posible si hubo un "return" sin un previo "call".