Checksumme über Flash-Inhalt

Gast #3823194
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);
Gast #3823214
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.
#3823312
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.
Gast #3826533
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??
#3826556
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.

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