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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.