Forum: Compiler & IDEs Checksumme über Flash-Inhalt


von Franzl (Gast)


Lesenswert?

Hallo, ich möchte mit avr-gcc eine ganz simple Checksummenroutine 
implementieren. Es sollen einfach nur die Werte des Flashs aussummiert 
werden. Gibt es eine Möglichkeit, die Endadresse des Programms zu 
erhalten, sodass nur das tatsächliche Programm aufsummiert wird und 
keine darüber hinausgehenden Flash-Reste?

Beispiel (mit hartcodierter Codegröße):
1
    uint8_t chk = 0;
2
    uint16_t i;
3
    for(i = 0; i < 12345; i++) chk += pgm_read_byte(i);

von Stefan E. (sternst)


Lesenswert?

Franzl schrieb:
> Gibt es eine Möglichkeit, die Endadresse des Programms zu
> erhalten
1
extern uint8_t __data_load_end;
2
3
const uint16_t flashend = (uint16_t)&__data_load_end;

von Michael (Gast)


Lesenswert?

So eine Angabe existiert nicht - du müsstest sie selbst erzeugen 
(beispielsweise durch eine feste Speicheradresse im Flash-ROM, die die 
Länge deines Programmes enthält).

Alternative:

Fange von "hinten" an das Flash-ROM durchzugehen und die erste 
Speicherstelle ungleich 0xFF nutzt du als Startwert für deine 
Berechnung.

von Chris (Gast)


Lesenswert?

Einfach Flash Inhalt invertieren, also Xor 0xff.
Dadurch werden unprogrammierte Flash inhalte zu 0 und inkrementieren 
keine
Checksum.

von Franzl (Gast)


Lesenswert?

Stefan Ernst schrieb:
> extern uint8_t __data_load_end;

Wer garantiert denn, dass die Variable genau ans Ende gelegt wird? Ich 
habe unzählige .c-Dateien im Projekt.

Den unbeschriebenen Bereich würde ich einfach gerne ganz weglassen. Dort 
haben Bitfehler ja keine Relevanz.

von Stefan E. (sternst)


Lesenswert?

Franzl schrieb:
> Wer garantiert denn, dass die Variable genau ans Ende gelegt wird? Ich
> habe unzählige .c-Dateien im Projekt.

Das ist keine Variable im herkömmlichen Sinne. Das ist ein vom Linker 
per Linkerskript erzeugtes Symbol, und repräsentiert (wie der Name schon 
sagt) das Ende der data-Section, die im Flash direkt hinter dem 
Programm-Code liegt.

von Franzl (Gast)


Lesenswert?

Hmmmmmm, aber 8 Bit??

von Franzl (Gast)


Lesenswert?

Ah, sorry, hatte übersehen, dass es ein Pointer ist. Teste gerade...

von Franzl (Gast)


Lesenswert?

...geht, danke!

von Stefan E. (sternst)


Lesenswert?

Franzl schrieb:
> Hmmmmmm, aber 8 Bit??

Das ist doch irrelevant, es geht um die Adresse.
Was du dem Compiler sagst, was an dieser Adresse liegt, ist doch egal, 
und es ist doch eh gelogen. An dieser Adresse liegt schließlich in 
Wirklichkeit gar nichts.

von Michael (Gast)


Lesenswert?

Ich verstehe den Sinn von "__data_load_end" nicht.

Wenn man für einen Bootloader oder dergleichen die Summe braucht, nutzt 
das doch nichts, da diese Konstante zur Kompilierzeit erstellt wird und 
anschließend unveränderlich bleibt.

Will man jedoch nur die Summe der eigenen Anwendung haben, kann man sich 
doch den Code sparen und die Summe gleich am PC errechnen lassen.

Klärt mich bitte auf: Für was soll dies gut sein??

von Stefan E. (sternst)


Lesenswert?

Michael schrieb:
> Ich verstehe den Sinn von "__data_load_end" nicht.
>
> Wenn man für einen Bootloader oder dergleichen die Summe braucht, nutzt
> das doch nichts, da diese Konstante zur Kompilierzeit erstellt wird und
> anschließend unveränderlich bleibt.
>
> Will man jedoch nur die Summe der eigenen Anwendung haben, kann man sich
> doch den Code sparen und die Summe gleich am PC errechnen lassen.
>
> Klärt mich bitte auf: Für was soll dies gut sein??

Der eigentliche Verwendungszweck von __data_load_end ist ein ganz 
anderer, der rein gar nichts mit Checksummen zu tun hat (Initialisierung 
der globalen Variablen beim Start-Up). Hier wird lediglich die Tatsache 
"missbraucht", dass es "nebenbei" auch das Ende des insgesamt genutzten 
Flash-Bereichs markiert.

von Franzl (Gast)


Lesenswert?

Die Checksumme muss auf dem uC berechnet werden! Wie soll sonst ein 
korrumpierter Flash erkannt werden?
Mit __data_load_end funktioniert das echt prima.

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.