Hallo zusammen!
Ich hab ein 8051er Mikrocontrollersystem mit externem 32k SRAM.
Nach dem Einschalten möchte ich während der Initialisierungsphase
den Speicher gerne mittesten.
Gibt es typische Algorithmen, die man da verwendet?
Mein erster Ansatz wäre ansonsten, das RAM mit einem Muster zu
füllen und darüber eine CRC16 Checksumme zu bilden (CRC16 hab
ich eh an anderer Stelle schon im Programm, daher...).
Oder hat jemand noch eine bessere Idee?
Danke und Gruß, Frank
Ansosnten halt ich nicht viel von RAM tests, weil vieleicht macht sich
der Fehler erst nach X Sekunden bemerkbar... oder wenn die Temperatur
26.789654°C übersteigt... oder oder oder. Naja aber ansosnten ist die
Schreiben+Rücklesen Methode wohl am einfachsten.
Ja Läubi, klar geht das so am einfachsten.
Aber was wenn z.B. auf der Platine ne Adressleitung klemmt.
Dann bekomme ich unter Umständen immer noch korrekte Ergebnisse,
wenn das Muster das ich reingeschrieben habe so schön gleichmäßig ist.
Na das war ja nur ein Beispiel! Von miraus schreib primzahlen rein oder
so aber ne CRC16 über werte zu Berechnen die du reinschreibst ist doch
nicht sehr sinnvoll in meinen Augen.
Ich weiß ja nicht wie breit dein Speicher angebunden ist (8, 16, 32 ...
bit) aber du kannst natürlich dir auch eine Primzahl aussuchen die
gerade noch in deine Speicherbreite passt oder einfach eine Zahl welche
keine Zweierpotenz ist, und schon kannst du bei einer klemmenden
Addressleitung nie das zurücklesen was du geschrieben hast.
@MC
So arbeitet doch mein Algorithmus oder hab ich dich falsch verstanden?
@Michael Wilhelm
Ich hab keine Ahnung was du sagen willst, das sollte aber auch nur ein
Pseudocode sein ;)
Selbsttests wie RAM-Tests sind eine Wissenschaft für sich... aber gute
Stichworte sind z.B.:
- Checkerboard
- March
- Walkpath
- Galpat (transparenter Galpat)
- Abraham
@Travel Rec.: Siehs so rum: Damit wird bestätigt, dass es kein
unsauberes Layout ist.
Übrigens, RAM-Tests sind auch in Prozessoren, die gar kein externes
RAM haben, aber in in sicherheitsrelevanten Bereichen eingesetzt werden,
vorgeschrieben.
Ein Speichertest ist wie der TÜV: Im Moment der Prüfung war's ok.
Das garantiert jedoch noch lange nicht, daß in allen Lebenslagen alles
funktioniert. Es könnten z.B. Licht- /Wärme- /Zeit- /Wait- /Refresh-
/Spannungs-Probleme noch für kleine Überraschungen sorgen.
Es ist trotzdem eine sehr gute Tat, einen Eigentest zu starten, da man
im Servicefall Fehler damit schneller findet oder rechtzeitig durch
Notaus Schlimmes verhindert (z.B. Wasserzufuhr aus)
Frage wäre noch ob das Testprogramm bei kaputter Adressleitung überhapt
startet.
Während der CRC-Prüfung sollten sich die RAM-Daten möglichst nicht
ändern :-)
Also das RAM ist zu 8 bit organisiert und angebunden.
>Ein Speichertest ist wie der TÜV: Im Moment der Prüfung war's ok.
Das ist doch schon nicht schlecht. Der TÜV wäre dann in erster
Instanz nämlich der Fertiger, der gleich merkt, dass er beim
Bestücken was versaut hat.
>Frage wäre noch ob das Testprogramm bei kaputter Adressleitung>überhapt startet.
Da hast du natürlich recht. Wenn eine Leitung wirklich klemmt,
dann läuft der Flash auch nicht. Aber sehen wirs anders herum,
das RAM ist bei erfolgreichem Test zumindest korrekt angelötet
und es hängt kein Beinchen in der Luft. ;-)
>Während der CRC-Prüfung sollten sich die RAM-Daten möglichst>nicht ändern :-)
Ist klar. Im diesem RAM liegen auch keine Variablen die für den
eigentlichen Programmablauf benutzt werden. Es werden erst
später Listen dort gespeichert und wieder abgerufen.
Danke "Theno" für die Stichworte. Werde ich mal abklappern.
>dann schreib erst alle Werte hinein und lese anschließend alle Werte>wieder aus. Fehlen welche, so könnte eine Adressleitung klemmen.
"Klemmt" eine Addressleitung dann schreibt man an die falsche
Speicheraddresse, der gleiche Fehler ist dann auch beim Lesen zu
erwarten, ergo findet man mit dieser Methode den Fehler überhaupt nicht.
Besser sind dann zwei Tests. 1. Test schreibt/Liste die Werte 0x00 und
0xFF pro Adresse. 2. Test schreibt erstmal die Addresse selber in alle
Speicherzellen linear, und liest dann in einem zweiten Durchgang wieder
diese Daten zurück um sie mit der Addresse zu vergleichen. Alternativ
nimmt man ein Zufallsgenerator bei dem man den Seed einstellen kann und
schreibt nun diese Zufallsbytes linear in den kompletten Speicher. Beim
2. Durchlauf reinitialisiert man diesen RNG mit dem gleichen Seed und
liest nun die Daten wieder aus dem SRAM und vergleicht sie mit dem RNG.
Sollte eine Addressleitung klemmen so werden Daten an falschen Addressen
beim Zugriff auf andere Addresse üvberschrieben, mit individuellen
Datenmustern und zweistufigem Schreiben und Lesen kann man sowas
rausfinden.
Gruß Hagen
Ein nützlicher Hinweis für den Service ist die Anzeige der
Testdurchäufe.
ca. 50 % meiner offensichtlichen RAM-Fehler habe ich bei 00-FF und
Adressierungstests gefunden. Den Rest hat der RAM-Zufallstest und der
erbarmungslose Hardwaretausch gebracht. Manche Fehler sind aber erst
nach stundenlangen Testdurchläufen, fönen, kühlen oder speziellen
zeitlichen Problemen (Maschinenzyklus, Busprobleme) ans Licht gekommen.
Mein kuriostester Fall aus der Vergangenheit war ein
"lichtempfindlicher" Schaltkreis in der Adressierung, den ich mit der
75W-Arbeitslampe gefunden habe.
Interessant wäre noch ein Test, der ein auszuführendes Programm durch
den Speicher schiebt, da hierbei der RAM mehr Stress bekommt.
Ob der User jedoch geduldig genug ist, bis ALLE Varianten durchgeprüft
sind, bleibt offen.
Ehrlich gesagt verstehe ich euch nicht so ganz. Wir produzieren hier am
Laufenden Band Schaltungen mit ATMega128 und ISSI bzw. Cypress 32kByte
SRAMs (12ns) und hatte noch nie ein Problem damit. Die Testschaltungen,
auf denen wir die Programme erstellen, laufen hier fast rund um die Uhr.
Nix mit wackelnden RAM-Bits oder ähnlichen Dingen...
Ich habe auch weniger Sorge, dass das RAM im Betrieb oder später
beim Kunden mal ausfallen sollte. Ich möchte lediglich sicherstellen,
dass es zum Zeitpunkt der Fertigung funktioniert, da das Feature
wofür das RAM benötigt wird, erst später ggfs. durch ein FW-Update
nachgereicht werden soll.
Ich krame mal diesen etwas älteren Thread aus. Hast du mittlerweile
eine Implementierung dafür?
Ich suche gerade einen Test, um 4 MiB SRAM an einem AVR in Betrieb
zu nehmen. Mir geht's dabei wie dir nur darum festzustellen, dass
der RAM korrekt verlötet ist, also keine offenen Leitungen oder
Kurzschlüsse existieren.
Ich finde beim Suchen zwar einige Abhandlungen, beispielsweise ist
http://larc.ee.nthu.edu.tw/~cww/n/625/6253/m02MT0502.pdf
offenbar nicht schlecht, aber mit Sourcecode scheint nicht viel zu
finden zu sein. Das hier vielleicht:
http://www.netrino.com/Embedded-Systems/How-To/Memory-Test-Suite-C
Hat sonst noch jemand was bzw. Kritiken zu den genannten Referenzen?
Ich möchte nur ungern Fahrräder nochmal erfinden.
Hallo!
Der gute alte Sinclair Spectrum hat das so gemacht:
1. alle RAM-Zellen mit 02h füllen, und zwar mit LDIR
(für alle nicht Z80-er: erste Zelle mit 02 beschreiben, dann Zelle lesen
und gelesenen!!! Wert in nächste Zelle usw. bis Speicherende - so kommt
bei vielen Fehlern am Ende Müll raus.)
2. dann erste Zelle lesen, dekrementieren und zurückschreiben
3. nochmal lesen, dekrementieren und zurückschreiben
4. jetzte auf null testen
5. wenn null dann nächste Zelle
6. wenn nicht null - Speicherfehler oder Speicherende
Jetzt hat man einen komplett gelöschtes RAM und kann die ermittelte
Speichergröße mit dem erwarteten Wert vergleichen.
Zugegeben es werden nicht alle Fehler entdeckt.
Aber aus meiner Erfahrung sehr viele, ist schnell in Code gestrickt,
braucht wenig Resourcen und ist relativ schnell.
Danke, das werde ich dann auch mal übernehmen.
Auf irgendeiner Kassette :) müsste ich auch noch den Speichertest des
AC-1 (Selbstbaucomputer der Zeitschrift FUNKAMATEUR aus den 1980er
Jahren) haben... Der war gar nicht so schlecht, hat mir damals viel
bei der dRAM-Inbetriebnahme geholfen. Aber den alten Z80-Assembler
in C zu portieren, wäre wohl auch nochmal ein Stück Arbeit, außerdem
müsste man die alte Kassette ja erstmal irgendwie eingelesen bekommen.
Danke nochmal. Sieht so aus, als hätte ich auf der ersten Platine nun
meinen RAM ordentlich verlötet. Vor dem Auflöten schlug der Speicher-
test fehl :), jetzt geht er.