Hallo zusammen,
Problem: Ich möchte in meiner Software innerhalb der ersten paar Bytes
über einen 2-Byte-Code die Versionsnummer der Software hinterlegen.
Also, zum Beispiel, Byte 10 und 11 (oder ähnlich) ergeben zusammen die
Version. Der Hintergrund ist der, dass ich meinen Bootloader entscheiden
lassen möchte, ob er die neue Software aufspielen darf oder nicht.
Umgebung: Ich programmiere in C (GNU C-Compiler) in Atmel Studio 7 auf
einem Atmega1284p-au.
Für Eure Unterstützung bedanke ich mich schon einmal herzlich.
Im Linker-Script kannst du für jede Quelldatei oder sogar für jede
struct genau festlegen, auf welche Adresse die gelinkt werden soll. Für
deine 2 Bytes scheint eine eigene struct etwas übertrieben, aber (nur?)
so kannst du die genaue Reihenfolge der Bytes im Flash festlegen.
Außerdem könnten es leicht mehr als 2 Bytes werden, z.B. eine Prüfsumme;
Appetit kommt beim Essen ;)
Ein Bootloader auf dem gleichen Chip könnte noch den gleichen Header mit
"typedef struct" benutzen. Wenn man die hex-Datei mit einem PC-Programm
verarbeiten möchte, ist das nicht mehr so einfach, deshalb habe ich
gerne wirklich fixe Adressen.
Thorsten M. schrieb:> Der Hintergrund ist der, dass ich meinen Bootloader entscheiden> lassen möchte, ob er die neue Software aufspielen darf oder nicht.
Dazu sollte er eigentlich etwas mehr wissen, als nur die
Firmware-Version. Ich hatte mal versucht, möglichst viel zu
berücksichtigen und das in eine "Hardware-Signatur" zu packen.
Zusätzlich zur Firmware-Version würde ich sowas in den Bootloader und
die Anwendung einbauen und dann vergleichen
1
typedefstructhw_compat_struct{
2
uint32_trev:5;// PCB-Revision, MBZ, außer im Bootloader (0, 'A'&31)
3
uint32_tdash:7;// Sachnummer (-01)
4
uint32_tpcb:20;// Sachnummer (100001 bis 999999)
5
uint32_tpart;// Reference Designator; Bitmap
6
uint64_tvid;// Bestückungs-Variante und -Revision und ECO; Bitmap
7
}hw_compat_struct;
Ein paar wirre Gedanken dazu findet man im Anhang...
Thorsten M. schrieb:> Problem: Ich möchte in meiner Software innerhalb der ersten paar Bytes> über einen 2-Byte-Code die Versionsnummer der Software hinterlegen.
Sollte da nicht normalwerwise eine Interrupttabelle liegen? Eventuell
direkt danach, denn deren Größe steht ja fest. Da könntest Du Dir ein
geeignetes struct oder auch einen String definieren und über Dein
Linkerscript in eine Section direkt nach der Interrupttabelle hinlegen.
> Der Hintergrund ist der, dass ich meinen Bootloader entscheiden> lassen möchte, ob er die neue Software aufspielen darf oder nicht.
Aber bitte nicht so, daß kein Downgrade mehr geht. Es gibt kaum etwas
Blöderes, als wenn eine neue Software wegen neuer Bugs nicht geht, aber
die Firmware auch kein Downgrade auf die Vorversion zuläßt (hallo,
Asus).
Hier:
Beitrag "MMC/SD Bootloader füt ATMega16"
wurde so etwas schon gemacht.
Nop schrieb:> Aber bitte nicht so, daß kein Downgrade mehr geht. Es gibt kaum etwas> Blöderes, als wenn eine neue Software wegen neuer Bugs nicht geht, aber> die Firmware auch kein Downgrade auf die Vorversion zuläßt (hallo,> Asus).
Wenn man nur die Versionsnr. (wie im Link) kontrolliert, hindert einen
niemand daran, dem Bootloader mit einer höheren Version wieder die alte
SW unterzujubeln.
Wenn einem das nicht gefällt, flasht man den Bootloader eben neu.
Ein downgrade generell zu verhindern ist eine maximal dumme
Entscheidung. Da gibt's den Fall eines Devices, welches nach vielen
Jahren ausfaellt. Die Umgebung wurde darauf angepasst und kann nicht
mehr veraendert werden. Daselbe Device ist nicht mehr erhaeltlich,
sondern nur das Identische mit neuer Firmware. und etwas anderer
Funktionalitaet. Mit downgrade Moeglichkeit wurde das Neue passen, sonst
eben nicht. Nicht, dass der Kunde das koennen muss, sondern der
Produktmanager.
Der Kunde bezahlt sicher einen geringen Aufpreis fuer eine alte Version,
aber nicht, dass sich jemand Stunden lange damit rumschlagen muss. Und
wenn der Kunde ein alte Version will, sollte man die liefern koennen und
wollen.
Vielen Dank schon einmal an Alle.
Ein Downgrade verhindern möchte ich nicht, aber man kann den Kunden ja
warnen und fragen, ob er das wirklich machen möchte. Bauform hat ja auch
noch mehrere andere gute Gedanken genannt, was mit dieser Technik
möglich ist.
Was mir jetzt noch fehlt, ist die Beantwortung meiner Frage. Bauform
schreibt, dass das mit einem Linkerscript möglich ist, aber ich weiß
leider nicht wie? Die von allen vorgeschlagenen Links habe ich gelesen,
aber keine Antwort gefunden.
Thorsten M. schrieb:> Was mir jetzt noch fehlt, ist die Beantwortung meiner Frage.Andreas B. schrieb:> Hier:> Beitrag "MMC/SD Bootloader füt ATMega16"> wurde so etwas schon gemacht.
Oliver
Thorsten M. schrieb:> Die von allen vorgeschlagenen Links habe ich gelesen,> aber keine Antwort gefunden.
Meinten Sie: habe zu viele Antworten gefunden?
Und fast alle sind zu 99% richtig, auch wenn das linker script überall
total unterschiedlich aussieht. Es muss nämlich nicht nur zum Linker
passen, sondern zu Compiler, Startup, ggf. libc, Sprache und evt. sogar
zur IDE.
Der Linker bestimmt nur die Syntax und bietet sehr viele Möglichkeiten,
die man (für uC) meist nicht braucht. Es kann sein, dass in deinem
vorhandenen Script die Hälfte überflüssig ist, aber was genau? Du musst
also dein vorhandenes Script behutsam erweitern und kannst nichts aus
dem Internet einfach 1:1 übernehmen.
Egal, hier ist eins von mir für ein Programm namens gps. Es ist etwas
gekürzt und für einen STM32 (AVR kann ich nicht), aber im Prinzip
funktioniert es so.
Ich möchte mich bei Allen bedanken. Jetzt muss ich zunächst einmal die
Informationen verarbeiten und versuchen, daraus etwas für meine Software
zu stricken. Es gibt da noch viele andere Baustellen.
Fühlt Euch alle gedanklich von mir in einen Biergarten eingeladen, mehr
geht im Moment leider nicht...