Information in bin file hinzufügen stm32

Gast #4167986
Lesenswert?

Hallo Leute,

ich programmiere gerade an einem custom bootloader für einen 
STM32F105RC.
Das Update funktioniert über usb und läuft bereits einwandfrei.

Nun habe ich das Problem das es mehrere Programme gibt.

Nun möchte ich eine Art Modellnummer in das bin file einfügen.
Das heißt beim ersten mal aufspielen durchsuche ich den Stick auf 
verfügbare Files und in einem Menü kann man anschließend die benötigte 
software auswählen.

Bei einem Update soll dann nur mehr für das model (wird im eeprom 
gespeichert) die Software aufgespielt werden.

Meine frage wie kann ich das bin file abändern ohne das anschließend 
fehler auftreten. Ich habe schon mal wo gelesen das man in der vector 
table nicht verwendete interrupts überschreiben kann. Dazu habe ich aber 
nichts genaueres gefunden.

Ich benötige mindestens 10 byte die immer an der selben Adresse stehen 
müssen.

Vielen Dank im Voraus!
Gast #4168006
Lesenswert?

Ich würde nicht das .bin File ändern, sondern das direkt im Quellcode 
machen. Z.B. mit einer Sektion am Ende oder an einer definierten 
Speicheradresse.
Kleiner Nachteil, wenn die Kennung ganz hinten im .bin hängt: Du musst 
immer das ganze Flash programmieren, auch wenn es ggf. nur ein 
Mini-Programm ist. Das kann die Programmierdauer vervielfachen.

Ggf. kannst Du auch eine Kennung einfügen, die garnicht mitprogrammiert 
wird, sondern nur von der PC-Software ausgewertet und nicht zum 
Bootloader geschickt wird.

Gruß, Stefan
Gast #4168010
Lesenswert?

franz schrieb:
> Ich habe schon mal wo gelesen das man in der vector
> table nicht verwendete interrupts überschreiben kann. Dazu habe ich aber
> nichts genaueres gefunden.

Wenn man die als Reserved markierten mit 0 gesetzten Vectoren 
überschreiben darf, dann ist es vermutlich am Leichtesten das in der 
startup_stm32f105xc.s zu tun.

Im schlimmsten Fall springt er in irgend einen Error Handler.

Versuch macht kluch.
Gast #4168043
Lesenswert?

Im Programm eine globale Variable mit der Kennung anlegen, used falls du 
die IDs sonst nirgends verwendest, damit nichts wegoptimiert wird.
1
const t_HwInfo m_oHwInfo __attribute__ ((section(".hardwareinfo"), used))= {BOARD_VERSION, MTU_CHIP_ID, BOARD_ID, BOARD_BOOTLOADER_CRC};

Und die Section .hardwareinfo musst du noch im Linkerscript eintragen, 
dann liegt m_oHwInfo da drinnen. So ca:
1
  .hardwareinfo (0x10c)  : 
2
  {
3
    KEEP(*(hardwareinfo hardwareinfo.*))
4
  } > FLASH

Aber da gibt es verchiedene Varianten, hier liegt die struct dann bei 
0x10c, das darf sich natürlich nicht mit anderen Dingen überschneiden, 
wie zB den IRQ Vektoren die auch am Beginn stehen.
Gast #4168050
Lesenswert?

Hab gerade meinen F030 einen Wert in seine Vectortabelle geschrieben,
das Prog läuft wie gewohnt und der Eintrag ist auch im .hex file zu 
sehen.
Scheint also zu funktionieren einfach 4 Bytes an Stelle einer 0 in die 
Vectortabelle in die startup_... zu schreiben. Zu mindest beim F030.
Gast #4168057
Lesenswert?

Danke für die schnelle info.
Ich werde mich mal über die Vectortable noch mehr herausfinden bzw. 
einfach mal ausprobieren ob ich nicht in einen fault handler lande.

Stefan schrieb:
> Ggf. kannst Du auch eine Kennung einfügen, die garnicht mitprogrammiert
> wird, sondern nur von der PC-Software ausgewertet und nicht zum
> Bootloader geschickt wird.

Das bin file wird direkt über einen USB Stick aufgespielt (kein PC zum 
programmieren notwendig)

@Thomas: dein vorschlag gefällt mir derzeit am besten werde ich auch 
ausprobieren. Gilt nur herauszufinden auf welche addresse ich die Info 
hinschreiben darf.

Auf jeden Fall dake für eure schnelle hilfe!
#4168066
Lesenswert?

franz schrieb:

> Das bin file wird direkt über einen USB Stick aufgespielt (kein PC zum
> programmieren notwendig)

Aber irgendwie muss es ja auch auf den USB Stick kommen.

So wie sich das anhört, ändert sich die Information am USB Stick nicht 
im Studentakt, sondern das klingt eher nach einem USB-Stick mit dem ein 
Service-Techniker rausfährt und Geräte updated, bis nach einem halben 
Jahr eine neue Firmwareversion verfügbar ist.

In diesem Fall würde ich für das BIN-File selbst einen Container bauen, 
mit einer anderen Dateiendung, in dem zb in den ersten 20 oder 30 Bytes 
die Information steht, die dein Menüsystem braucht. Wird eines davon 
ausgewählt, dann werden diese 20 Bytes übersprungen und der Inhalt des 
originalen BIN-Files bleibt wieder übrig und wird geflasht.

Derjenige, der den INhalt des USB Sticks zusammenstellt bzw. updated, 
hat ein Tool, dem er das BIN-File von der Toolchain zeigt, sowie die 
Menüinformation vorgibt, und das dann genau diese Containerdatei 
erstellt.
Gast #4168074
Lesenswert?

@karl heinz: Genau so ist es und danke jetzt verstehe ich auch was du 
meinst. Diese Idee gefällt mir auch sehr gut.

Jetzt habe ich die Qual der Wahl :D

Der Punkt mit der Vectortable funktioniert auf die schnelle ganz gut. 
Jedoch wird das File abgeändert, was ich einfach nicht schön finde.

Ich denke Karl heinz deine Idee hat gewonnen weil sie am einfachsten 
ist.
#4168121
Lesenswert?

franz schrieb:

> Ich denke Karl heinz deine Idee hat gewonnen weil sie am einfachsten
> ist.

Am einfachsten ist sie nicht.
Aber ich habe auch eine Abneigung dagegen, ein von einem Compiler 
erstelltes Executable an nicht dezidierten Stellen zu verändern 
(Vektortabelle).
Vielleicht passiert es auch nie aber mglw. wird irgendwann genau dieser 
Vektor benutzt und dann erinnert sich kein Mensch mehr daran, dass da 
eine Zweckentfremdung stattfand.
Gast #4169681
Lesenswert?

Zur info:

Ich habe jetzt die Idee von Karl Heinz umgesetzt und sie funktioniert 
einwandfrei. Dadurch kann ich einfach und ohne Begrenzung information 
zur Applikation für den Bootloader anfügen.

Beim Update selbst wird dieser Bereich einfach übersprungen!

Danke an alle für Eure Vorschläge!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren