2012-03-26 18 views
3

Ich versuche, einen einfachen Test für RAM zu schreiben, um die grundlegende Integrität des Speichers an Bord eines eingebetteten Geräts zu überprüfen. Dies ist, was ich tun möchte:Wie würde ich in Erinnerung schreiben?

Schreiben Sie im Wesentlichen bestimmte Muster: "10101010101010" in einen Speicherblock schreiben Sie dann "01010101010" dann neu schreiben Sie die erste und testen, ob das Muster geschrieben wurde korrekt.

Ich versuche dieses Programm in C zu schreiben. Ich habe mich gefragt, wie ich dieses Muster schreiben würde. Ich möchte bestimmte Bits innerhalb der RAM-Speicherzellen ein- und ausschalten können.

würde ich nur einen Block von Speicher zuweisen und dann tun etwas schreiben wie

uint32 pattern = 0xaaaaaaaa; 
uint32 * mem_loc = malloc some memory; 
int i = 0; 
int offset = 1; 
uint32 * location = &mem_loc; 

while ((&mem_loc)++ && (!i)) { 
    &mem_loc = pattern; 
    if (!(&(mem_loc+offet))) { 
     mem_loc = location; 
     pattern = 0x55555555; 
     i++; 
    } 
} 

//Check to see if values written are consistent 

Würde der Code über Arbeit ?? Werden die Hex-Muster in den Speicher geschrieben, um die Bits im Muster einzuschalten?

Ich weiß, dass der Code oben schrecklich zerrüttet ist, aber ich will nur eine Idee bekommen, wenn etwas mit der richtigen Logik so das gewünschte Ergebnis erzielen wird.

Dank

+0

Google "Walking One" und "Walking Nullen" Memory-Test-Algorithmen – Throwback1986

+0

Die allgemeine Idee, die Sie beschrieben haben, sollte funktionieren. Der Code, den Sie haben, ist nicht einmal in der Nähe. Zum Beispiel bin ich mir nicht sicher, was "! Int" eigentlich bedeuten soll, aber ich bin mir ziemlich sicher, dass kein richtig funktionierender Compiler das akzeptieren wird. –

+0

Nicht genügend Informationen - hat Ihr Prozessor Cache? Wie steht es mit Ihrem Betriebssystem - hat es ein virtuelles Speichersystem? Interessiert es dich, an welche Adressen du schreibst? Außerdem macht dein Codebeispiel keinen Sinn. Was ist '! Int'? Die Verwendung von 'malloc()' scheint darauf hinzudeuten, dass Ihr Code aus dem RAM läuft - bedeutet das nicht, dass seine "grundlegende Integrität" in Ordnung ist? –

Antwort

3

Sie haben ein Problem mit Huhn und Ei. Um genug Code laufen zu lassen, um mallocs zu machen oder sogar C-Code zu verwenden, haben Sie bereits Arbeitsspeicher.

Sie müssen Ihr Problem definieren. Zum Beispiel ist dies Design-Verifikation oder Produktionstests? Testen Sie den Speicherchip selbst oder die Platine. Normalerweise kaufen Sie funktionierende/getestete Chips (Speicher) oder Speicherchips, die eine vom Verkäufer definierte Qualität haben. Und Ihre Tests sind oft Produktionstests, die Herstellung von Lötpunkten. Die Datenleitungen, die Adressleitungen, die Steuerleitungen.

Das Huhn-und-Ei-Problem ist, dass Sie Software auf dem Embedded-Prozessor ausführen möchten, die Code erfordert, der irgendwo ausgeführt wird, und das bedeutet Speicher (könnte nur Flash sein und nicht oder minimal).Die ideale Situation besteht darin, entweder vollständig aus rom zu laufen, nur Prozessorressourcen oder nur interne Chipressourcen zu verwenden, und keinen externen RAM, so dass der externe RAM vollständig getestet werden kann. Jede Adresszeile usw. Andernfalls müssen Sie ein Schema erstellen oder Speicherbereiche deklarieren, um nicht getestet zu werden.

Oder nehmen Sie einen mehrstufigen Ansatz, der ROM-Boot-Code kann eine schnelle Überprüfung eines kleinen Teils des Widders tun, ohne es zu verwenden. Dann kopiere das Haupttestprogramm auf dieses kleine Stück RAM und laufe darin. Dann teste die Hauptspeicher-Tests mit mehr Code-Flexibilität. Kann C anstelle von Assembler zum Beispiel verwenden. Sie könnten zum Beispiel vor-Test, super einfacher Test, 25% des Widders, dann kopieren Sie den Test dort, testen Sie die anderen 75%, dann verschieben Sie das Programm auf weitere 25% im RAM-Raum und machen Sie den schweren Test auf dem ersten 25%, die einen vollen Test nicht bekommen haben.

