Forum: Mikrocontroller und Digitale Elektronik Atxmega. Bootloader vergrößern


von Nils (Gast)


Lesenswert?

Hallo,

ist es möglich, dass man mit manuellen Eingriffen den Bootloader 
vergrößern kann? Ich nutze den ATXmega128A3U und dieser hat 8kb, im 
Moment ist mein Programm jedoch 10,2kb groß.

Sollte es funktionieren, wenn ich gezielte Funktionen oder Klassen - 
welche keine Flashzugriffe durchführen - außerhalb des 
Bootloaderbereiches positioniere?

Dann würde mein Programm normal im Bootloaderbereich anfangen, die ISR 
Tabelle wäre ordentlich umgebogen und lediglich ein paar unkritische 
Funktionen befänden sich ausserhalb des Bootloaderbereiches.

Sind das Angaben im Linker oder im C++ Code? Wäre das generlel möglich?

Danke!

von Georg G. (df2au)


Lesenswert?

Nils schrieb:
> Sind das Angaben im Linker
Ja, genau dort. Definiere ein Segment für den "Extra" Code und lege es 
"nach oben".

> oder im C++ Code
Dem Code ist es egal, wo er ausgeführt wird (wenn man ohne Tricks 
programmiert)

> Wäre das generlel möglich?
Ja. Dein Bootlader muss dann nur selbst den Extra Teil schützen, die 
Lockbits helfen dir da nicht mehr.

von Pandur S. (jetztnicht)


Lesenswert?

Die unkritischen Funktionen sind waehred des bootloadens aber gar nicht 
vorhanden...

Nee. Da gibt's eigentlich nur Eines .. das Programm muss kompakter 
werden. Man staunt, wieviel Luft da noch ist. Ich hab einen bootloader 
in weniger als 2k geschrieben.
Allenfalls die Interrupts durch Polling ersetzen ?
Allenfalls ein anderes Protokoll verwenden ?

von Nils (Gast)


Lesenswert?

Oh D. schrieb:
> Die unkritischen Funktionen sind waehred des bootloadens aber gar
> nicht
> vorhanden...
>
> Nee. Da gibt's eigentlich nur Eines .. das Programm muss kompakter
> werden. Man staunt, wieviel Luft da noch ist. Ich hab einen bootloader
> in weniger als 2k geschrieben.
> Allenfalls die Interrupts durch Polling ersetzen ?
> Allenfalls ein anderes Protokoll verwenden ?

Mit kritisch meine ich die Funktionen, die den Schreibvorgang im Flash 
durchführen. Kann  nicht alles andere theoretisch wo anders liegen?

Falls z.B. eine Bibliothek/Funktion/Klasse an eine andere Stelle soll, 
wie kriege ich das hin? Definieren und zuweisen?
1
-section-start=TestSec=0x200
2
3
 __attribute__ ((section (".TestSec")))

von Pandur S. (jetztnicht)


Lesenswert?

Entweder diese Funktionalitaet wird im Bootloader gebraucht oder eben 
nicht.
Irgendwelcher objektorientierter Firlefanz, dynamisches Memory und 
dergleichen gehoert auch nicht in den Bootloader.

von Jens (Gast)


Lesenswert?

Oh D. schrieb:
> Entweder diese Funktionalitaet wird im Bootloader gebraucht oder
> eben
> nicht.
> Irgendwelcher objektorientierter Firlefanz, dynamisches Memory und
> dergleichen gehoert auch nicht in den Bootloader.

Das sei mal dahingestellt und außen vor. Diese Antwort bezieht sich auf 
eine persöhnliche Meinung und ist dem Themenstarter in seiner 
Ausgangsfrage nicht hilfreich.

von Steffen R. (steffen_rose)


Lesenswert?

Beginne gedanklich nach den Erase. Deine "unkritischen" Teile sind 
gelöscht.

Nun ist es an dir zu überlegen, ob dein Bootloader noch alles das tun 
kann, was du von ihm erwartest.

von Georg G. (df2au)


Lesenswert?

Steffen R. schrieb:
> Beginne gedanklich nach den Erase.

Er kann den Speicher Seitenweise löschen und seinen Boot Code aussparen. 
Und eventuell wäre auch ein Blick auf den Speicherbereich "Application 
Table Section" hilfreich. Der lässt sich sogar separat schützen.

von Jens (Gast)


Lesenswert?

Oh D. schrieb:
> Entweder diese Funktionalitaet wird im Bootloader gebraucht oder
> eben
> nicht.
> Irgendwelcher objektorientierter Firlefanz, dynamisches Memory und
> dergleichen gehoert auch nicht in den Bootloader.

Ich nehme halte bereits getestete Bibliotheken und setze daraus meinen 
Bootloader zusammen. Ja, ist OOP. 3kb zu groß - shit happens, dann 
packen ich diese 3kb eben wo annders hin.

Ganz davon abgesehen, dass dynamishces Memory nicht verwendet wird.

Steffen R. schrieb:
> Beginne gedanklich nach den Erase. Deine "unkritischen" Teile sind
> gelöscht.
>
> Nun ist es an dir zu überlegen, ob dein Bootloader noch alles das tun
> kann, was du von ihm erwartest.

Das kann ich ja selber im Bootloader berücksichtigen - und so gestalten, 
dass dieser auf diese zusätzliche kb nicht schreiben darf.

######

