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
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).
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.