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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.