mikrocontroller.net

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


Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int count = 0;
for (int i = 0; i<RAMSIZE;i++) {
 RAM[i] = count++;
}
count = 0;
for (int i = 0; i<RAMSIZE;i++) {
 if (RAM[i] != count++) {
  print ("Speicherfehler!");
 }
}
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.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Läubi

nur wenn es 16-bit organisiert ist.

MW

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MC (Gast)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Berti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Such mal nach Abraham RAM Test

Autor: Theno (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Theno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: oszi40 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: oszi40 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/Mem...

Hat sonst noch jemand was bzw. Kritiken zu den genannten Referenzen?

Ich möchte nur ungern Fahrräder nochmal erfinden.

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

#define MEMTEST_START    0x3000
#define MEMTEST_SIZE     0x8000  // 32k
#define MEMTEST_PATLEN   257    // Primzahl, 00..FF kommmt vor und ihr Quadrat ist > 64k

/*******************************************************************************
* SRAM - Test
*******************************************************************************/
BOOL RAMTest(void)
{
  idata BYTE xdata * pRAM = MEMTEST_START;
  idata USHORT i;
  idata USHORT testval;

  testval = 0;
  // Testpattern schreiben
  for (i = 0; i < MEMTEST_SIZE; i++)
  {
    *(pRAM+i) = (BYTE)testval;
    if ( ++testval >= MEMTEST_PATLEN ) { testval = 0; }
  }

  testval = 0;
  // Testpattern zurücklesen und prüfen
  for (i = 0; i < MEMTEST_SIZE; i++)
  {
    if (*(pRAM+i) != (BYTE)testval) { return FALSE; }
    if ( ++testval >= MEMTEST_PATLEN ) { testval = 0; }
  }

  return TRUE;
}


Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gern geschehen! :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.