Grosse Daten Konstanten definieren in C18 Pic Compiler

Gast #1797005
Lesenswert?

Hallo
Ich versuche eine Mende Daten in einem Array zu definieren.
Die Daten müssen nicht verändert werden, also nur gelesen werden.

C18 Compiler: Daten im Code ablegen oder im Rom?

Leider bekomme ich immer diese Meldung
MPLINK 4.35, Linker
Copyright (c) 1998-2010 Microchip Technology Inc.
Error - section '.idata_wg.o' can not fit the section. Section 
'.idata_wg.o' length=0x000000a2
Errors    : 1

Ich habe das mit diversen Definitionen versucht aber igendwie gehts halt 
nicht.

const char[] X1 = {0,0,0,0,0,0};
const char[] X2 = {0,0,0,0};
const char[] X3 = {0,0,0,0,0,0,0,0};
...

oder mit
#pramag idata access Daten
near char[] X1 = {0,0,0,0,0,0};
...
#pramag idata access Daten
far char[] X1 = {0,0,0,0,0,0};
...
Wie kann ich globale constanten definieren über die 256 bits hinaus 
gehen?
Es sollte einfach auf die Daten zugegriffen werden ohne EEProm Lese- 
Funktion wenn möglich...
Gast #1797643
Lesenswert?

Danke für die Antwort,
Habe es gefunden und so definiert:
char const rom K1[] = {1,2,3,4};
char const rom K2[] = {1,2,......,24};
...
char const rom *Data[] = {K1,K2};

So weit so gut, jedoch kann ich nicht auf die Data Structur zugreifen.
Ich weiss auch nicht genau ob das so richtig definiert ist.

Ich möchte von den constanten ein Array mit welchem ich wie folgt 
zugreifen kann:

v = (&Data[1])[3];
i = sizeof((&Data[1])[3]);
oder
char s[] = Data[1];
i = sizeof(s);
v = s[3];

etwas kompliziert mit diesem MCC18 Kompiler.
#1800093
Lesenswert?

> v = (&Data[1])[3];
kommt darauf an, wie v definiert ist

> i = sizeof((&Data[1])[3]);
wahrschinlich ist die funktion so definiert:
int sizeof(unsigned char *RAMData);
müsste für ROM-zugriff so heissen:
int sizeof(rom unsigned char *RAMData);

> char s[] = Data[1];
char s[] ist ein pointer ins RAM
Data[1] ist der inhalt dieses pointers (pointer ins ROM)
[ich hoff, das stimmt, was ich sagte?]
du versuchst hier einen wert einem pointer zu übergeben, ich vermute mal 
du willst den ROM-inhalt ins RAM befördern. das musst du so machen:

void CopyROMToRAM(rom unsigned char *ROMData, unsigned char *RAMData) {
// copies ROM data to RAM
  unsigned char x;
  for (x=0; x < 16; x++) // 16 = data length
    RAMData[x] = ROMData[x];
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren