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...
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!
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.
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.
> 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]; }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.