Forum: Mikrocontroller und Digitale Elektronik Software Version im Flash immer an die selbe Stelle packen


von Tata (Gast)


Lesenswert?

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

von 2⁵ (Gast)


Lesenswert?

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.

von Fabian (Gast)


Lesenswert?

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.

von Tata (Gast)


Lesenswert?

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

von Gunther (Gast)


Lesenswert?

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

von Tata (Gast)


Lesenswert?

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

von EAF (Gast)


Lesenswert?

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.

von Tata (Gast)


Lesenswert?

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?

von 2⁵ (Gast)


Lesenswert?

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.

von Wendels B. (wendelsberg)


Lesenswert?

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