Forum: Mikrocontroller und Digitale Elektronik Arduino Due (SAM8X3E) - SRAM reservieren


von Thomas M. (ethernetbob)


Lesenswert?

Hallo!

Ich würde gerne in meinem Arduino Due bestimmten Variablen absolute 
Adressen innerhalb eines vordefinierten Adressbereichs im SRAM vergeben.

Der SRAM vom SAM8X3E geht von 0x20000000 bis 0x20100000 (SRAM0 und 
SRAM1).

Beispielsweise möchte ich den Bereich von 0x20000000 bis 0x20000100 
reservieren und zum Beispiel folgendes tun:

int *v_1 = (int*) 0x20000000;
unsigned char *v_2 = (unsigned char*) 0x20000004;
double *v_3 = (double*) 0x20000005;
unsigned char *v_4 = (unsigned char*) 0x2000000D;

...

*v_1 = 10234;
*v_2 = 120;
*v_3 = 12.54;
*v_4 = 3;

...

Somit weiß ich, welche Variable an welcher Adresse steht.

Wie verhindere ich, dass der Due die Inhalte an diesen Adressen ohne 
Erlaubnis überschreibt?

Was muss ich noch beachten, wenn ich absolute Adressen vergeben möchte?

Zum kompilieren benutze ich die Arduino IDE.

Hoffe, man kann mir hier weiterhelfen!

MfG ethernetbob

von S. R. (svenska)


Lesenswert?

> Ich würde gerne in meinem Arduino Due bestimmten Variablen absolute
> Adressen innerhalb eines vordefinierten Adressbereichs im SRAM vergeben.

Warum?

> Der SRAM vom SAM8X3E geht von 0x20000000 bis 0x20100000 (SRAM0 und
> SRAM1).

Nein.

SRAM0 geht von 0x20000000 bis 0x2000FFFF (64 KB),
SRAM1 geht von 0x20080000 bis 0x20087FFF (32 KB).
Die folgen nicht aufeinander!

> Wie verhindere ich, dass der Due die Inhalte an diesen Adressen ohne
> Erlaubnis überschreibt?

Indem du ein eigenes Linkerscript baust, in dem du dem Linker mitteilst, 
dass an diese Speicherbereiche bitte nichts geschrieben werden soll.

von Thomas M. (ethernetbob)


Lesenswert?

S. R. schrieb:
> Warum?

Ich möchte dem Due eine ASAM (CCP) Schnittstelle verpassen.

S. R. schrieb:
> Nein.

Danke für die Richtigstellung ;)

S. R. schrieb:
> Indem du ein eigenes Linkerscript baust, in dem du dem Linker mitteilst,
> dass an diese Speicherbereiche bitte nichts geschrieben werden soll.

Ist dies von der Arduino IDE überhaupt noch möglich?

von U. C. (Gast)


Lesenswert?

Thomas M. schrieb:
> Ist dies von der Arduino IDE überhaupt noch möglich?
Naja....
In der betreffenden platform.txt könntest du ein Örtchen finden...
Wenn überhaupt, dann da.

Thomas M. schrieb:
> Ich möchte dem Due eine ASAM (CCP) Schnittstelle verpassen.
Und wofür brauchst du da "besonderen" Speicher?

von ethernetbob (Gast)


Lesenswert?

U. C. schrieb:
> Und wofür brauchst du da "besonderen" Speicher?

Für die Variablen auf den Speicherseiten des Steuergerätes.

von S. R. (svenska)


Lesenswert?

Thomas M. schrieb:
> Ich möchte dem Due eine ASAM (CCP) Schnittstelle verpassen.

Das sagt mir beides nichts, spielt aber auch keine Rolle.

Die interessante Frage ist eigentlich, wie frei du in der Wahl der 
Adresse bist. Niemand hindert dich daran, ein hinreichend großes Array 
statisch zu alloziieren (eventuell mit Alignment) - dann ist der 
Speicher fuer den Compiler "belegt" und er wird dir da nicht mehr 
bewusst reinpfuschen.

Der Nachteil ist, dass du die genaue Adresse des Arrays und deiner 
Variablen erst zur Laufzeit kennst (kannst du zwar auch aus dem Mapfile 
fischen, ist aber eher Pfusch). Das reicht aber völlig aus, um damit 
z.B. einen DMA zu programmieren.

Wenn du wirklich fixe Adressen im SRAM benutzen musst, musst du das 
ueber den Linker machen. Wie das mit Arduino geht, weiß ich nicht. Bei 
besonderen Adressen (Anfang/Ende einer Bank o.ä.) solltest du besonders 
aufpassen, dass du da nichts mit der Interrupt-Vektortabelle, dem Stack 
oder anderer Peripherie ueberlappst.

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.