Forum: Compiler & IDEs Großer Bootcode, Linker Script für Vector Tabelle


von Daniel Drei (Gast)


Lesenswert?

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

von Wolfgang Horn (Gast)


Lesenswert?

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

von JojoS (Gast)


Lesenswert?

6kB für einen Bootloader ist ja eine ganze Menge, in welcher Sprache ist
der geschrieben? Sind da nicht noch Optimierungen möglich?

von Peter D. (peda)


Lesenswert?

6kB wow, das muß ja ein höllisch kompliziertes Protokoll sein
(Bluetooth, Webserver ?).

Erzähl dochmal mehr darüber.


Peter

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


Lesenswert?

Denk auch dran, dass nur die obersten 4 KB das Recht haben, SPM-
Zugriffe auszuführen.

von Daniel Drei (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Daniel Drei (Gast)


Lesenswert?

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

von Martin Thomas (Gast)


Lesenswert?

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.

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


Lesenswert?

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

von Daniel Drei (Gast)


Lesenswert?

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

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


Lesenswert?

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

von Daniel Drei (Gast)


Lesenswert?

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

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


Lesenswert?

> 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
Noch kein Account? Hier anmelden.