Checksumme des Codes im Flash berechnen ?

Hallo,

um sicher zu gehen das der Code im Flash nicht geändert ist. Möchte ich gerne ein Prüfrutine am Anfang des Programms haben. Diese soll eine Checksumme berechen, und mit einer im EEProm hinterlegten, 2 mal vorhandenen checksumme abgleichen.
Ist das machbar, und wenn ja. wie müsste ich vorgehen.

Gruss Temucin alias TFT

hilft nur halb aber reicht evtl. der Compile Zeitstempel DATE und TIME um den Stand des Programms mit einem EEPROM Wert zu vergleichen?

Hallo,

es geht nicht um den Zeitpunkt ... sondern um den Code selber. Ich benötige dies, da ich eine Sicherheits relevante sachen machen möchte. Ich muss 100% sicher gehen das der Code sich nicht verändert hat. Das wird Er in der Regel nicht. Aber ich will halt sicher gehen. Es könnte sonst echt was kaputt gehen.

Gruss Temucin alias TFT

Der Code verändert sich nicht von selber. Wenn er das täte, läuft das Programm nicht mehr. Der Code verändert sich dadurch, dass ein anderer Sketch auf den Controller geladen wird. In dem Fall gibt es dann aber auch keine Überprüfung mit der Checksumme im Eeprom. Du müsstest eine externe Überprüfung einbauen z.B. mit einem zweiten Controller, der die Verifizierung durchführt.

Hi

Mit 'echt was kaputt gehen' und 100% wirst Du bei keinem der 'kleinen' µC ans Ziel kommen.
Wenn gar Leben davon abhängt, sind die wenigsten µC dafür gar erst zugelassen - Du Diese dann einfach nicht benutzen DARFST.

