Programmspeicher reservieren unter C

Hallo Leute,

ich habe einen Microchip PIC Controller ohne internes EEPROM (aus Kostengr=FCnden). Nun m=F6chte ich im Flash Program memory ein EEPROM "emulieren". Dazu m=F6chte ich einen Teil des Programmspeichers reservieren so dass dieser nicht durch Sourcecode belegt wird und ich darin meine Daten abspeichern kann.

Wie kann ich dem Compiler unter HiTech C mitteilen dass ein bestimmter Bereich des Flashs f=FCr ihn "tabu" ist.

Gr=FC=DFe,

Stefan

PS: ja, ich wei=DF dass der Flash keine gro=DFen Zyklenzahlen kann.

Reply to
RS
Loading thread data ...

Und so sprach RS:

HiTech hab ich jetzt nicht im Kopf, aber es sollte gehen, indem du ein const ... irgendwas[x] anlegst, und auf eine definierte Adresse legst.

const unsigned char samples[4] @ 0x1000 = {0x00, 0x04, 0x08,0x0C};

Nicht ganz sauber, aber sollte gehen. Denke aber daran, dass du den Flash nur sektorweise gelöscht bekommst. Wenn der PIC den Programm-Flash selber löschen kann...

Roland

Reply to
Roland Ertelt

Hallo,

RS wrote: ^^ ein echter Name wäre schön

Primär ist dafür der Linker verantwortlich. Denn der platziert ja die Objekte in dem Speicher. Wenn Du also eine saubere Lösung haben willst müsstest Du das Linkerskript anpassen und dort einen Bereich (section) neu definieren. In dieser Section kannst Du dann Variablen ablegen oder auch direkt in den Adress- bereich mit Pointern schreiben. Für HiTech weiß ich nicht genau wie es geht. Bei GNU-C könnte ich Dir genau sagen wie man es macht.

Viele Grüße, Martin L.

Reply to
Martin Laabs

Am 05.08.2011 19:49, schrieb RS:

Hallo Stefan,

eine einfache Möglichkeit hat Dir Roland genannt. (Es könnte sein, dass das nicht funktioniert. Ich weiss nicht, ob das @-Attribut in jedem Fall an den Linker weitergereicht wird.)

Hier meine Idee: Grundsätzlich gibt es für den Locator, der heutzutage im Linker integriert ist, eine Ressourcendatei, in der die Speicherbereiche des Zielprozessors eingetragen sind. Die übliche Form wäre ungefähr so: .segment "code" 0xe000,0x1fff .segment "bss" 0,0x3ff Hier würde der Flashbereich von E000-FFFF mit dem Namen "code" dem Locator bekannt gemacht. Der Compiler "kennt" einige Bereiche, wie z.B. "code", "stack" oder "interruptvektorenliste", denen er seine Objekte wie z.B. Funktionen als Maschinencodeblock zuordnet. Funktionen kommen immer in einen konstanten, nicht beschreibbaren Bereich "Flash". Konstante Felder kommen auch dahin, wenn der Programmierer dass auch klar hinschreibt. #pragma INTERRUPT(ADC_RDY) void ISR_ADC(void) ... sorgt dafür, dass der Maschinencode irgendwo ins Flash kommt und der Interruptvektor mit der entsprechenden Anfangsadresse belegt wird. Ein paar dieses Zuordnungen werden schon vom Linker zugeordnet: Globale Variablen kommen in den "heap", lokale Variablen in den "stack". Beide werden in den uninitialisierten, beschreibbaren RAM-Bereich ("bss") gelegt werden. Die Größe des Heaps und des Stacks legst Du in den Optionen fest. Zurück zum eigentlichen Problem: Ich weiß weder, wie die Datei beim Hitech heißt, noch, ob die Segmente wirklich Segment genannt werden. Die könnten auch "Attribut Speicherklassse", kurz "class" oder so genannt werden. Auf jeden Fall gibt es diese Datei und Du kannst dort ein eigenes Segment eintragen. Das sollte eine Dir genehme Anzahl von Flash-Speicherseiten umfassen. (Du musst dafür ein anderes Segment verkleinern, es darf keine Doppelbelegung geben. Das Flash Seitenweise organisiert ist und Du nur ganze Seiten löschen kannst, weißt Du wohl.) Jetzt musst Du noch herausfinden, wie man diesen Bereich anspricht. Eventuell kannst Du den Segmentnamen irgendwie angeben. Eventuell kannst Du in den Linkeroptionen etwas angeben. Wenn beides nicht geht, musst Du eine kleine Assemblerdatei erzeugen. variable.asm: .segment "meinsegment" variablenname: .bss 1234 .segment legt den Segmentnamen fest und .bss reserviert einen Speicherbereich, ohne Initialisierungsdaten dafür festzulegen. zugriff.c: extern unsigned char variablenname[Länge]; Wenn Du jetzt dem Linker per Makefile o.ä. klar machen kannst, dass variable.o mit zum Projekt gelinkt werden soll, dann sollte das funktionieren. Es könnte höchstens noch sein, dass mit einem "normalen", indexierten Variablenzugriff kein Zugriff auf das Flash möglich ist, aber dann kannst Du nur noch per Assemblerfunktion mit speziellen (Maschinen-)Befehlen zugreifen. Dann musst Du die EEPROM-Emulation ganz in Assembler schreiben.

Gruß Gunther

Reply to
Gunther Mannigel

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.