Wie werden RAM/ROM memory failure entdeckt

#895551
Lesenswert?

ROM-Fehler ist einfach. Frisch beim/nach dem Programmieren CRC vom 
gesamten Inhalt berechnen und irgendwo speichern, ob nun mit im ROM oder 
im EEPROM. Und gelegentlich zur Start- oder auch Laufzeit mal 
überprüfen.

RAM-Fehler beim Start wird interessanter, weil's eigentlich nur in 
Assembler möglich ist und wenn trotzdem C verwendet werden soll, dann zu 
einem Zeitpunkt nötig ist, bevor der C Startupcode auch nur spitzkriegt 
dass es ihn gibt.

Dafür haben permanente RAM-Fehler den Vorteil, nachträglich eher selten 
aufzutreten, während Flash-ROM prinzipbedingt deutlich empfindlicher 
ist.
Gast #895554
Lesenswert?

Rom:
- Beim erzeugen des Hexfiles eine CRC berechnen und diese im Rom 
ablegen.
- Beim Programmstart den CRC des Rom berechnen und mit der abgelegten 
CRC vergleichen.
- Mit abspeichern der Zwischenwerte lässt sich sowas auch während der 
Programmausführung machen, indem pro Zeiteinheit nur einige Romzellen 
berechnet werden und nach einer längeren Zeit die berechnung dann 
komplett ist.

Ram:
- irq sperren
- Inhalt der zu prüfenden RAM Zelle an eine andere Stelle kopieren 
(retten)
- verschieden  Muster (zb 0x00, 0x55, 0xAA, 0xFF) in die zu püfende RAM 
Zelle schreibe und wieder auslesen
- abschließend den geretten Wert wieder in die RAM zele zurückschreiben
- irq wieder freigeben

EEPROM:

- das EEPROM in Datenblöcke unterteilen und jeden Datenblock mit einer 
eigene CRC absichern
- bei jedem Zugriff diese CRC prüfen
#895558
Lesenswert?

Hallo,

bevor du los legst musst du dir darüber klar werden welche Fehler du im 
RAM erkennen willst. Es gibt Tests zum Erkennen von statischen Fehlern 
und Tests zum Erkennen von Querschlüssen zwischen Speicherzellen.

a) Statische Fehler bedeutet: wenn ein Bit ständig auf 1 oder 0 fest 
hängt egal welchen Wert man reinschreibt (== Speicherzelle kaputt)

b) Querschlüsse bedeutet: wenn man z.B. Bit 1 von Byte 100 ändert, 
ändert sich ungewollt auch Bit 5 von Byte 30 mit (== Speicherzellen 
haben aufgrund eines Fehlers eine Verbindung auf dem Chip)

Für den Test a bedeutet das z.b. wie folgt:

falls nötig: interrupts deaktivieren;
für alle RAM-bytes x von SPEICHERGRÖßE
{

  wert von RAM-Byte x sichern;

  RAM-Byte x mit 0xAA beschreiben;
  RAM-Byte x auslesen und gelesenen wert mit 0xAA vergleichen;
  -->fehler wenn wert nicht gleich ist

  RAM-Byte x mit 0x55 beschreiben;
  RAM-Byte x auslesen und gelesenen wert mit 0x55 vergleichen;
  -->fehler wenn wert nicht gleich ist

  sicherung von RAM-Byte zurück schreiben;
}
interrupts wieder frei geben;

Wenn man den Speicher in einzelne Bereiche aufteilt kann man den Test 
auch gut im vollen Betrieb durchführen. Bei den Tests für Querschlüsse 
gibt es das Problem, dass die einzelnen Bereiche komplett mit einem 
durchlaufenden Muster gefüllt werden müssen und somit alle Bytes des 
Bereiches irgendwo hin zwischengespeichert werden müssen (und auch der 
Stack umgelegt werden muss).

Diese Tests nennen sich dann z.B. (google)
- March C (oder March B ?)
- transparenter Galpat Test
...


Der Check des ROM-Speichers ist da schon einfacher und sollte eigentlich 
auch problemlos im laufenden Betrieb funktionieren.
--> Einfach vom Compiler/Linker an das Ende des Flash-Speichers eine CRC 
Checksumme eintragen lassen (z.B. 2 Byte) und im Betreib z.B. in jedem 
Main-Durchlauf ein ROM-Byte auslesen und damit schön langsam über eine 
Entsprechnede CRC-Berechnungs-Funktion den CRC Wert berechnen. Am Ende 
dann den berechneten Wert mit dem Wert aus dem Flash-Speicher 
vergleichen.

Falls du auch mal google,de befragen willst, würde ich dir emfehlen nach 
folgenden Begriffen zu suchen:
- software class b / software class c
- stuck-at error  galpat test  walkpat test / abraham test
- CRC16  Technical Note 91733  AVR998
Gast #3678171
Lesenswert?

Hallo zusammen,

ich brauche Hilfe um RAM-fehler zu entdecken.
habe hier oben den Kommentar gelesen aber nicht verstanden, kann jemand 
es vielleicht erklären???:-(((
bin für jeden Tip Dankbar !



zitat:

"Ram:
- irq sperren
- Inhalt der zu prüfenden RAM Zelle an eine andere Stelle kopieren
(retten)
- verschieden  Muster (zb 0x00, 0x55, 0xAA, 0xFF) in die zu püfende RAM
Zelle schreibe und wieder auslesen
- abschließend den geretten Wert wieder in die RAM zele zurückschreiben
- irq wieder freigeben

"
#3679268
Lesenswert?

Peter schrieb:
> Hallo ,
>
> vielleicht an Hand von Beispielen erklären, wenn es geht???

Oder vortanzen?
Mal ehrlich, was verstehst du daran nicht?

> meine Frage lautet : wie speichere ich die Checksumme in eine RAM-zelle?
Eine Ram-Zelle ist eine Speicherstelle im RAM. WIE du da rein schreibst 
hängt von deiner Programmiersprache ab. In ASM gibt es, je nach 
Controller, spezielle Befehle um den RAM zu lesen und zu schreiben.

Aber sag mal, warum benötigt jemand, mit deinem fulminanten Wissen, 
überhaupt eine RAM/ROM Prüfung? Selbst wenn dein Code intakt ist, was 
könnte man dann überhaupt davon erwarten?
Gast #3679383
Lesenswert?

Fred schrieb:
>> erst ein richtiger Ramtest mit Zufallszahlen.
> Meine Güte, so wenig Ahnung muß man erstmal haben.
> Wer verwendet denn bitte schön Zufallszahlen für RAM-Tests? Also außer
> dir.

Das funktioniert seit ca. >20 Jahren recht erfolgreich. Weil man damit 
doppelte Adressen und Einzelfälle herausbekommt. Wenn Du bessere Ideen 
hast, kannst Du sie uns gern alle verraten.

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