-         

Ergebnis 1 bis 6 von 6

Thema: Variablen an einer bestimmen Stellte im ext. Ram definieren

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522

    Variablen an einer bestimmen Stellte im ext. Ram definieren

    Anzeige

    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)

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    weiss denn niemand wie man Variablen an bestimmer Stelle in C definiert?
    auch nicht im internen Ram?

    MfG Mark

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    In C geht das z.B. über Zeiger
    Code:
    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

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    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:
    Code:
    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:
    Code:
    __attribute__ ((section (".test")))
    char bimbam;
    Beachte: Nur die erste Variable nach __attribute__ wird in den Speicherbereich geschrieben.

    Gruß,
    askazo

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    02.08.2005
    Ort
    Niederrhein
    Beiträge
    18
    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.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •