Hallo Leute, ich wollte mal wissen, wie ich den externen Bereich bei einem 8515 erreichen kann. Ich kann an den ja bis zu 64k exterenen Speciher ranhängen. Nun die Fragen: 1.) Wie kann ich gcc sagen, dass "da noch was ist" und ggf. auch sagen, welche Variablen ausgelagert werden sollen? 2.) Kann ich dem GCC sagen, welche Progammteile in ein ggf. exteres Flash geladen werden sollen (So dass der Chip sich selbst programmieren kann sollten gewisse Teile des Programms komplett im internen Speicher liegen!) 3.) Wenn ich nur 32k RAM und 32k Flash einsetzen will, wie ist das dann organisiert? An welcher Adresse ist der externe RAM zu erreichen? Woher weiß das Programm, dass die Code-Ausführung an der Stelle 32k weiter zu machen ist (dass er mir also nicht meine RAM-Plätze ausliest und interpretiert ;-))? Oder liegt der RAM besser hinten und es gibt eine RAM-Lücke? Wie sage ich das dann dem GCC? MfG Christian
Die Harvard-Architektur der AVR-Controller trennt Speicher für Daten und Programmcode. Der extern anschließbare Speicher erweitert nur den Datenspeicher, nicht aber den Speicher für Programmcode. Damit erübrigt sich Frage 2 und ein Teil von Frage 3. Die Größe des verfügbaren Speichers (und die Tatsache, daß überhaupt externer Speicher angeschlossen ist) müsste im Linkerscript konfiguriert werden können. Ob der Startupcode dann das externe Speicherinterface korrekt konfiguriert oder ob Du Dich darum selber kümmern musst, entzieht sich meiner Kenntnis, Jörg aber wird das mit Sicherheit wissen.
Und bei einem 8051er? (vgl. anderer Beitrag von mir von heute abend http://www.mikrocontroller.net/forum/read-1-413149.html) MfG Christian
Der hat zwar auch eine Harvard-Architektur, ist aber in der Lage, Zugriffe auf Daten- und Programmspeicher gemeinsam auf den externen Speicherbus auszuführen ... muss er ja auch können, da es ROMlose 8051-Varianten gibt, an die ein externes EPROM anzuschließen ist. Wie Du bei sdcc einstellst, daß Du externes RAM und externes ROM hast, wirst Du der Dokumentation entnehmen müssen.
OK, das mit den 8051ern hat sich wohl vorerst erledigt (kein Prog-Dongle). Nun bleibt die Frage, wie ich gcc mitteile, dass da noch einiges an Speicher ist. MfG Christian
Dem LSS-Output zufolge ist in WINAVR das Programm-Segment unabhängig vom Controller-Typ immer 128KB gross, das Datensegment immer knapp 64K (abzüglich Reg- und I/O-Range). Wodurch ein Flash- oder RAM-Überlauf eines Mega16-Programms erst vom ISP-Programmer (Flash) oder vom Programmierer (RAM) festgestellt wird, nicht aber vom Linker. Daher interessiert sich der Compiler nur dafür, mit welchem Anfangswert der Stackpointer geladen werden soll. Was man mit -minit-stack=NNNN beeinflussen kann.
Ich verwende aber statt WINAVR avr-gcc. Und da ist es interessant, insbesondere wegen der Performance (will ein Dateisystem ansprechen. Da muss ich bestimmte Blöcke einfach im RAM halten; Und genau hier will ich auslagern. Der Rest kann zum Teil auch drinnnen bleiben (sollte auch). MfG Christian
Was passiert, wenn du 40KB statische Daten anlegst? Meckert irgendwer? Wenn nicht: siehe oben. Wenn doch, hast du möglicherweise im Make-Prozedere irgendwo ein Linker-Script liegen und dort steht die RAM-Grösse drin. Und wenn du den erweiteren Speicher nur für besondere Zwecke verwenden willst, weil externer Speicher langsamer ist als interner, musst du bzgl. GCC überhaupt nichts tun. Der Compiler wird ihn nicht von sich aus verwenden. Statt ist dein Programm voll und ganz selber für die Verwaltung dieses Speichers verantwortlich.
» Und wenn du den erweiteren Speicher nur für besondere Zwecke verwenden » willst, weil externer Speicher langsamer ist als interner, musst du » bzgl. GCC überhaupt nichts tun. Der Compiler wird ihn nicht von sich » aus verwenden. Statt ist dein Programm voll und ganz selber für die » Verwaltung dieses Speichers verantwortlich. Wie kann ich das in meinem Programm machen? Wie lauten die jeweiligen C-Codes/Linker-Parameter? Oder muss ich dann den RAM manuell ansprechen? Also praktisch faktisch den RAM-Zugriff selber programmieren und so pro Byte mehrere (schätzungsweise 20-30) Maschinenzyklen verwenden? MfG Christian
"Wie lauten die jeweiligen C-Codes/Linker-Parameter?" Es gibt dafür keine, weil keine nötig sind. "Oder muss ich dann den RAM manuell ansprechen?" Ja. "so pro Byte mehrere (schätzungsweise 20-30) Maschinenzyklen verwenden?" Warum? Mit char *p = (char *)0x1000; hast du einen Pointer auf Speicher ab Adresse 0x1000.
Also nochmal: Entweder überlässt du das Compiler/Library. Dann habe ich den Parameter oben genannt. Oder du macht es selber. Dann macht du es selber. Selber. Du. Nicht der Compiler, Library, usw. Nix einzustellen. Selber wissen, selber tun. Entscheide dich für eine Variante.
@ A.K: » so pro Byte mehrere (schätzungsweise 20-30) Maschinenzyklen » verwenden?" » » Warum? OK, hat sich erledigt. Ich danchte daran, den Speicher komlett manuell zu steuern (über normele Port-IO!) MfG Christian
Ich hab noch ein bisschen gestöbert: Was hat es eigentlich mit der malloc() Funktion auf sich? Ist das nicht so was wie ich suche? MfG Christian
> Was hat es eigentlich mit der > malloc() Funktion auf sich? Das sollte in jedem normalen C-Buch beschrieben sein. Damit implementiert C dynamische Speicherverwaltung. > Ist das nicht so was wie ich suche? Kann sein, muss aber nicht. Zumindest beschreibt das Handbuch die Optionen, wie man z. B. die normalen Variablen (und vor allem den Stack) im internen RAM lässt (die Zugriffe dort sind einen Takt schneller als der externe RAM), aber malloc() auf den externen RAM stellen kann.
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.