TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Jordi en 14 de Febrero de 2008, 15:41:03

Título: Código reubicable
Publicado 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


Título: Re: Código reubicable
Publicado por: Jordi en 15 de Febrero de 2008, 13:35:00
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
Título: Re: Código reubicable
Publicado por: PalitroqueZ en 15 de Febrero de 2008, 16:50:33
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



Título: Re: Código reubicable
Publicado por: Jordi en 15 de Febrero de 2008, 18:24:26
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
Título: Re: Código reubicable
Publicado por: PalitroqueZ en 16 de Febrero de 2008, 16:57:36
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}

Título: Re: Código reubicable
Publicado por: maunix en 18 de Febrero de 2008, 12:43:25
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".