weiss denn niemand wie man Variablen an bestimmer Stelle in C definiert?
auch nicht im internen Ram?
MfG Mark
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
Geändert von p_mork (11.01.2014 um 16:34 Uhr)
weiss denn niemand wie man Variablen an bestimmer Stelle in C definiert?
auch nicht im internen Ram?
MfG Mark
In C geht das z.B. über Zeiger
Alternativ kannst Du über die Linker-Optionen gehen. Das steht u.a. in der FAQ zur LibcCode:uint8_t* bla = 0x4711; // variable an adresse 0x4711 *bla = 42;
http://www.nongnu.org/avr-libc/user-manual/FAQ.html
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:
Im Beispiel wird ein Zeiger test auf die Adresse 0x200 gesetzt.Code:char *test; test = 0x200; *test = 0xAB;
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:
Beachte: Nur die erste Variable nach __attribute__ wird in den Speicherbereich geschrieben.Code:__attribute__ ((section (".test"))) char bimbam;
Gruß,
askazo
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.
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
Lesezeichen