mikrocontroller.net

Forum: Compiler & IDEs Externes SRAM am ATmega2560


Autor: Peter Strunkmann (harrybuttle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Peter Strunkmann (harrybuttle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Strunkmann wrote:

> Also bleibt als Lösung nur malloc() oder direkter Speicherzugriff mit
> Zeigern.

Oder zwei verschiedene sections.  Geht aber meiner Erinnerung nach
nicht ohne Modifikation des ldscripts ab.

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.