Forum: Mikrocontroller und Digitale Elektronik Problem -> Bootloader zu groß


von Noob (Gast)


Lesenswert?

Hi zusammen,

ich hab einen Bootloader und eine Application wie die meisten anderen 
auch.
Das Ziel war es den Bootloader updatefähig zu gestalten. Die Idee und 
die Umsetzung ist, dass man den Bootloader so klein wie den RAM Speicher 
hält und diesen dann nach Neustart in den RAM lädt.

Jetzt verwende ich zur Verifizierung des Loaders libs aus der 
Application. Die sind aber so unheimlich groß das die meinen RAM 
Speicher sprengen.

Hab also zwei getrennte Projekte und zwei Scatterfiles(Bootloader und 
App) die von einander nichts wissen. Damit handle ich mir automatisch 
redundanten Code ein.

Kenn mich in den Möglichkeiten nicht so aus, aber gibt es einen Ansatz 
bei dem ich den gemeinsamen Code nur einmal im Speicher hab und von 
Application und Bootloader bei Bedarf drauf zugreife?

Danke

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Noob schrieb:
> Kenn mich in den Möglichkeiten nicht so aus, aber gibt es einen Ansatz
> bei dem ich den gemeinsamen Code nur einmal im Speicher hab und von
> Application und Bootloader bei Bedarf drauf zugreife?

 Ja.
 Nur schreiben ins Flash muss von der Bootloader section erfolgen.

von Jens (Gast)


Lesenswert?

Um welchen Controller geht es denn?
Du kannst ja nur die Funktionen in den RAM laden welche für das kopieren 
zuständig ist und dann den Flash als Zwischen Speicher missbrauchen.

Oder du baust dir einen mehr Stufigen Bootloader der im ersten Teil nur 
eine Überprüfung macht was er machen soll der immer fest bleibt und 
nicht aktualisiert werden muss.

Der 2te nimmt dann dein Binary endgegen speichert ihn im Flash und 
startet aus dem ersten dann das Update.

Da du die libs vermutlich auch aktualisiert haben möchtest wird es nicht 
funktionieren diese für beide Programme zu verwenden.

Sei kreativ.

von fop (Gast)


Lesenswert?

Wenn Du Code der Applikation im Bootloader nutzen willst, bedeutet das 
dass die erste Applikation nicht per Bootloader auf das Gerät kommen 
kann.
Andererseits könnte man sich aber einen Rumpfbootloader vorstellen, der 
ein paar Bibliotheksroutinen bereit stellt. Wenn ein Update der 
Applikation angesagt ist, empfängt der Rumpfbootloader erstmal den Rest 
des Bootloaders, schreibt diesen in's Ram und startet ihn. Der Code im 
Ram kann dann auf die Bibliotheksroutinen zugreifen, um selber kleiner 
zu sein. Oder eben auch nicht, wenn in der Bibliothek ein Fehler steckt.

von DPA (Gast)


Lesenswert?

Noob schrieb:
> Jetzt verwende ich zur Verifizierung des Loaders libs aus der
> Application. Die sind aber so unheimlich groß das die meinen RAM
> Speicher sprengen.

Vielleicht kann man hier ansetzen. Verwendest du bereits "-Os 
-ffunction-sections -fdata-sections", für möglichst kleinen Code und 
entfernen nicht verwendeter Funktionen?

Was genau braucht denn da bei den Libs so unglaublich viel Speicher? 
Falls du eine alternative Implementierung für SHA1 brauchst hätte ich da 
noch eine:
https://github.com/Daniel-Abrecht/DPA-UCS/blob/master/src/headers/DPA/utils/crypto/sha1.h
https://github.com/Daniel-Abrecht/DPA-UCS/blob/master/src/utils/crypto/sha1.c

von DPA (Gast)


Lesenswert?

Edit: habe noch "-Wl,-gc-sections" vergessen, ohne das ist 
"-ffunction-sections -fdata-sections" ziemlich nutzlos.

von Peter D. (peda)


Lesenswert?

Noob schrieb:
> Jetzt verwende ich zur Verifizierung des Loaders libs aus der
> Application.

Dann hast Du ein Henn-Ei-Problem. Die Henne kann auf das Ei nicht 
zugreifen, da sie es erst ja noch legen muß.
Der Bootloader muß immer für sich allein lauffähig sein!

Es kann ja beim Updaten der Applikation das Problem auftreten, daß der 
Bootloader die Applikation zwar löschen konnte, aber beim neu 
Programmieren ein Fehler auftrat oder die neue Applikation schlichtweg 
buggy ist.

Bestenfalls kann die Applikation auf ein API des Bootloaders zugreifen, 
aber niemals umgekehrt.

