Autor Tema: Intentando entender archivo.lkr de C18  (Leído 3740 veces)

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

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Intentando entender archivo.lkr de C18
« en: 03 de Marzo de 2011, 13:31:16 »
Bueno, en el proceso de pasar a C18, me encuentro con un archivo de gran importancia para definir el comportamiento del compilador y así dejar claros varios parámetros de gestión de los recursos de memoria RAM Y ROM del microcontrolador.


Estos archivos los tiene predefinidos el compilador C18 en la carpeta "C:\MCC18\bin\LKR", pero si fuera solo mantener los que trae por defecto dejaría de tener importancia un estudio detallado sobre dicho archivo.

Mi gran sorpresa y motivación para este estudio surge cuando intento meter FreeRTOS en el microcontrolador usando C18 y llego a un punto donde es indispensable modificar este archivo para definir bloques de RAM y mas cuando quiero que el FreeRTOS conviva con Bootloader HID.



Pa este estudio, estoy usando a mi parecer el mejor microcontrolador de 8bits de Microchip, con una memoria FLASH sin comparación  entre PIC18xxx





Las siguientes lineas pertenecen al archivo 18f47j53_g.lkr, original tal cual lo instala C18.
Código: C
  1. // File: 18f47j53_g.lkr
  2. // Generic linker script for the PIC18F47J53 processor
  3.  
  4. #DEFINE _CODEEND _DEBUGCODESTART - 1
  5. #DEFINE _CEND _CODEEND + _DEBUGCODELEN
  6. #DEFINE _DATAEND _DEBUGDATASTART - 1
  7. #DEFINE _DEND _DATAEND + _DEBUGDATALEN
  8.  
  9. LIBPATH .
  10.  
  11. #IFDEF _CRUNTIME
  12.   #IFDEF _EXTENDEDMODE
  13.     FILES c018i_e.o
  14.     FILES clib_e.lib
  15.     FILES p18f47j53_e.lib
  16.  
  17.   #ELSE
  18.     FILES c018i.o
  19.     FILES clib.lib
  20.     FILES p18f47j53.lib
  21.   #FI
  22.  
  23. #FI
  24.  
  25. #IFDEF _DEBUGCODESTART
  26.   CODEPAGE   NAME=page       START=0x0               END=_CODEEND
  27.   CODEPAGE   NAME=debug      START=_DEBUGCODESTART   END=_CEND        PROTECTED
  28. #ELSE
  29.   CODEPAGE   NAME=page       START=0x0               END=0x1FFF7
  30. #FI
  31.  
  32. CODEPAGE   NAME=config     START=0x1FFF8           END=0x1FFFF        PROTECTED
  33. CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF       PROTECTED
  34.  
  35. #IFDEF _EXTENDEDMODE
  36.   DATABANK   NAME=gpre       START=0x0               END=0x5F
  37. #ELSE
  38.   ACCESSBANK NAME=accessram  START=0x0               END=0x5F
  39. #FI
  40.  
  41. DATABANK   NAME=gpr0       START=0x60              END=0xFF
  42. DATABANK   NAME=gpr1       START=0x100             END=0x1FF
  43. DATABANK   NAME=gpr2       START=0x200             END=0x2FF
  44. DATABANK   NAME=gpr3       START=0x300             END=0x3FF
  45. DATABANK   NAME=gpr4       START=0x400             END=0x4FF
  46. DATABANK   NAME=gpr5       START=0x500             END=0x5FF
  47. DATABANK   NAME=gpr6       START=0x600             END=0x6FF
  48. DATABANK   NAME=gpr7       START=0x700             END=0x7FF
  49. DATABANK   NAME=gpr8       START=0x800             END=0x8FF
  50. DATABANK   NAME=gpr9       START=0x900             END=0x9FF
  51. DATABANK   NAME=gpr10      START=0xA00             END=0xAFF
  52. DATABANK   NAME=gpr11      START=0xB00             END=0xBFF
  53.  
  54. #IFDEF _DEBUGDATASTART
  55.   DATABANK   NAME=gpr12      START=0xC00             END=_DATAEND
  56.   DATABANK   NAME=dbgspr     START=_DEBUGDATASTART   END=_DEND           PROTECTED
  57. #ELSE //no debug
  58.   DATABANK   NAME=gpr12      START=0xC00             END=0xCFF
  59. #FI
  60.  
  61. DATABANK   NAME=gpr13      START=0xD00             END=0xDFF
  62. DATABANK   NAME=gpr14      START=0xE00             END=0xEAF
  63. DATABANK   NAME=sfr14      START=0xEB0             END=0xEFF          PROTECTED
  64. DATABANK   NAME=sfr15      START=0xF00             END=0xF5F          PROTECTED
  65. ACCESSBANK NAME=accesssfr  START=0xF60             END=0xFFF          PROTECTED
  66.  
  67. #IFDEF _CRUNTIME
  68.   SECTION    NAME=CONFIG     ROM=config
  69.   #IFDEF _DEBUGDATASTART
  70.     STACK SIZE=0x100 RAM=gpr11
  71.   #ELSE
  72.     STACK SIZE=0x100 RAM=gpr12
  73.   #FI
  74. #FI

