Forum: Mikrocontroller und Digitale Elektronik Speichertest ext. 32k RAM


von ARM-Fan (Gast)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Michael Wilhelm (Gast)


Lesenswert?

@ Läubi

nur wenn es 16-bit organisiert ist.

MW

von ARM-Fan (Gast)


Lesenswert?

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.

von MC (Gast)


Lesenswert?

dann schreib erst alle Werte hinein und lese anschließend alle Werte 
wieder aus. Fehlen welche, so könnte eine Adressleitung klemmen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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 ;)

von Berti (Gast)


Lesenswert?

Such mal nach Abraham RAM Test

von Theno (Gast)


Lesenswert?

Selbsttests wie RAM-Tests sind eine Wissenschaft für sich... aber gute 
Stichworte sind z.B.:
- Checkerboard
- March
- Walkpath
- Galpat (transparenter Galpat)
- Abraham

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Und ich dachte schon, SRAM-Speichertests gehören der Vergangenheit an. 
Ein unsauberes Layout damit kaschieren zu wollen, ist fragwürdig.

von Theno (Gast)


Lesenswert?

@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.

von oszi40 (Gast)


Lesenswert?

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 :-)

von ARM-Fan (Gast)


Lesenswert?

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.

von Hagen R. (hagen)


Lesenswert?

>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

von oszi40 (Gast)


Lesenswert?

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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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...

von ARM-Fan (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Route_66 (Gast)


Lesenswert?

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.

von ARM-Fan (Gast)


Lesenswert?

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
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von ARM-Fan (Gast)


Lesenswert?

Gern geschehen! :-)

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
Noch kein Account? Hier anmelden.