Dynamische Speicherverwaltung

OP #3903855
Hallo,
ich arbeite mit einem ATmega644 und möchte gerne eine dynamische 
Speicherverealtung auf dem SRAM von 4Kb implementieren.
Die Frage jedoch ist, wie ich gezielt werde im Speicher schreiben kann?
Es soll einen Funktion geben, die auf eine gegebene Adresse einen 
bestimmten Wert schreiben soll.
Leider kann ich ja nicht einfach schreiben:
1
0x0012=4;
Außerdem möchte ich Werte an speziellen Adressen auslesen lassen.
Meine Idee bisher war, einen Pointer zu initialisieren, dem diese 
Adresse zu geben und dann einfach mit * zu dereferenzieren. Das scheint 
jedoch nicht zu funktionieren.
1
 //typedefs in der Header Datei:
2
//typedef uint16_t MemoryAdress
3
//typedef uint8_t MemoryVal
4

5
MemoryVal read (MemoryAdress addr) {
6
int *p;
7
p=addr;
8
return (*p);
9
}

Irgendwie stehe ich gerade auf dem Schlauch.
Bin über jeden Tipp und jede Hilfe dankbar.

Schönes Wochenende!
Gast
Sinn oder Unsinn hin oder her, sollte klappen.

p sollte aber kein int* sondern uint8_t* sein.
Die Zuweisung müsste eine Warnung erzeugen, hier evtl. casten.

Aber klappen müssts.
Gast
L. schrieb:
> Leider kann ich ja nicht einfach schreiben:
>0x0012=4;

Mit einem Cast geht es:
1
*((uint8_t*) 0x0012) = 4;

L. schrieb:
> Meine Idee bisher war, einen Pointer zu initialisieren, dem diese
> Adresse zu geben und dann einfach mit * zu dereferenzieren. Das scheint
> jedoch nicht zu funktionieren. //typedefs in der Header Datei:
> //typedef uint16_t MemoryAdress
> //typedef uint8_t MemoryVal
>
> MemoryVal read(MemoryAdress addr) {
> int *p;
> p=addr;
> return (*p);
> }

Auch da brauchst Du einen Cast, damit es ohne Warnung geht:
1
MemoryVal read(MemoryAdress addr) {
2
  MemoryVal* p;
3
  p = (MemoryVal*) addr;
4
  return *p;
5
}

Oder kürzer:
1
MemoryVal read(MemoryAdress addr) {
2
  return *((MemoryVal*) addr);
3
}

Allerdings würde ich Dir dringend davon abraten, direkt mit den 
physischen Addressen zu hantieren. Leg Dir lieber ein großes Array an, 
aus dem Du Speicher vergibst:
1
MemoryVal dynamicMemoryBuffer[4096];
2

3
MemoryVal read(MemoryAdress addr) {
4
  return dynamicMemoryBuffer[addr];
5
}

Oder nimm gleich malloc, dann kannst Du Dir die Arbeit sparen ...
Gast
L. schrieb:
> ich arbeite mit einem ATmega644 und möchte gerne eine dynamische
> Speicherverealtung auf dem SRAM von 4Kb implementieren.

Und welche Vorteile versprichst du dir gegenüber einer statischen 
Speicherplatzvergabe. Bei 4kB stehen die Chancen eher schlecht, dass du 
spontan vom Betriebssystem größere Speicherblöcke anfordern kannst. 
Entweder dein Kram paßt in die 4kB rein, oder nicht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.