CRC über den ganzen ROM

Gast #356968
Lesenswert?

Hallo,
habe die Aufgabe einen CRC über den kompletten ROM zu berechnen.
Das Ganze muss ständig im Hintergrund (einer StateMachine) laufen.

Bin mir leider nicht ganz im klaren was der günstigste Weg ist.
µC ist ein PIC16F917.

Hat jemand sowas schon mal gemacht oder hat ne gute Idee ?

Gruß Mika
Gast #356974
Lesenswert?

Hallo,

ich denke dass die CRC Berechnung über den gesamten ROM Bereich relativ
lange dauert und evtl. deine Applikation stören könnte. Um diese
Störungen zu minimieren könntest Du deine CRC Berechnung so aufteilen,
dass pro Aufruf immer nur ein paar Byte hinzugefügt werden.
Ist ein bestimmter CRC Algorithmus vorgeschrieben?
Auf welche Norm beziehst Du dich?

Gruß,
Gonzo
Gast #1004558
Lesenswert?

Ich nehme (o.B.d.A.) an, Du hast einen 10ms Timerinterrupt.
Die CRC Pruefung solle einmal durch sein, bevor der Watchdog
ablaeuft und diesen triggern. Rechne fuer einen Tabellen-CRC16
~20 Taktzyklen(Assembler), folgende Signatur:

crc-16: CRC-16-State-alt x 1 Byte  -> CRC-16-State-neu

Eine weitere Annahme ist, dass Du in der in der Timerroutine
160 Taktzyklen Zeit hast (-> 8 Werte). Das (E)Eprom sei 32KB gross.
Anf-Addr und End-Addr sind die Anfangs bzw. Endadresse des zu
ueberpruefenden Speichers.

init: Eprom-pointer=Anf-Addr
      watchdog-reset sequence
      ret

;Timerinterruptroutine
t10msint: <Timerroutine-alt>
      8 x { CRC-State := crc-16(CRC-State,Eprom-pointer++) }
      [ggf. je nach WDT bzw. mainloop eine watchdog-reset sequence]
      Eprom-pointer == End-Addr+1 ? nein -> RETI(Return from Interrupt)
      CRC-State == abgespeicherter CRC-Pruefsumme? ja -> init(); RETI
loop: alle Peripherie in Safety Konfig, jmp loop; (warte auf wdt)

Damit wird alle 32k/8 = 2^15/2^3 *10 ms =
                4096 *10 ms ~ 40 Sekunden das (E)EPROM
ueberprueft. Der CRC ist nicht geeignet fuer "bewusste" Aenderungen
des Inhalt (hier besser mindestens z.B. SHA-1), da war der TUEV
gnaedig ;-) .

Viele Gruesse,
Hans Hein

PS: Updates des Inhalts sind mit den Anforderungen um
einiges interessanter!
Gast #1004612
Lesenswert?

Die Vorgabe für sicherheitsrelevante Systeme ist die Prüfung des 
Programmspeichers. Datenspeicher wie das EEPROM sind etwas anderes und 
müssen Inhaltsbezogen überprüft werden.
Vorschlag für den Programmspeicher wäre:
1. Das letzte Datenwort des Programmspeichers ist die Checksumme
2. Beim erzeugen des Programms die zu erwartende Checksumme  in das 
letzte Datenwort des Programmspeichers schreiben.
3. Während der Programmausführung zeitgesteuert, zb TimerIRQ, oder 
taskbasierendes System, wird bei jedem aufruf einige Datenworte des 
Programmspeichers auf die Checksumme aufgerechnet. Bei erreichen der 
Checksumme sollte die berechnete und die abgelegte Checksumme passen.

Welche Checksummenberechnung mindestens verwendet werden muss, ist vom 
Sicherheitslevel abhängig. Das kann von einfacher Addition aller 
Datenworte über CRC bis hin zu hardwareunterstütze Verfahren gehen.

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