Arduino Due (SAM8X3E) - SRAM reservieren

OP #4499747
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
#4500653
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.
#4503679
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren