Forum: Mikrocontroller und Digitale Elektronik Dynamische Speicherverwaltung


von Peter L. (louben3010)


Lesenswert?

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!

: Verschoben durch User
von Stefan M. (Gast)


Lesenswert?

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.

von ReadWrite? (Gast)


Lesenswert?

L. schrieb:
> Es soll einen Funktion geben, die auf eine gegebene Adresse einen
> bestimmten Wert schreiben soll.

L. schrieb:
> MemoryVal read (MemoryAdress addr) {
> int *p;
> p=addr;
> return (*p);
> }

???

: Bearbeitet durch Admin
von Stefan M. (Gast)


Lesenswert?

L. schrieb:
> Außerdem möchte ich Werte an speziellen Adressen auslesen lassen.

ReadWrite? schrieb:
> ???

: Bearbeitet durch Admin
von Hans (Gast)


Lesenswert?

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 ...

: Bearbeitet durch Admin
von Wolfgang (Gast)


Lesenswert?

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.

: Bearbeitet durch Admin
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.