Forum: Mikrocontroller und Digitale Elektronik Speicherzuweisung für Variablen


von Martin (Gast)


Lesenswert?

Hallo Leute!

Ich habe den Keil-Compiler und programmiere (in C) einen C167-µC 
(Eval-Board C167CR 256K Flash und 64K Ram). Diesen µC habe ich um 
zusätzliche 32K-Byte erweitert. Die Speicherkonfiguration ist schon 
richtig eingestellt.
Der Keil-Compiler mapped mir die Speicher richtig z.B:
HDATA (0x40000-0x4FFFE, 0x50000-0x57FFF), HDATA0 (0x40000-0x4FFFE, 
0x50000-0x57FFF)

Hier werden einmal die 64K und dann die 32K gemappt.

Meine Frage:
Wie kann ich ein Feld auf eine bestimmte Adresse bringen.
Wenn ich jetzt ein Feld initialisiere:
unsigned char huge feld[50000];
unsigned char huge feld2[30000];

Hier wird das erste Feld auf Adresse 0x40000 gebracht und das zweite 
folgt.
Wie kann ich Feld2 direkt auf Adresse 0x50000 bringen? Also auf den 
32K-Speicher.

Mit dem CodeVisionAVR-Compiler von Atmel geht das ganz einfach mit:
unsigned char feld[200] @0x260; // Beginn externes Ram

Nur programmiere ich jetzt keinen Atmel, sondern einen Infineon. Wie 
geht das bei diesem Compiler? In der Beschreibung habe ich auch nichts 
gefunden. Oder habe ich es übersehen.

Vielen Dank für eure Antwort.

Martin

von Alfred (Gast)


Lesenswert?

Hallo Martin!

Ich habe leider einen anderen Compiler. Da funktioniert das mit der 
Speicherzuweisung so:
at SPEICHERADRESSE unsigned char feld[FELDGRÖßE];

Versuch es mal.

Tschüss
Alfred

von KaMiL (Gast)


Lesenswert?

z.B.:
unsigned char xyz at 0x80;

Mit at kann man die Variable auf einen fixen Speicherplatz legen, 
glaub ich halt.

von Martin (Gast)


Lesenswert?

Hallo KaMiL!

Danke für deine Antwort aber es geht so nicht.

Ich habe eine geraume Zeit in der Beschreibung gesucht und eine 
Möglichkeit gefunden.

In Targetoptions muss man eine neue Klasse definieren.
z.B. neuklasse(0x10000-0x20000)

Danach muss man ein neues C-File anlegen, worin die entsprechenden 
Variablen global initialisiert werden, die
sich in dem angegebenen Speicherbereich befinden sollen.
z.B:
#pragma RENAMECLASS (XDATA=neuklasse)

#pragma NOINIT

 unsigned char xhuge feld32[2000];
 unsigned char xhuge feld64[1000];

Die existierende Klasse XDATA wird auf die neu angelegte Klasse 
neuklasse umbenannt. Durch die Beifügung xhuge, bei der Initialisierung 
der Variablen, weiß der Compiler, dass es sich um die XDATA-Klasse 
handelt. Da diese aber in neuklasse umbenannt wurde, gilt in diesem 
C-File der Speicherbereich von neuklasse.
Damit man nun diese Felder z.B. in der Hauptfunktion Main benutzen kann, 
muss man sie mit "extern" in jenes File hinüberholen, in welchem sich 
eben die Funktion Main befindet.
Diese Definition ist ebenfalls global.
z.B.:
extern unsigned char xhuge feld32[2000];
extern unsigned char xhuge feld64[1000];

void main(void)
{
.
.
.
}

Es ist zwar etwas umständlich (meiner Meinung nach), aber es 
funktioniert (Endlich!!!).

Tschüss
Martin

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.