Forum: Compiler & IDEs Externes SRAM am ATmega2560


von Peter S. (harrybuttle)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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).

von Peter S. (harrybuttle)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von mthomas (Gast)


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

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.