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
1 | int count = 0; |
2 | for (int i = 0; i<RAMSIZE;i++) { |
3 | RAM[i] = count++; |
4 | }
|
5 | count = 0; |
6 | for (int i = 0; i<RAMSIZE;i++) { |
7 | if (RAM[i] != count++) { |
8 | print ("Speicherfehler!"); |
9 | }
|
10 | }
|
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.
dann schreib erst alle Werte hinein und lese anschließend alle Werte wieder aus. Fehlen welche, so könnte eine Adressleitung klemmen.
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
Und ich dachte schon, SRAM-Speichertests gehören der Vergangenheit an. Ein unsauberes Layout damit kaschieren zu wollen, ist fragwürdig.
@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.
Hallo Jörg! Ich habs letztendlich so gelöst und kann damit erwiesenermaßen "klemmende" Daten- und Adressleitungen erkennen. Das hat mir dann gereicht.
1 | #define MEMTEST_START 0x3000
|
2 | #define MEMTEST_SIZE 0x8000 // 32k
|
3 | #define MEMTEST_PATLEN 257 // Primzahl, 00..FF kommmt vor und ihr Quadrat ist > 64k
|
4 | |
5 | /*******************************************************************************
|
6 | * SRAM - Test
|
7 | *******************************************************************************/
|
8 | BOOL RAMTest(void) |
9 | {
|
10 | idata BYTE xdata * pRAM = MEMTEST_START; |
11 | idata USHORT i; |
12 | idata USHORT testval; |
13 | |
14 | testval = 0; |
15 | // Testpattern schreiben
|
16 | for (i = 0; i < MEMTEST_SIZE; i++) |
17 | {
|
18 | *(pRAM+i) = (BYTE)testval; |
19 | if ( ++testval >= MEMTEST_PATLEN ) { testval = 0; } |
20 | }
|
21 | |
22 | testval = 0; |
23 | // Testpattern zurücklesen und prüfen
|
24 | for (i = 0; i < MEMTEST_SIZE; i++) |
25 | {
|
26 | if (*(pRAM+i) != (BYTE)testval) { return FALSE; } |
27 | if ( ++testval >= MEMTEST_PATLEN ) { testval = 0; } |
28 | }
|
29 | |
30 | return TRUE; |
31 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.