continuara...
« Última modificación: 03 de Marzo de 2011, 13:33:36 por LABmouse »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Intentando entender archivo.lkr de C18
« Respuesta #1 en: 03 de Marzo de 2011, 14:52:20 »
El único comentario que tengo al respecto es cuando se unen varios bancos de memoria, tener cuidado de no crear variables multi-bytes que queden entre dos bancos (por ejemplo int k; donde queda entre 0xFF y 0x100). El compilador no tiene en cuenta ese caso y una asignación a la variable se hace de forma incorrecta.

Habría que estudiarlo mas a fondo como se puede solucionar, en mi caso solo tuve la precaución.


Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Intentando entender archivo.lkr de C18
« Respuesta #2 en: 03 de Marzo de 2011, 16:38:08 »
Hola, algunos comentarios. En primer lugar Ernesto esto atañe unicamente al linker, generalmente este tipo de archivos se llaman link control file, el compilador no deberá saber nada de esto. Con respecto a lo que dice Suky, capaz con un tipo de alineación se pueda resolver eso, en otra que arquitectura trabajé podrias definir  para los tipos de datos una alineación distinta, es decir para char alineación a un byte, para int alineación a dos bytes, de esta manera una variable int siempre quedaría en una dirección par y nunca ocurriría lo que mencionas, el costo de esto es desperdicio de memoria.

Saludos !

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Intentando entender archivo.lkr de C18
« Respuesta #3 en: 03 de Marzo de 2011, 16:46:18 »
Definitivamente esto del archivo LINKER es de una importancia tal que programar sin conocerlo, seria como caminar con lo ojos vendados.

Muchas gracias por estos comentarios que enriquece este estudio iniciado. Estoy atento de nuevos comentarios y aportes.


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Intentando entender archivo.lkr de C18
« Respuesta #4 en: 03 de Marzo de 2011, 17:00:56 »
Hola Ernesto, si queres puedo hacer una breve descripción de como hace el compilador para el tratamiento de variables y código.

Saludos !

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Intentando entender archivo.lkr de C18
« Respuesta #5 en: 03 de Marzo de 2011, 18:38:58 »
Pues amigo, yo la verdad entiendo algunas cosas básicas del archivo, pero nada mas de lo que parece obvio.

Seria interesante tu explicación.
 

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Intentando entender archivo.lkr de C18
« Respuesta #6 en: 03 de Marzo de 2011, 21:31:59 »
Con respecto a lo que dice Suky, capaz con un tipo de alineación se pueda resolver eso, en otra que arquitectura trabajé podrias definir  para los tipos de datos una alineación distinta, es decir para char alineación a un byte, para int alineación a dos bytes, de esta manera una variable int siempre quedaría en una dirección par y nunca ocurriría lo que mencionas, el costo de esto es desperdicio de memoria.

Saludos !

mmm... Hay que leer el Help, y buscar algo al respecto. Gracias Richi!

LABMOUSE, vi que la idea es trabajar FreeRTOS junto al bootloader, y en el *lkr del proyecto hay que definir el sector que ocupa el bootloader en la memoria de programa y protegerlo, así el linkeador no trabaja en ese sector y solo el programador puede fijar cierto código en él. Por ejemplo, cuando se usa el Bootloader HID se hace:


CODEPAGE   NAME=bootloader START=0×0                END=0xFFF          PROTECTED
CODEPAGE   NAME=vectors    START=0×1000         END=0×1029          PROTECTED
CODEPAGE   NAME=page       START=0x102A            END=0x..... // Depende del microcontrolador


Y después en código si haces el salto a los vectores re-ubicados:

Código: C
  1. #define REMAPPED_RESET_VECTOR_ADDRESS           0x1000
  2. #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS  0x1008
  3. #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS   0x1018
  4.  
  5. void YourHighPriorityISRCode();
  6. void YourLowPriorityISRCode();
  7.    
  8. extern void _startup (void);        // See c018i.c in your C18 compiler dir
  9. #pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
  10. void _reset (void){
  11.     _asm goto _startup _endasm
  12. }
  13. #pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
  14. void Remapped_High_ISR (void)   {
  15.      _asm goto YourHighPriorityISRCode _endasm
  16. }
  17. #pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
  18. void Remapped_Low_ISR (void){
  19.      _asm goto YourLowPriorityISRCode _endasm
  20. }
  21.    
  22. #pragma code HIGH_INTERRUPT_VECTOR = 0x08
  23. void High_ISR (void)    {
  24.      _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
  25. }
  26. #pragma code LOW_INTERRUPT_VECTOR = 0x18
  27. void Low_ISR (void){
  28.      _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
  29. }
  30. #pragma code
  31.    
  32. #pragma interrupt YourHighPriorityISRCode
  33. void YourHighPriorityISRCode()  {
  34. }   //This return will be a "retfie fast", since this is in a #pragma interrupt section
  35.  
  36. #pragma interruptlow YourLowPriorityISRCode
  37. void YourLowPriorityISRCode()   {
  38.  
  39. }   //This return will be a "retfie", since this is in a #pragma interruptlow section

El tema de la RAM, hay que borrar todos los bancos de 256 bytes y crear uno solo del total de la memoria.


Saludos!

No contesto mensajes privados, las consultas en el foro