PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen an einer bestimmen Stellte im ext. Ram definieren



p_mork
18.12.2006, 18:56
Hallo,
wie kann man eine Variable vom Typ char an einer bestimmten Stelle(z.B. 0x1234) in einem externen 64k-SRAM definieren? Bzw kann man das überhaupt?

MfG Mark

p_mork
19.12.2006, 13:18
weiss denn niemand wie man Variablen an bestimmer Stelle in C definiert?
auch nicht im internen Ram?

MfG Mark

ogni42
19.12.2006, 14:34
In C geht das z.B. über Zeiger


uint8_t* bla = 0x4711; // variable an adresse 0x4711

*bla = 42;


Alternativ kannst Du über die Linker-Optionen gehen. Das steht u.a. in der FAQ zur Libc
http://www.nongnu.org/avr-libc/user-manual/FAQ.html

askazo
19.12.2006, 14:38
Am einfachsten geht's über Zeiger.
Du definierst einen Zeiger vom Typ char, setzt ihn auf eine bestimmte Adresse und schreibst dort Dein char rein.
Das sieht dann so aus:

char *test;
test = 0x200;
*test = 0xAB;

Im Beispiel wird ein Zeiger test auf die Adresse 0x200 gesetzt.
Dann wird der Wert 0xAB auf eben diese Adresse geschrieben.

Ansonsten kannst Du auch dem Compiler mitteilen, wo Du eine Variable hinhaben möchtest. Wie das geht, ist von Compiler zu Compiler verschieden.

Wenn Du mit dem aktuellen AVRStudio arbeitest und den GCC-Compiler einsetzt, kannst Du folgenden Weg nehmen:

In den Projekt-Einstellungen unter "Memory Settings" erstellst Du einen neuen Speicherbereich mit dem Typ SRAM und einem beliebigen Namen, nehmen wir einmal ".test", und weißt diesem die gewünschte Adresse zu. (ob beim Namen der Punkt am Anfang sein muss, weiß ich nicht, ist aber wohl Standard. .data, .text, .eeprom und .bss sind vom Compiler reserviert, diese Namen darfst Du also nicht nehmen).

Um eine Variable, nennen wir sie mal bimbam, an diese Stelle zu bekommen, schreibst Du folgendes ausserhalb einer Funktion in Deinen C-Code:

__attribute__ ((section (".test")))
char bimbam;

Beachte: Nur die erste Variable nach __attribute__ wird in den Speicherbereich geschrieben.

Gruß,
askazo

camrob
19.12.2006, 14:39
Hi,
so wäre es mal einen Versuch Wert:

1. Im SourceCode eine Section angeben wo die Variable hin soll
unsigned int VariableAtFixAdress __attribute__ ((section (".FixAdressSection"))) ;

2. Im makefile diese Section definieren und angeben wo diese liegen soll.
Bei RAM Adress definitionen muß immer 0×800000 addiert werden, damit der Compiler/Linker weiss daß es sich um RAM handelt.
CFLAGS += -Wl,-section-start=.FixAdressSection=0x800080

3. Make aufrufen und anschließend in das *.map File schauen, da müsste jetzt sowas auftauchen wie
.FixAdressSection
0x00800080 0x2

d.h. daß ab Adresse 0x80 - 2 Bytes reserviert sind.

Aufpassen muß man mit Adress Überlappungen und dem Stackbereich. Am besten die ".data" - Section verkleinern, damit der Linker da nix hinlegt.

p_mork
19.12.2006, 17:10
danke erstmal....
und wo fängt der Adressbereich des externen SRAMS an?
und wieviele Takte braucht der Contoller überhaupt, um ein byte aus dem externen RAM auszulesen?

MfG Mark