CRC aus dem Flash



  • Hallo zusammen, ich bin noch recht neu beim Programmieren und habe eine Frage bezüglich der CRC. Folgende Aufgabe: Ich möchte die CRC über den Sector 0,1,3 aus dem Flash laufen lassen, um quasi zu prüfen ob an meinem Quellcode etwas verändert wurde. Zuerst habe ich versucht die Daten aus dem Flash in einen Array zu schreiben. Dieser wurde allerdings zu groß für den Ram und es hat deshalb nicht funktioniert. Hat jemand eine Idee wie man dies noch realisieren könnte, ohne alle Daten in den Ram zu kopieren?

    Grüße und Danke schonmal


  • Mod

    Abschnittsweise?



  • @Lkey CRCs kann man Byte für Byte berechnen. Bei anderen Prüfsummen braucht man grössere Blöcke, aber typischerweise auch nicht mehr als ein paar wenige Byte auf einmal.



  • Ich habe jetzt bei den Beispielen von TivaWare etwas gefunden, wo eine CRC schon vorprogrammiert ist. Dort kann man Startadresse angeben und Blockgröße. Das sollte erstmal funktionieren glaube ich. Allerdings kann man nicht sage "lasse block 2 aus und mache bei block 3 weiter". Man braucht also wahrscheinlich 2 CRC Berechnungen. Mal schauen ob es funktioniert.



  • @Lkey
    Schau dir mal das an: https://wiki.osdev.org/CRC32
    Diese Funktion:

    uint32_t crc32_byte(uint8_t *p, uint32_t bytelength)
    {
    	uint32_t crc = 0xffffffff;
    	while (bytelength-- !=0) crc = poly8_lookup[((uint8_t) crc ^ *(p++))] ^ (crc >> 8);
    	// return (~crc); also works
    	return (crc ^ 0xffffffff);
    }
    

    Die lässt sich sehr leicht anpassen, so dass du beliebige Blöcke "auslassen" kannst, und auch
    nicht alles auf einmal im Speicher brauchst. Das sähe dann so aus:

    uint32_t crc32_byte(uint32_t crc, uint8_t *p, uint32_t bytelength)
    {
    	crc ^= 0xffffffff;
    	while (bytelength-- !=0) crc = poly8_lookup[((uint8_t) crc ^ *(p++))] ^ (crc >> 8);
    	// return (~crc); also works
    	return (crc ^ 0xffffffff);
    }
    

    Verwendung:

    uint32_t crc = 0;
    crc = crc32_byte(crc, block1, lenght1);
    crc = crc32_byte(crc, block2, lenght2);
    // ...
    crc = crc32_byte(crc, blockN, lenghtN);
    


  • @hustbaer sagte in CRC aus dem Flash:

    poly8_lookup

    danke für die Antwort. Als return wird der Wert der CRC berechnung zurückgegegben oder? Ich habe nach dieser poly8_lookup table gesucht, ist diese vordefiniert oder muss man diese zuerst befüllen? Und wenn ich das wie in dem Verwendungsbeispiel mache, beginnt er ja bei dem zweiten Block nicht mit 0 sondern mit dem Endwert des ersten Blocks. Funktioniert das so, also ist das das Gleiche als würde ich dirket über beide Blöcke gehen?



  • Das Array poly8_lookup ist doch in dem Link angegeben (welches einmalig anhand von "Building the Lookup Table" erzeugt wurde)!?!



  • @Lkey sagte in CRC aus dem Flash:

    @hustbaer sagte in CRC aus dem Flash:

    poly8_lookup

    danke für die Antwort. Als return wird der Wert der CRC berechnung zurückgegegben oder?

    Ja.

    Und wenn ich das wie in dem Verwendungsbeispiel mache, beginnt er ja bei dem zweiten Block nicht mit 0 sondern mit dem Endwert des ersten Blocks. Funktioniert das so, also ist das das Gleiche als würde ich dirket über beide Blöcke gehen?

    Ja, das funktioniert so. Du müsstest aber auch nur den Code lesen um zu sehen dass das funktioniert. Nimm dir ein paar Minuten Zeit, das sollte reichen um zu verstehen wie der Code funktioniert/was er macht. Dann siehst du auch dass und warum das so funktioniert.


Anmelden zum Antworten