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!