Daß ein Bootloader sich ins RAM kopiert, um sich selber löschen zu 
können, klingt ziemlich gefährlich und ist es auch in der Praxis.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Peter D. schrieb:
> Bestenfalls kann die Applikation auf ein API des Bootloaders zugreifen,
> aber niemals umgekehrt.

 Hmmm, niemals ?

 Das Problem dabei könnte sein, dass der Bootloader versucht, auf ein
 API zuzugreifen, welches sich nicht auf dieser Adresse befindet.

 In diesem speziellen Fall aber könnte sich der Bootloader darauf
 verlassen, dass benötigte APIs sich auf festgelegten Adressen
 befinden (CRC etc.).

 Frage ist nämlich, warum der Bootloader überhaupt auf Applikation-
 Routinen zugreifen soll (und muss) ?

 Umgekehrt könnte das schon eher der Fall sein, aber was könnte die
 Applikation dadurch überhaupt gross sparen und vor allem warum?


> Der Bootloader muß immer für sich allein lauffähig sein!

 Genau.
 Und  sollte schnell, klein und sicher sein.

von Thomas E. (picalic)


Lesenswert?

Wann muss man schonmal den Bootloader Updaten? Wenn ich meinen (PIC) 
Bootloader updaten will, lade ich einen temporären, 2.Bootloader als 
Applikation, der dann wiederum den Bootloader im original-Adressbereich 
(als "seine" Applikation) lädt. Der eine oder andere Bootloader ist, 
wenn er erstmal erfolgreich als App geladen wurde, immer eigenständig 
lauffähig.

von W.S. (Gast)


Lesenswert?

Noob schrieb:
> Kenn mich in den Möglichkeiten nicht so aus, aber gibt es einen Ansatz
> bei dem ich den gemeinsamen Code nur einmal im Speicher hab und von
> Application und Bootloader bei Bedarf drauf zugreife?

Im Prinzip ja.
Aber dazu müßtest du dir Gedanken machen über die Architektur deines 
Chips.

Bei der Lernbetty (ARM7TDMI) hatte ich das so gemacht, daß es eine 
BettyBase gibt, die quasi als Betriebssystem fungiert und über SVC's von 
den Apps angesprochen wird.

So ähnlich müßtest du es ebenfalls halten, also dein ganzes Zeug sauber 
aufteilen in einen fest im Chip bleibenden Teil, quasi ein 
Mini-Betriebssystem, einen in den RAM ladbaren Bootlader (der auf dieses 
BS zurückgreift) und ladbare Apps, die ebenfalls auf das BS 
zurückgreifen.

Wie du die Schnittstelle zwischen Apps und Bootlader einerseits und BS 
andererseits gestaltest, ist hardwareabhängig und auch compilerabhängig. 
Der GCC zum Beispiel (falls du mit einem ARM arbeiten solltest) kann 
keine SVC's, da wäre ein Assembler-Wrapper dafür angesagt und das gibt 
in diesem Falle schlechten Code.

W.S.

von oszi40 (Gast)


Lesenswert?

W.S. schrieb:
> ist hardwareabhängig und auch compilerabhängig.

-Sobald ein Compiler zum Einsatz kommt, kann auch viel unnützes Zeug mit 
geladen werden, was zusätzlichen Platz benötigt...
-Ein 2.Rettungs-Boot wäre auch nützlich, falls das 1. Bootsystem 
totgepatcht wurde oder Spannungsausfall?

von W.S. (Gast)


Lesenswert?

oszi40 schrieb:
> Ein 2.Rettungs-Boot

Ach wo, sofern der eigentliche Kaltstart und Bootlader vernünftig 
konzipiert worden sind.

Aber das hier ist alles nur heiße Luft, solange die eigentliche HW 
unbekannt bleibt.

W.S.

von Noob (Gast)


Angehängte Dateien:

Lesenswert?

So ist der Aufbau bei mir...

wobei das erste(Bootloader) Programm in der Lage ist das 
zweite(Anwendung) zu aktualisieren. Damit sich das erste bei bedarf(im 
Nontfall) auch selbst aktualieren kann lädt sich der Bootloader in den 
RAM um sich zu überschreiben.

Im groben haben beide ein Betriebsystem, ein FileSystem, und eine 
CryptoEinheit. Letztere bringt das Fass zum überlaufen.

Als Noob und ohne tieferes Verständnis dacht ich. Das ich ein drittes 
Programm (CryptoEinheit) haben könnte, dass ich irgendwie ansprechen 
hätte können.

von Noob (Gast)


Lesenswert?

Fällt wie Schuppen von den Augen  :)

Das ist simpel und würde auf den ersten Blick seine Funktion erfüllen.

von Noob (Gast)


Lesenswert?

Thomas E. schrieb:
> Wann muss man schonmal den Bootloader Updaten? Wenn ich meinen (PIC)
> Bootloader updaten will, lade ich einen temporären, 2.Bootloader als
> Applikation, der dann wiederum den Bootloader im original-Adressbereich
> (als "seine" Applikation) lädt. Der eine oder andere Bootloader ist,
> wenn er erstmal erfolgreich als App geladen wurde, immer eigenständig
> lauffähig.

Noob schrieb:
> Fällt wie Schuppen von den Augen  :)
>
> Das ist simpel und würde auf den ersten Blick seine Funktion erfüllen.

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