Guten Morgen, ich habe ein Altes Projekt ausgegraben, und muss dieses erweitern. Leider kann ich nach mehrmaligen Pc Umzügen nicht mehr zu 100 Prozent sagen welcher Code ich auf der Hardware laufen habe.(ja Unordnung). Kann man mit einem Trick immer an eine Bestimmte Stelle im Flash die Versionsnummer rein packen? Danke für die Hilfe
Man könnte z.B. beim gcc am Flash-Ende im Linker-Script eine Region definieren und dort dann seinen Version-String platzieren. Hängt vom uC ab, manche (alte) platzieren dort z.B. Vektoren.
So wie 2⁵ schreibt, mache ich es auch. Ich reserviere mir via Linker-Skript immer die letzten 256 Byte für die Versionsinfo und Flash-CRC. So prüfe ich dann beim starten auch einmal den kompletten Flash via CRC-Check.
2⁵ schrieb: > Man könnte z.B. beim gcc am Flash-Ende im Linker-Script eine > Region > definieren und dort dann seinen Version-String platzieren. Hängt vom uC > ab, manche (alte) platzieren dort z.B. Vektoren. Sorry ich habe ganz vergessen zu erwähnen das ich AtMegas im Einsatz habe. Habt Ihr ein Beispiel wie ich eine solche Region erstellen kann? Danke für die Hilfe
Tata schrieb: > 2⁵ schrieb: >> Man könnte z.B. beim gcc am Flash-Ende im Linker-Script eine >> Region > Sorry ich habe ganz vergessen zu erwähnen das ich AtMegas im Einsatz > habe. > Habt Ihr ein Beispiel wie ich eine solche Region erstellen kann? Beim AtmelStudio könnte man unter Project properties->Toolchain->Linker->Memory settings eine eintragen. (Das Beispiel mit -Wl) _attribute_ ((section (".Namen eintragen"))) long revision; Ich würde beim Atmega einfach einen EEPROM-Block definieren. include <avr/eeprom.h> und eeprom_write_dword() Evtl. auch include <avr/pgmspace.h> und long revision PROGMEM; aber dann ist die Adresse nicht festgelegt. Gruß Gunther
Gunther schrieb: > Beim AtmelStudio könnte man unter Project > properties->Toolchain->Linker->Memory settings eine eintragen. (Das > Beispiel mit -Wl) > attribute ((section (".Namen eintragen"))) long revision; Danke! Und mit der Methode steht immer an der selben STelle? Gunther schrieb: > Ich würde beim Atmega einfach einen EEPROM-Block definieren. > include <avr/eeprom.h> und eeprom_write_dword() Finde ich nicht so gut EEprom kann mal überschrieben werden. Danke für die Hilfe
Tata schrieb: > Leider kann ich nach mehrmaligen Pc Umzügen nicht mehr zu 100 Prozent > sagen welcher Code ich auf der Hardware laufen habe.(ja Unordnung). > Kann man mit einem Trick immer an eine Bestimmte Stelle im Flash die > Versionsnummer rein packen? Dein Vorhaben schwebte mir auch schon vor. Ist aber für Arduino nicht ganz leicht umzusetzen. Alleine schon weil einem Board Updates das wieder zerrütten. Bei Arduino ist meist "Serial" im Spiel, also geht sowas:
1 | #include <Streaming.h> // die Lib findest du selber ;-) |
2 | Print &cout = Serial; // cout Emulation für "Arme" |
3 | |
4 | void setup() |
5 | {
|
6 | Serial.begin(9600); |
7 | cout << F("Start: ") << F(__FILE__) << endl; |
8 | }
|
9 | |
10 | void loop() |
11 | {
|
12 | |
13 | }
|
Version im Dateinamen bzw. Pfad. Solange der µC noch ansprechbar ist, ist das im Prinzip voll ausreichend. Könnte auch für deine Anwendung evtl. anpassbar sein.
Gunther schrieb: > Tata schrieb: >> 2⁵ schrieb: >>> Man könnte z.B. beim gcc am Flash-Ende im Linker-Script eine >>> Region >> Sorry ich habe ganz vergessen zu erwähnen das ich AtMegas im Einsatz >> habe. >> Habt Ihr ein Beispiel wie ich eine solche Region erstellen kann? > > Beim AtmelStudio könnte man unter Project > properties->Toolchain->Linker->Memory settings eine eintragen. (Das > Beispiel mit -Wl) > attribute ((section (".Namen eintragen"))) long revision; > Und mit dieser Methode steht die Version immer an der gleichen Stelle?
Tata schrieb: > Und mit dieser Methode steht die Version immer an der gleichen Stelle? Wenn sonst nichts in der Linker-Sektion steht… wenn du mehr reinpackst, müsste man in den Tiefen der Linker Doku suchen, in welcher Reihenfolge der Linker die Daten anlegt. In diesem Fall wäre es besser, einfach eine struct in der Größe der Sektion anzulegen. Du könntest aber auch mit Magic-Numbers arbeiten, also z.B. sowas definieren const uint16_t ver[4] = {0xe56, 0xac34, version, Build}; Beim AVR müsste jetzt noch ein progmem oder ein __flash dazu. Dann könntest du einfach den Flash nach den Magic Numbers durchsuchen und hättest dann deine Version.
Ich habe mir so beholfen, dass es eine Funktion Versionsstring ausgeben gibt, die mit Compiledatum und -zeit automatisch befuellt wird.
1 | /* Versionsstring ausgeben */ |
2 | sprintf(buf_send, "%s %s\r\n", __DATE__, __TIME__); |
wendelsberg
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.