Forum: Mikrocontroller und Digitale Elektronik CRC über den ganzen ROM


von mika (Gast)


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

von Troll (Gast)


Lesenswert?

...was ist das Ziel ... den Bitfehler im ROM nach 1000 Jahren sicher zu
bemerken.. oder wars eher ein EEPROM

von mika (Gast)


Lesenswert?

Das verlangt der TÜV weil es sicherheitsrelevant ist.

von Tony _. (tony_s)


Lesenswert?

Ich würde das so machen, dass ich periodisch (reicht einmal pro
Sekunde?) vom ROM vom ersten bis zum letzten Byte den CRC berechnen
würde.

Zum Thema CRC gibt es viel hier und auch im Netz oder was meinst du
genau mit "der günstigste Weg"?

Gruss

von <°--->< (Gast)


Lesenswert?

...irgendwie muss ja auch mein CRC-Wert wieder dem Programmm bekannt
gemacht werden - kann aber nicht im Code stehen.....

**Abo**

von mika (Gast)


Lesenswert?

Der CRC-WERT kommt in den EEPROM oder die Speicherstelle, an der der
abgelegt ist, wird von der Prüfung ausgeschlossen.

von Gonzo (Gast)


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

von mika (Gast)


Lesenswert?

@Gonzo EN 61508-7:2001

von Anfänger (Gast)


Lesenswert?

Hallo,

kann mir da einer ein Programmier Beispiel geben. wie das ganze laufen 
sollte?

von Gast (Gast)


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!

von Ralph (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.