Externes SRAM am ATmega2560

OP #696468
Hallo zusammen,

ich habe ein SRAM mit dem ATmega2560 verbunden.
Das funktioniert auch soweit gut, wenn ich direkt auf
die Speicheradressen zugreife.

Nun liegt der externe SRAM-Bereich an Adresse 0x(80)8000 .. 0x(80)FFFF
und der interne SRAM-Bereich von 0x(80)0200 .. 0x(80)2200 .

Der Bereich von 0x(80)2200 .. 0x(80)7FFF ist durch ein ASIC belegt.

Wie kann ich dem Linker beibringen, das der .data-Bereich
zwei Adressbereiche beinhaltet?

Oder: Kann ich den Adressbereich des ASIC irgendwie für den Linker 
ausblenden?

Ich möchte, das der Linker Variablen implizit sowohl in den internen als 
auch in den externen Speicher legt.

Ich möchte nicht mit _attribute_ explizit den Speicherort angeben 
müssen.
Auch mmöchte ich malloc() vermeiden.

Hat jemand eine Idee?

Gruß
Harry
Moderator Persönliche Seite
Peter Strunkmann wrote:

> Wie kann ich dem Linker beibringen, das der .data-Bereich
> zwei Adressbereiche beinhaltet?

Gar nicht.  Eine section muss immer zusammenhängend sein.  Du
kannst natürlich zwei sections nehmen.

> Oder: Kann ich den Adressbereich des ASIC irgendwie für den Linker
> ausblenden?

Das willst du nicht ohne weiteres tun: unterhalb von 0x2200 wird
nämlich standardmäßig der Stack angelegt, und den sollte man auch
im internen SRAM lassen.

> Auch mmöchte ich malloc() vermeiden.

Warum?  Aus religiösen Gründen?

Was genau hast du denn an großen Dingen, die du in den externen RAM
legen kannst und willst?  Der ist ja beim Zugriff einen Takt langsamer
als der interne, schon unter diesem Gesichtspunkt solltest du die
Kontrolle darüber behalten, was wo liegt.  Man kann sich den
externen Speicher ja auch einfach mit der Hand aufteilen und dann
nur mit Zeigern dahin arbeiten.

Du kannst versuchen, in einer Assemblerdatei ein Objekt anzulegen,
das den Bereich des ASICs abdeckt und dieses Objekt dann an eine
bestimmte Stelle zu bringen, aber erstens bin ich mir nicht im
Klaren, ob das ohne eine eigene section überhaupt wirklich geht,
zweitens sehe ich keinen rechten Vorteil gegenüber einem ordentlichen
Konzept für die Speicheraufteilung.  Irgendwas musst du ja ohnehin
anfassen, selbst bei einem zusammenhängenden .data (dann wäre es
der Stack, den du schieben musst).
OP
Jörg Wunsch wrote:
> Peter Strunkmann wrote:
>> Auch mmöchte ich malloc() vermeiden.
>
> Warum?  Aus religiösen Gründen?

;-) So ähnlich.

Dein Einwand mit dem Stack stimmt,
ich möchte ihn natürlich im internen SRAM belassen.

Also bleibt als Lösung nur malloc() oder direkter Speicherzugriff mit 
Zeigern. Ich weiß derzeit selbst noch nicht, was genau in den Speicher 
kommt. Mal sehen, was dann sinnvoller ist.

Danke für die schnelle Info.
Gast
Der Ansatz zur "dynamischen" Speicherverwaltung im Beispielcode zum 
Atmel DB101 ist vielleicht einen Blick wert. Das System beruht auf der 
Einteilung eines "Pseudo-Heaps" in Blöcke, die ihrerseits wieder in 
Segmente unterteilt werden. Innerhalb eines Blocks sind alle Segmente 
gleich gross. Es sieht "nach aussen" etwas wie malloc/free aus, 
Speicherfragmentierung wird dadurch jedoch vermieden. Im DB101 
Beispielcode liegt der "Pseudo-Heap" im internen SRAM. Die Byte-Arrays, 
in denen die Blöcke abgelegt werden, kann man jedoch mit einem section 
attribute versehen und diese Section dann per Kommandozeilenparameter an 
den Linker (section-start) einem Speicherbereich im externen RAM 
zuweisen.

Martin Thomas

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 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.