www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Speicherzuweisung für Variablen


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: KaMiL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B.:
unsigned char xyz at 0x80;

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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.