Autor Tema: Modificar Fichero .LKR Pic PIC18F97J60 Array Buffer maximo de posiciones.  (Leído 88 veces)

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

Desconectado andres6969

  • PIC10
  • *
  • Mensajes: 8
Hola a todos los usuarios del foro.  Para el pic PIC18F97J60
Se me plantea el siguiente problema, necesito un array del mayor numero de posiciones posibles. Para ello he modificado el fichero LKR del pic y he conseguido obtener un array de 2816 posiciones.  buffer[2816]".  Pero necesito más posiciones.  Todas las que sean posibles.

Este es el fichero LKR,  la parte con // está comentada.   
Me gustaría introducir algún banco, por ejemplo:
DATABANK   NAME=gpr14      START=0xE00          END=0xE7F
y el:
DATABANK   NAME=gpr15      START=0xF00          END=0xF5F

Si es posible......
Esta es la configuración del fichero LKR:

// File: 18f97j60.lkr
// Sample linker script for the PIC18F97J60 processor

LIBPATH .

FILES c018i.o
FILES clib.lib
FILES p18f97j60.lib

CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED
CODEPAGE   NAME=page       START=0x2A           END=0x1FFF7
CODEPAGE   NAME=config     START=0x1FFF8        END=0x1FFFD        PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED

ACCESSBANK NAME=accessram  START=0x0            END=0x5F
DATABANK   NAME=gpr0       START=0x60           END=0xFF
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
//DATABANK   NAME=gpr2       START=0x200          END=0x2FF
//DATABANK   NAME=gpr3       START=0x300          END=0x3FF

DATABANK   NAME=big        START=0x200          END=0xCFF          PROTECTED
//DATABANK   NAME=gpr3       START=0x380          END=0x3FF

//DATABANK   NAME=gpr4       START=0x400          END=0x4FF
//DATABANK   NAME=gpr5       START=0x500          END=0x5FF
//DATABANK   NAME=gpr6       START=0x600          END=0x6FF
//DATABANK   NAME=gpr7       START=0x700          END=0x7FF
//DATABANK   NAME=gpr8       START=0x800          END=0x8FF
//DATABANK   NAME=gpr9       START=0x900          END=0x9FF
//DATABANK   NAME=gpr10      START=0xA00          END=0xAFF
//DATABANK   NAME=gpr11      START=0xB00          END=0xBFF
//DATABANK   NAME=gpr12      START=0xC00          END=0xCFF
DATABANK   NAME=gpr13      START=0xD00          END=0xDFF
DATABANK   NAME=gpr14      START=0xE00          END=0xE7F
DATABANK   NAME=sfr14      START=0xE80          END=0xEFF          PROTECTED
DATABANK   NAME=gpr15      START=0xF00          END=0xF5F
ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          PROTECTED

//SECTION    NAME=CONFIG     ROM=config
SECTION    NAME=buffer_scn   RAM=big

STACK SIZE=0x100 RAM=gpr13


Espero vuestra ayuda.    Gracias.   
Saludos. Andrés. 




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8030
Re:Modificar Fichero .LKR Pic PIC18F97J60 Array Buffer maximo de posiciones.
« Respuesta #1 en: 19 de Febrero de 2021, 11:56:27 »
Esta creado como global?

XC8 permite unicamente la creacion de auto-variables de un maximo de 256. Es decir los que van al stack, sino usualmente cuando lo pones como static, no se guardan en el stack y no tendrias problemas..


Programa ejemplo usando XC8 v5.35

Código: C
  1. char buffer[3700];
  2. #include <xc.h>
  3.  
  4. void main(void) {
  5.     while(1);
  6. }
  7.  

Salida:

Citar
Memory Summary:
    Program space        used    26h (    38) of 1FFF8h bytes   (  0.0%)
    Data space           used   E74h (  3700) of   EE0h bytes   ( 97.2%)
    Configuration bits   used     3h (     3) of     3h words   (100.0%)

make[2]: Leaving directory 'D:/Proyectos/TestC.X'
make[1]: Leaving directory 'D:/Proyectos/TestC.X'