Arten von Tests, müssen Sie die Fehler zu verstehen, möchten Sie möglicherweise Lötverbindungen insbesondere und Leiterplatten-Spuren zu testen. So können Sie offene Verbindungen haben, so dass Sie jeden Pin zu einer Eins und Null machen wollen, außerdem können Sie Shorts haben, die die Eins und Null abdecken, und Sie könnten "freundliche Bits" haben, wo benachbarte Pins einen Kurzschluss haben könnten Sie möchten, dass jedes Signalpaar unterschiedlich ist.

Oft Leute werden Tests wie alle, nur Nullen, 5s, As. Dann Checkerboard-Tests, bei denen ein Speicherplatz 5s und der nächste As hat. Für das Testen der Adressleitung müssen Sie Nicht-Potenzen von zwei verwenden, oder noch besser, jeder Speicherplatz im Speicher hat einen anderen Wert, zum Beispiel 32-Bit-Wörter, die jeweils ihre eigene Adresse erhalten.

Als einen schnellen Test beziehe ich das meiste davon in ein paar Tests, wenn Sie einen Pseudo Randomizer verwenden, etwas wiederholbar wie ein lfsr, einen Durchlauf, um den gesamten Speicher mit dem Randomizer zu füllen, neu zu seeden, zurück durch und prüfe. Gehe dann erneut durch und fülle mit invertierten Werten, re-seed und überprüfe invertierte Werte. Sie erhalten Adressbits, jede Datenzeile, aber nicht alle Nachbarn werden überprüft. Das erneute Seeding und das Starten von all dem über das Bewegen des Zufallsmusters kann das abdecken. manchmal nur mit dem Zufalls-Test als Adresstest und die traditionellen Nullen fins As, 3s, Cs, 6s, 9s usw.

so weit wie Ihr Zeiger auf Speicher im Test Sie nicht nur Malloc müssen Sie wissen, die Physische Adresse und behandeln Sie die Übersetzung falls vorhanden, so dass wenn Sie ein Problem haben, Sie in physischen Adressen kommunizieren. Außerdem weißt du und kontrollierst wieviel Speicher du hast. Normalerweise schreibe ich prozessorbasierte Tests in C, verwende aber keine C-Bibliotheksaufrufe (wie malloc oder printf oder ähnliches).

+0

Danke! An dieser Stelle weist das Gerät jedoch genug Fehler auf, sodass manchmal das Schreiben eines Musters an einer "bestimmten" Stelle und das Zurücklesen zu inkonsistenten Ergebnissen führt. – Falcata

0

Haben Sie new verwenden?
Wenn Sie versuchen, bestimmte Bereiche des Speichers des eingebetteten Systems zu testen, möchten Sie diese Adresse nicht direkt festlegen, anstatt sich auf das zu verlassen, was Ihnen new bietet?

Wenn dieses eingebettete System wirklich Linux oder Windows Embedded oder ein anderes komplexes Betriebssystem ist, dann ist es möglicherweise komplexer, Sie können Speicheradressräume für verschiedene Prozesse, Caches, optimistische Zuordnung zu berücksichtigen haben.

+3

'new' ist nicht Teil von C. –

2

Echo @ Martins Antwort: Sie möchten keine Standardbibliotheksaufrufe verwenden, um den Speicher zum Testen bereitzustellen.

Ihre eingebettete Toolchain sollte in der Lage sein, eine Speicherkarte Ihrer Anwendung zu erstellen. Sie müssen die Speichersegmente identifizieren, die Sie testen möchten, und ihre Startadresse aus der Map-Datei extrahieren.

Die Testschleife könnte etwa so aussehen:

const int* AddressToTest = MEM_SEGMENT; 
const int* SegLength  = SEGMENT_LENGTH; 
volatile int* mem; 
for (mem = AddressToTest; mem < AddressToTest + SegLength; mem++) 
{ 
    *mem = PATTERN; 
    if (*mem != PATTERN) {report("Read-Write Failure at %x",mem);} 
} 
//-or- you could separate the write and verify into 2 separate loops. 

Der große gotcha ist, dass Sie das Segment nicht testen können Sie laufen, so dass Sie sorgfältig zu planen. Die eingebetteten Tools sollten eine Art Linkeroptionsdatei (und/oder Compiler #pragmas) haben, die steuern, welcher Code welchen Speicher verwendet. Daher müssen Sie Ihren Testcode so einrichten, dass er an einem anderen Ort als dem zu testenden Speicher ausgeführt wird.

+1

Ich denke, dass ein' volatile' hier fällig ist. –

+0

guter Punkt, hinzugefügt. Siehe auch http://www.barrgroup.com/Embedded-Systems/How-To/Memory-Test-Suite-C für eine gute Erklärung, auf welche Art von Speicherfehlern Sie testen sollten. – AShelly

Verwandte Themen