Forum: Mikrocontroller und Digitale Elektronik Grosse Daten Konstanten definieren in C18 Pic Compiler


von Andy -. (Gast)


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...

von holger (Gast)


Lesenswert?

const rom char[] X1 = {0,0,0,0,0,0};

von Sven W. (woehlb)


Lesenswert?

Du mußt im Linkerskript eine außreichend große Section vereinbaren und 
die Variable dieser Section zuweisen, mit den Standard-Linkerskripten 
wird das nichts. Ist bei mir aber lange her, frage mich jetzt bitte 
nicht nach Einzelheiten!

von (prx) A. K. (prx)


Lesenswert?

Da "const" Daten als Daten adressierbar sein müssen, können sie nur im 
RAM liegen. Und ist nur begrenzt Platz. Erst mit "rom" landen sie im 
ROM.

von Andy -. (Gast)


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.

von Master S. (snowman)


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];
}

von Andy -. (Gast)


Lesenswert?

Danke Master
das Problem war, dass ich das ROM nicht definiert hatte
danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.