mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC Chips Vector Checksumme


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Ulrich U. (uli-dd-70)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo in die Runde,

ich möchte gern die Vector Checksumme, welche bei NXP - Chips die 
Gültigkeit der Firma anzeigt, selbst berechnen und überprüfen. In meinem 
Beispiel (LPC11U66) wird diese Checksumme vom Flashtool generiert und 
auf Adresse 0x1C (achter Eintrag im Vector-Table) geschrieben.
Nach Beschreibung ist es das 2er-Komplement der Summe der 
Vector-Table-Einträge 0 - 6.

Ich habe einen kurzen Code erstellt, lasse die im Flash gespeicherte 
Checksumme (also den Inhalt von Position 7 (0x1C) des Vector-Table 
ausgeben.

Ich bin am Verzweifeln, denn normaler Weise müsste in jedem der 
folgenden drei Ausgaben der gleiche Wert ausgegeben werden. Habe den 
Algorithmus wieder und wieder überprüft... grrr...
// Ausgabe auf 0x1C gespeicherte Checksumme

flash_crc = (uint32_t*)(SCB->VTOR + 0x1C);
printf("CRC im Flash: 0x%lX    ", *flash_crc);

--> Ausgabe: "CRC im Flash: 0xEFFFDCCF"

Das Hexfile sieht in den ersten beiden Zeile so aus:

:100000000020001035010000FD000000FF0000008E
:10001000000000000000000000000000CFDCFFEF47

Also folgende Werte:

00200010 35010000 FD000000 FF000000 00000000 00000000 00000000

Nach Anpassung der Endianess und Ausgabe:
// Ausgabe Checksumme berechnet aus Inhalt der Hex-Datei

printf("CRC von HEX-Datei: 0x%lX    ", 0 - (0x10000200 + 0x00000135 + 0x000000FD + 0x000000FF));

--> Ausgabe: "CRC von HEX: 0xEFFFFACF"

Und nun noch aus den Registern ausgelesen:
// Ausgabe aus Registerwerten berechnet

i = (uint32_t*)SCB->VTOR; comp_crc = *i;
i += 4; comp_crc += *i;
i += 4; comp_crc += *i;
i += 4; comp_crc += *i;
i += 4; comp_crc += *i;
i += 4; comp_crc += *i;
i += 4; comp_crc += *i;

comp_crc = 0 - comp_crc;
printf("CRC berechnet: 0x%lX    ", comp_crc);

--> Ausgabe: "CRC berechnet: 0xEFFFDCEB"

Warum differieren diese drei Werte?

Gruß Uli

: Bearbeitet durch User
Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ulrich U. schrieb:
> printf("CRC von HEX-Datei: 0x%lX    ", 0 - (0x10000200 + 0x00000135 +
> 0x000000FD + 0x000000FF));

Da ist wohl ein Zahlendreher drinnen; es sollte wohl 0x10002000 heissen 
und nicht 0x10000200.


> i += 4; comp_crc += *i;
> i += 4; comp_crc += *i;

Da wuerd' ich mal nicht 4 auf den Pointer addieren, sondern nur 1. Ist 
ja schon ein 32 bit pointer und kein 8 bit.


Gruss
WK

Autor: Ulrich U. (uli-dd-70)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo WK,

danke für den Hinweis, ja, stimmt. Vier Augen sehen mehr als zwei. Aber 
warum kommt, wenn ich die Registerwerte aus dem Flash auslese, etwas 
Anderes heraus? Da müssen sich ja Werte verändert haben (während des 
Flashens?) ...

Uli

Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ulrich U. schrieb:
> Aber
> warum kommt, wenn ich die Registerwerte aus dem Flash auslese, etwas
> Anderes heraus? Da müssen sich ja Werte verändert haben (während des
> Flashens?) ...

Aeh - wo jetzt? Was liest du jeweils wie aus und was erwartest du?

Gruss
WK

Autor: Ulrich U. (uli-dd-70)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe vergessen, die richtige Hirnregion einzuschalten: Man sollte 
überlegen, welchen Wert man zu einem 32bit-Pointer addiert, um die 
nächste Position zu erreichen... Mein "i += 4;" war natürlich falsch...

Also gelöst!
uli

Autor: Jürgen S. (starblue) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein kleiner Servicehinweis:
Das ist kein CRC, sondern eine einfache Prüfsumme.

(Bin mal gespannt, wie sie das bei dem demnächst erscheinenden LPC55 
machen, da wird dieser Vektor nämlich vom M33-Kern benutzt.)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.