Hallo, ich suche eine Möglichkeit die Vector Tabelle innerhalb meines Bootcodes zu verschieben. Das Problem, mein Bootcode umfasst ca 6kByte. vom ATMEG168 werden aber nur 4Kb unterstüzt. jetzt könnt ich einfach die oberen 6Kb benutzen muss aber die VectorTabelle auf einen der vier möglich Werte aus dem Datenblatt legen (0x3800, 0x3c00, 0x3E00 oder 0x3F00) Wie Stelle ich das am besten an? Daniel Drei
Hi, Daniel, Du: "ich suche eine Möglichkeit die Vector Tabelle innerhalb meines Bootcodes zu verschieben." Sorry, geht beim AVR nicht. Die Interrupt-Vektoren sind hardwaremäßig festgelegt - die einzige Änderung ist die Umschaltung zwischen Application Section und Bootloader Section. Ein paar Byte Code kannst Du trotzdem noch unterbringen, wenn Du nur die unteren Interrupt-Vektoren nutzt. Dann kannst Du den Platz der ungenutzten Vektoren für Code verwenden. Ciao Wolfgang Horn
6kB für einen Bootloader ist ja eine ganze Menge, in welcher Sprache ist der geschrieben? Sind da nicht noch Optimierungen möglich?
6kB wow, das muß ja ein höllisch kompliziertes Protokoll sein (Bluetooth, Webserver ?). Erzähl dochmal mehr darüber. Peter
Denk auch dran, dass nur die obersten 4 KB das Recht haben, SPM- Zugriffe auszuführen.
Hallo Ist in der Tat ein kompliziertes Protokoll, die Protokoll Schicht ist vom Kunde Vorgegeben (Lin Treiber). @Wolfgang Horn: genau, weil die Vectoren HW verdrahtet sind muss ich sie ja auf eine Adresse verschieben die der Kontroller unterstützt. die Frage ist dann halt wie bekomme ich den restlichen Code drum rum? @Jörg Wunsch: das kann man ja mit den Boot Protect Bits einstellen, bzw muss halt zusätlich drauf achten das der SPM BEfehl in den 4K steht. Um es abstrakter zu formulieren suche ich einen Weg meinen Code mit einem Loch in der Mitte zusammen zu linken und in dieses Loch kommt dann die Vector Tabelle und das Loch ist genau an der Stelle wo die Vectoren liegen mussen. Weis jemand Rat, geht das? mit IAR scheint sowas machbar, hab ich aber nicht... mfg Daniel Drei mfg
Eine Möglichkeit wäre, wenn Du den kleinst möglichen Bootbereich einstellst, Deinen Bootloader komplett darunter plazierst und dann in Assembler die entsprechenden Reset- und Interruptsprünge machst und eine Funktion, die das SPM ausführt und vom C-Programm aufgerufen werden kann. Da hast dann also 2 einzelne Programme, Deinen Bootloader und den Vektor-Redirektor mit SPM API-Call. Peter
Danke Peter ich hab fast befürchtet das es darauf raus läuft... den weg den linker zu steuern das der das macht gibts wohl nicht? Daniel Drei
Den Weg gibt es. Man kann Funktionen und Daten in bestimmte sections ablegen (vgl. gcc-Dokumentation fuer attribute) und im Linker-Script die Adressen angeben, bei denen diese abgelegt werden (vgl. Linker-Dokumentation). Moeglicherweise koennen die Addressen auch ueber Kommandozeilenoptionen angebene werden und das default-Linkerscript der avr-libc fuer den Controller genutzt werden. avr-libc Linker-Script als Vorlage nehmen und selbst anpassen koennte jedoch etwas uebersichtlicher sein.
> Moeglicherweise koennen die Addressen auch ueber > Kommandozeilenoptionen angebene werden Ja, steht auch in der avr-libc-Doku. -Wl,--section-start=... Diese Methode wäre auch meine Empfehlung gewesen. Einziger Nachteil ist, dass man sich um den Füllstand der beiden Teile selbst kümmern muss.
Hallo ich benutzte ein Linker Script File! @Peter: Hab mal die kleinste Bootloder Size ausgewählt und die Vectoren dadurch fast ganz nach oben geschoben. hab noch Code dazugepackt um den Restlichen Flash bis Ende mit sinnvollem zu füllen. funktioniert soweit, gibt hat ein paar verluste. @martin: Funtionen einzeln noch in verschiedene Sectionen zu setzen wäre wohl der nächste Schritt um optimal zu füllen. leider dann alles von Hand (ächzt) @Jörg: Gibts denn nimmanden der den Gnu Linker dazu bewegen kann, die Code Segmente selber so zu puzzeln, dass der Flash in einer solchen situation optimal genutzt wird? mfg Daniel Drei
> @Jörg: Gibts denn nimmanden der den Gnu Linker dazu bewegen kann, > die Code Segmente selber so zu puzzeln, dass der Flash in einer > solchen situation optimal genutzt wird? Weiß ich nicht. Wie funktioniert Opensource? Wenn ich ein Feature ganz dringend brauche (also typischerweise, wenn mir das Implementieren mehr Arbeit spart als der Workaround), dann mach' ich es. Du darfst davon ausgehen, dass dein gewünschtes Feature für die Masse der GNU-ld-Benutzer von so wenig Interesse ist, dass es wohl niemand implementieren wird, wenn alle so denken wie du. Das ist keine Kritik, sondern einfach eine Feststellung.
Hallo Jörg sehr wahrscheinlich hast du recht und das brauchen echt kaum leute. Allerdings bieten professionelle Tools sowas an. So z.B auch der Keil Compiler für die C166 Familie. Aber das mal beiseite. In mehreren Diskussionen hab ich gelesen das der Linker gefordert wird unbenutzte Funktionen aus dem code zu entfernen. Über einen Schalter gesteuert wäre die Fn überaus nützlich. Und ist ja dann schon ein wenig ähnlich wie mein Wunsch, die einzelnen Functionen so zu puzzeln, das der Code auf mehrer Bereiche automatich aufgeteilt wird. Nun hast du natürlich Recht wenn du sagst "kümmer Dich selber darum so eine Fn einzubauen" (so hab ich das oben halt verstanden) nur dacht ich halt das es viel bessere spezialisten für solch eine Erweiterung gibt. Tatsächlich hab ich mir den Compiler auch schon einmal selber übersetzt. allerdings ohne mich zu trauen irgendwass zu ändern. Auch hab ich mal gedacht einen Code Kompressor zu basteln, der den Disassemblierten code weiter optimiert. z.B. findet man manchmal einen "Call" und direkt ein "ret" danach, das kann man auch durch einen JMP erledigen. Oft benötigte Functionen könnte man in die Mitte des Codes legen und dann evtl. mit relativen Sprungen erreichen. Das sind alles Dinge die mein Greenhill Linker von sich aus macht... aber wie immer: "nichts ist so schön, wie man es sich vorstellt" mfg Daniel Drei
> In mehreren Diskussionen hab ich gelesen das der Linker gefordert > wird unbenutzte Funktionen aus dem code zu entfernen. Das sollte mittlerweile ein unsterstütztes Feature werden (wobei ich mich scheue, es als solches zu deklarieren, bevor es jemand ausgiebig getestet hat). > Nun hast du natürlich Recht wenn du sagst "kümmer Dich selber darum > so eine Fn einzubauen" (so hab ich das oben halt verstanden) nur > dacht ich halt das es viel bessere spezialisten für solch eine > Erweiterung gibt. Das dachten die ,,viel besseren Spezialisten'' früher auch alle einmal. :-) > Auch hab ich mal gedacht einen Code Kompressor zu basteln, der den > Disassemblierten code weiter optimiert. Du fährst auf die Dauer besser, wenn du lernst, dem Compiler sowas beizubringen. Dort gehört es hin, und dann haben alle was davon.
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.