Ansonsten schreibe Dir eine Schleife, Die das EEprom ab Adresse 2 bis Ende ausliest, daraus eine 16-Bit-Prüfsumme generiert und Alarm schlägt, wenn Diese nicht mit den ersten zwei Byte im EEprom überein stimmt.
Das wird beim ersten Prüfen passieren, Du brauchst also eine Möglichkeit, diese erste Prüfung zu erkennen, oder eben, wie oft bereits 'geupdated' wurde - dafür 3 Bytes vorne Platz lassen.
Beim EEprom soll 'leer' 0xFF sein - somit böte Es sich an, das erste Ergebnis der Prüfung bei Wert 0xFF zu übernehmen und den Wert auf 0xFE anzupassen.
Jedes Mal, wenn jetzt die Prüfung nicht mehr passt (warum auch immer, ggf. neue Daten ins EEprom geschrieben, wenn's nur ein Datumsstempel ist), wird gemeckert, ggf. mit der Option, diesen neuen Prüfwert zu übernehmen - jedes Mal wird der Merker-Wert um 1 verringert, wenn Null, dann halt nicht mehr, aber 254 EEprom-Überarbeitungen sollten für's Erste ausreichend sein.

MfG

Hallo,

du meinst Daten im Flash? Kennst du schon CRC16?

#include <util/crc16.h>

http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html

Damit prüfe ich zum Bsp. meine serielle Datenübertragung.

Hallo,

ich möchte die Checksumme des Sketshes ... Da ein defektes Flash wo ein Programm nur im deteil falsch funktioniert. Sofort abschalten könne.
Warum brauche ich das ?
Ich baue geraden eine Gravitations Generator, der mit einem Gewicht von 200 Kilo arbeitet. Die Kontrolle für die Kraft übertragung wird mit einem Arduino bewerkstelligt. Wird der Generator zu schnell. Wird mithilfe einer Permanet Magnet bremse ( Stelle Motor ) das System gedrosselt. Diese Kontrolle darf niemals Fehlschlagen. Wenn die Maximal zulässige Drehzahl überschritten wird. Könnte alles kaput gehen. Als Sicherheit habe ich einen Externen Wotchdog, eine überdrezahl Abschaltung und 2 Unabhängige Kontroler. Jetzt brauche ich nur noch die Gewissheit das der Code im Flash 100% der ist, den ich drauf geschrieben habe. Um im Fehler falle die notabschaltung zu aktivieren. Das Gewicht legt eine Strecke von 4 Metern zurück, Wenn die Kontrolle versagt dann hat das Gewicht ungebremst in den Boden. Das möchte ich ein zweites mal vermeiden. Es war schwer genug das Gewicht aus zu buddeln.

MfG Temucin

@Doc_Arduino

danke .. der link wird sicher hilfreich sein.

Wer sagt Dir daß die Prüfroutine überhaupt funktioniert wenn irgendein BIT in Flash umgefallen ist?

Außerdem ist Arduino eine Prototyping Plattform. Ich würde ihn nicht für Sicherheitsrilevante Anwendungen verwenden. Ich würde da immer eine mechanische Lösung vorziehen. Fliehkraftkupplung die die Bremse aktiviert.

@ postmaster-ino
Er redet vom Flash Speicher (wo der Sketch drin ist) und nicht vom EEprom.

Grüße Uwe

Hi

Habe ich mittlerweile auch gemerkt :wink:
Inline-Assembler? LPM (load program memory)

Wobei eine Verifizierung bereits beim Upload eingeleitet werden kann (ist m Standard wohl ausgestellt).
Somit wäre zumindest beim Aufspielen klar, daß das Programm korrekt übertragen wurde.

Wie oft willst Du den Code überprüfen?
Wie wahrscheinlich ist Es, daß sich eines der zu prüfenden Bits verändert?

MfG

temucin:
Ich baue geraden eine Gravitations Generator, der mit einem Gewicht von 200 Kilo arbeitet.

Ein Nobelpreis wird dir sicher sein. ;D

Also wenn die Prüfrutine bei Start Failt, und die anschließende Doppel Kontrolle ebenfalls, dann wird die Bremse gar nicht erst geöffnet. Auch bei Ausfall der Kontroller Spannung haut es die Bremse rein. 2 unabhängige Kontroller prüfen die Geschwindigkeit. Bei überdrehzahl von 10%, bedeutet das. Das die Kraft Kontrolle nicht arbeitet. Dann wird eine notbremsung eingeleitet.

Es ist zwar eher unwarscheinlich das sich ein Bit ändert , aber in diesem falle kann ich nicht vorsichtig genug sein. Mit der Doppelten Kontrolle der Ist Geschwindigkeit genüge ich den meisten Anforderungen schon . Und die Bremse ist an einem Mechanischen Fliehkraft Regler, so wie in der Aufzugtechnik (FangForichtung) angeschlossen. Wenn der einhängt rumst es richtig (30% übergeschwindigkeit).

Gruss Temucin alias TFT

Was den Nobelpreis anbelangt. Das wird nur ein Energie Speicher ..... damit lässt sich keine Energie erzeugen. Na ja .... irgend wie dann doch. Aber eigentlich ist das nur Umwandeln und speichern und wider abgeben ... mit etwa 10% Verlust.

temucin:
Ich baue geraden eine Gravitations Generator,

Dann ist es der falsche Name und hat mit Gravitation nichts zu tun (wahrscheinlich eher mit Trägheit).
Der Generator hatte aber sowie schon das falsche Geschlecht.

temucin:
Das wird nur ein Energie Speicher ..... damit lässt sich keine Energie erzeugen.

Also ist es nicht einmal ein Generator... :o

Da musst du aber aufpassen, dass die ganze Elektronik nicht mehr Energie verbraucht als deine Konstruktion speichert. 200kg= ca. 2000N Gewichtskraft. Potentielle Energie: Epot=2000N*4m=8000J

Mignon-NiMH-Akku: 1,2V, 2000mAh: Da die Spannung bei hohen Strömen etwas einbricht: P=1V2A=2W, Eel=Pt=2W*3600s=7200J=8000J-10%

Dein Speicher ist ungefähr genauso “gut” wie ein NiMH-Akku vom Discounter für 1Euro.

Wenn es um Bastelspaß geht, sei dir die Sache unbenommen. Technisch sinnvoll ist es nicht.

postmaster-ino:
Inline-Assembler? LPM (load program memory)

Das Flash kannst du auch mit pgm_read_byte() auslesen. Die Vorgehensweise hier ist die gleiche die man bei PROGMEM verwendet

Hallo,

okay du meinst doch Sketch, nicht irgendwelche Daten.
Wie man das nachträglich bei Bedarf macht bin ich überfragt.

Die IDE jedenfalls überprüft standardmäßig die Daten nach dem Upload nochmal. "rot"
Das kann man in den Einstellungen sichtbar machen. "blau"
Grundsätzlich einschalten sollte man "Alle" Compilerwarnungen. "schwarz" Hilft sauberen Code zu schreiben.

Ansonsten könnte man vielleicht eine Art Systemcheck programmieren, der in setup aufgerufen wird nach einschalten.
Meine Frage wäre auch, was ist ausgefallen das dein Gewicht in den Boden gerammt wurde.

Deine mehrfachen Drehzahlüberwachungsarduinos haben auch jeder ihren eigenen Drehzahlsensor? Nicht das alle auf den gleichen Sensor zugreifen? :wink:

@Theseus

du scheinst rechnerisch voll fit zu sein. Ich bin das nicht. Ich würde gerne vorher Berechnen was dabei raus kommt. Aber da ich es nicht kann, muss ich es Ausprobieren. Das Gewicht wird über eine Getriebe übersetzung einen Generator antreiben der für ein Windrad gedacht ist. Dann habe ich noch ein Solar Pannel und ein Windrad auf den Dach. Wenn die Batterie voll ist wird mit der Energie die ungenutzt ist, eine Motor das Gewicht nach oben bewegen. Und wenn keine Sonne scheint und kein lüftchen weht sowie die Batterie dem Ende zugeht. Soll das Gewicht den Generator antreiben um weiter Strom zu erzeugen. So der Plan. Ob das hinhaut????? Aber es macht Spass daran zu arbeiten. Andere versuchen Freie Energie zu ernten. Ich will nur Spielen :slight_smile:

Gruss Temucin alias TFT

Hi

Davon will ich aber ein Bild haben - selber nur ein 08/15 Windrad in 6m Höhe und nahezu keine Ernte dort, 4 PV-Module an >1000Ah Blei-Akku (Ameise/Stapler-Akku, runderneuert) und eine normale PV auf dem Dach - Das will auch Mal intelligent zusammen benutzt werden - ist aber, trotz meiner Forderung Dir gegenüber, nicht vorzeigbar.

Stelle mir Das schon spannend vor, wenn Da 200kg angetrieben werden sollen - habe nur die Befürchtung, daß dieser Drehimpuls nicht lange erhalten bleibt - zum Spielen unerheblich, zum Energie-Speichern schon mehr.

Wie sicherst Du das Drum-Herum ab? Trassband wird hier wohl nicht ausreichend sein - wie ich Deine Ausführungen verstehe, hat sich auch schon Mal das Gewicht selbstständig gemacht ... stelle ich mir dann auch eher unschön vor.

MfG

temucin:
Hallo,

um sicher zu gehen das der Code im Flash nicht geändert ist. Möchte ich gerne ein Prüfrutine am Anfang des Programms haben. Diese soll eine Checksumme berechen, und mit einer im EEProm hinterlegten, 2 mal vorhandenen checksumme abgleichen.
Ist das machbar, und wenn ja. wie müsste ich vorgehen.

Gruss Temucin alias TFT

Bist du bereit Arbeit zu investieren?
Dann würde es sogar einen Weg geben, ohne das EEPROM zu belasten.

recipe.hooks.savehex.postsavehex.NUMBER.pattern
Hier könntest du eine Routine einhängen, welche dir die Prüfsumme berechnet und ans Ende des Flash schreibt.

Der Arduino selber, kann die Summe dann ja so oft überprüfen, du willst.