Kann ich dem Linker nun irgendwie mitteilen, dass bestimmte Klassen an 
einen anderen ort gesetzt werden sollen?

von Pandur S. (jetztnicht)


Lesenswert?

Das Manual zum Linker hast du studiert ? Koennte der eine statische 
Allozierung von Code ?

von Steffen R. (steffen_rose)


Lesenswert?

Jens schrieb:
> Kann ich dem Linker nun irgendwie mitteilen, dass bestimmte Klassen an
> einen anderen ort gesetzt werden sollen?

Vielleicht hilft dir das:

http://www.atmel.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_reloc_code.html

von Bernd K. (prof7bit)


Lesenswert?

Nils schrieb:
> jedoch 10,2kb groß.

Das ist aber ganz schön viel, hast Du vergessen -Os einzuschalten? Sind 
Dir irgendwo versehentlich Fließkomma-Routinen reingerutscht? Hast Du 
irgendwelche riesigen(!) Arrays mit Daten im Flash?

Zum Vergleich (nur um mal nen kurzen Realitätsabgleich zu machen): Ein 
real existierender (mir und anderen hier bekannter) Bootoader für AVR 
mit Verschlüsselung(!) in ASM braucht vielleicht 800 Byte. Das rangiert 
nahe am Minimum, das ist wohl die untere Grenze.

In C mit der selben Funktionalität würde der selbe Bootloader vielleicht 
das doppelte brauchen, maximal vielleicht sogar 2000 Byte, jedoch 
keinesfalls mehr. Geht einfach nicht, mehr Substanz ist einfach nicht da 
daß das noch nennenswert mehr Platz ausfüllen könnte.

Einen Bootloader für nen ARM mit ähnlicher Funktionalität hab ich hier 
am Laufen, komplett in C geschrieben, ohne irgendwelche Verrenkungen, 
der braucht so um die ~1700 Byte (UART) oder ~2000 Byte (mit HMT7748 
Treiber) Und auch hier nicht etwa weil ich irgendwelche komischen Tricks 
anwende, im Gegenteil hab ich an vielen Stellen eher den ausführlichen, 
lesbaren Weg gewählt, der Compiler (gcc) spuckt einfach nicht mehr Code 
aus, egal wie langatmig und ausführlich ich alles hinschreibe!

Was ich damit sagen will ist:
Irgendwas ist da nicht richtig gelaufen, und zwar ganz und gar nicht, 
irgendwas hast Du übersehen, irgendwas ist da reingerutscht was da gar 
nicht hingehört, 10kB sind NICHT plausibel für nen simplen Bootloader, 
nicht in diesem Universum und auch in keinem anderen. 2k: Ja, 3k: auch 
noch OK, 4k: Der kann dann aber schon Kaffee kochen, 10k: No way! Da ist 
irgendwas anderes kaputt!

Geh doch mal in Ruhe die .lss Datei durch und schau was der da alles mit 
reingepackt hat, das ist der schnellste Weg den Übeltäter zu 
identifizieren. Sobald Du was findest was da definitiv nicht gebraucht 
wird findest Du auch relativ schnell die Stelle an der Du das 
versehentlich mit reinziehst und kannst das abstellen.

Und natürlich nicht zuletzt -Os --ffunction-sections und 
-Wl,--gc-sections und -flto sowieso, gerade dann wenn man mit riesigen 
fremden libs arbeitet von denen man nur 1% nutzen will.

: Bearbeitet durch User
von Steffen R. (steffen_rose)


Lesenswert?

Bernd K. schrieb:
> 10kB sind NICHT plausibel für nen simplen Bootloader

Er hat nie behauptet, dass es nur ein simpler Bootloader ist.

von Pandur S. (jetztnicht)


Lesenswert?

> Er hat nie behauptet, dass es nur ein simpler Bootloader ist.

Ob das Sinn macht ? Alle Libraries, die fest im Bootloader Teil drin 
sind koennen nicht ersetzt werden. Dann wuerd ich eher nur den 
Bootloader haben wollen und den dafuer reservierten Bereich verkleinern.

Das muesste man genauer anschauen. Weshalb das so sein soll.

Ich schrieb einen http Bootloader, der hat ueber das Internet gebootet 
mit weniger als 2k Code. Allerdings auf lokale Interaktion hin, dh man 
musste einen Button im Geraet druecken.

von Steffen R. (steffen_rose)


Lesenswert?

Oh D. schrieb:
> Ob das Sinn macht ?

Das war nicht seine Frage.

Aber schon bei einen Standardkonformen CANopen Bootloader gibts mit den 
8k Probleme. Je nach notwendiger Funktionalität. Solche komplexeren 
Implementierungen sind notwendig, wenn das Gerät für das Update nicht 
aus dem Netz genommen werden soll und auch speziell über die normale 
Kommunikationsschnittstelle ein Update bekommen soll.

Nur mal so als Beispiel. Ohne eine Diskussion lostreten zu wollen, dass 
es hier einige Experten gibt, die es gut hinbekommen.
Hier sollte es um den TE gehen und der macht keine genaueren Aussagen, 
warum sein Code so groß ist und fragt auch nicht nach Unterstützung, 
seinen Code kleiner zu machen. Aus meiner Sicht wäre es bei dieser 
Fragestellung auch nicht so ungewöhlich danach zu fragen, sollte er es 
wünschen.

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.