BUILD SUCCESSFUL (total time: 1s)

Sin tocar absolutamente nada en el linker (que esta version de compilador no lo permite), y con ese PIC


Esto tambien funciona:

Código: C
  1. #include <xc.h>
  2.  
  3. void main(void) {
  4.     static char buffer[3700];
  5.     while(1);
  6. }

Esto NO funciona, por lo ya comentado.

Código: C
  1. #include <xc.h>
  2.  
  3. void main(void) {
  4.     char buffer[3700];
  5.     while(1);
  6. }

« Última modificación: 19 de Febrero de 2021, 12:19:56 por KILLERJC »

Desconectado andres6969

  • PIC10
  • *
  • Mensajes: 8
Re:Modificar Fichero .LKR Pic PIC18F97J60 Array Buffer maximo de posiciones.
« Respuesta #2 en: 19 de Febrero de 2021, 13:20:16 »
Hola KILLERJC,  gracias por tu pronta respuesta.  Gracias. ((:-)) ((:-)) ((:-))
Esta creado como global?  Si, está declarada como global.  Necesito que sea global ya que la utilizo en las interrupciones.  Si se te ocurre otra opción, soy todo oídos....   :lol: :lol: :lol: :lol: :lol:

static char buffer[2816];


En local sin  problemas....   ;-)  Pero no me vale ........   :5] :5] :5]
char buffer_1234[];

void main(void) {
    buffer_1234[3700];
    while(1);
}
----------------------------------------------------------------------
BUILD SUCCEEDED

Por eso necesito modificar + el fichero lkr para poder tener mas posiciones de esta variable global.  :-/ :-/
Estoy utilizando estas versiones:
C18 -> Executing: "C:\MCC18\bin\mcc18.exe
Language tool versions: mpasmwin.exe v5.50, mplib.exe v4.48

Saludos. Andrés.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8030
Re:Modificar Fichero .LKR Pic PIC18F97J60 Array Buffer maximo de posiciones.
« Respuesta #3 en: 19 de Febrero de 2021, 14:40:26 »
Disculpa pero no uso c18, creo que dejo de existir hace bastante ya (2014)

De todas formas tu codigo no le encuentro sentido. Segun ANSI C deberias tener un entero dentro de los [], el unico caso que encuentro es cuando vos definis el array y dejas que el compilador reserve el espacio de memoria.

Ej...

char buffer_1234[] = "Hola";

El compilador directamente crea buffer_1234, con 5 lugares (ya que incluye el carracter nulo del string \0 )

Luego obviamente si queres podes acceder a donde quieras... Por mas que tenga 5 lugares podes hacer

buffer_1234[20]
Y esto te va a devolver lo que posee la posicion de memoria base + esos 20 char de lugar es decir ->       *(buffer_1234  + 20)

Pero esto se consideraria un index overflow del array. Que es algo que deberias evitar. Entonces vamos a tu codigo:

Citar
char buffer_1234[];        Esto crea un array¿? que tamaño? cri cri, rara una declaracion donde no hay nada

void main(void) {
    buffer_1234[3700];    //Esto accede a la posicion base + 3700 caracteres mas, y devuelve el valor... No define que tiene 3700 elementos
    while(1);
}


La sintaxis correcta seria

Código: C
  1. char buffer_1234[3700];
  2.  
  3. void main(void) {
  4.     while(1);
  5. }

Edit:


Revisando un poco C99

An array type of unknown size is an incomplete type. It is completed, for an identifier of that type, by specifying the size in a later declaration (with internal or external linkage).
A structure or union type of unknown content (as described in 6.7.2.3) is an incomplete type. It is completed, for all declarations of that type, by declaring the same structure or union tag with its defining content later in the same scope.

Basicamente lo que hiciste arriba es un identificador, pero que luego lo tenes que definir dentro del codigo... El problema que no indica donde ubicarlo, sino proveer un acceso a la declaracion sea donde se ubique.. Considero mas util para cuando tenes otros archivos.
« Última modificación: 19 de Febrero de 2021, 14:50:03 por KILLERJC »