Forum: Mikrocontroller und Digitale Elektronik ATmega168PA, RAM testen


von Andreas H. (heilinger)


Lesenswert?

Hallo,

ich benutze einen AVR ATmega168PA und möchte nach dem Starten des uC 
einen RAM-Test durchführen. Gibt es da schon vorgeschrieben 
Testfunktionen?

von Karl H. (kbuchegg)


Lesenswert?

1) Assembler oder C?

2) Bei C musst du sehr früh das Kommando bekommen, ehe sich die C-
   Runtime im Speicher breit macht. Zu Beginn von main() ist es
   jedenfalls zu spät, viel zu spät.

3) Einfach in einer Schleife den Speicher mit 0xAA vollschreiben,
   danach in einer 2-ten Schleife überprüfen, ob überall 0xAA drinnen
   steht.
   Dann dasselbe Spielchen nocheinmal, diesmal mit 0x55

4) Auf einem AVR fällt der SRAM normalerweise nicht aus. Und wenn doch
   dann wurde der IC malträtiert und ist ohnehin nicht mehr glaubwürdig.

von Andreas H. (heilinger)


Lesenswert?

Karl heinz Buchegger schrieb:
> Assembler oder C?

->C

Karl heinz Buchegger schrieb:
> Bei C musst du sehr früh das Kommando bekommen, ehe sich die C-
>    Runtime im Speicher breit macht. Zu Beginn von main() ist es
>    jedenfalls zu spät, viel zu spät.

Hm, kann ich dann den RAM-Test zu Beginn der main() durchführen und 
anschließend die Startwerte von allen Variablen setzen?

Karl heinz Buchegger schrieb:
> Einfach in einer Schleife den Speicher mit 0xAA vollschreiben,
>    danach in einer 2-ten Schleife überprüfen, ob überall 0xAA drinnen
>    steht.
>    Dann dasselbe Spielchen nocheinmal, diesmal mit 0x55

Ich denke (hoffe) mal, dass es einen vorgeschrieben C-Code schon gibt. 
Will die Gartenschere ja nicht neu erfinden ;)

Karl heinz Buchegger schrieb:
> Auf einem AVR fällt der SRAM normalerweise nicht aus.

Befürchte ich auch nicht, ist aber einfach nur eine Routine-Kontrolle, 
um 1000000000% sicher zu gehen...

von Karl H. (kbuchegg)


Lesenswert?

Andreas Heil schrieb:

> Hm, kann ich dann den RAM-Test zu Beginn der main() durchführen und
> anschließend die Startwerte von allen Variablen setzen?

Nein.
Du bist zwar fast aber dann doch nicht komplett alleine auf dem µC. Da 
muss der Stack initialisiert werden und wer weiß, was sich die C-Runtime 
sonst noch so alles im Speicher abgelegt hat. Auch wenns nicht viel ist, 
aber ein paar Hilfsvariablen wird es da schon im Speicher geben.

Probieren kannst du es. Mehr als einen heftigen Absturz bei irgendeiner 
Systemfunktion riskierst du nicht.

Aber ich fürchte: Wenn das SRAM tatsächlich fehlerhaft ist, wird dein 
Programm unter Umständen gar nicht bis main() kommen :-)


>> Einfach in einer Schleife den Speicher mit 0xAA vollschreiben,
>>    danach in einer 2-ten Schleife überprüfen, ob überall 0xAA drinnen
>>    steht.
>>    Dann dasselbe Spielchen nocheinmal, diesmal mit 0x55
>
> Ich denke (hoffe) mal, dass es einen vorgeschrieben C-Code schon gibt.
> Will die Gartenschere ja nicht neu erfinden ;)

Wenn dich dieser 8 Zeiler vor Probleme stellt:
Lasse es ganz einfach. Sinn macht das sowieso keinen.

Wie willst du eigentlich das fehlerhafte RAM dem Benutzer anzeigen und 
wie machst du das, wenn du kein funktionierendes SRAM zur Verfügung hast 
:-)

von Andreas H. (heilinger)


Lesenswert?

Hm, ich denke dass ich diese Aufgabe meistern kann, nur eben mit etwas 
mehr Zeitaufwand... Aber najut, ich bekomme das schon hin.

Und wenn mein kompletter uC im Arsch ist, kann ich das auch schlecht 
ausgeben über ihn, das ist mir schon klar. Aber was ist denn, wenn nur 
einige Zellen vom SRAM defekt sind, oder kann das nicht passieren (also 
nur komplett oder gar nicht?) Habe es noch nicht erwähnt, aber ich 
möchte nur den internen SRAM von Speicherzelle 0x0100 bis 0x04FF prüfen 
(siehe Datenblatt). Benutzt die C-Runtime auch dort Speicherplatz?

Ich benutze ne RS232-Schnittstelle, in dem ein Flag gesetzt ist, wenn 
der uC und die angehörige Hardware okay ist. Und bei dieser Prüfung 
möchte ich eben auch nen RAM-Test machen, wie sinnig oder unsinnig das 
ist, sei jetzt mal offen gelassen...

Wie du schon siehst, bin ich kein Crack, der sich mit dem 
Speichermanagment eines uC voll auskennt, daher habe ich mich ja hier an 
das Forum gewendet...

von Peter D. (peda)


Lesenswert?

Die Mähr vom RAM-Test kommt noch aus den Zeiten, wo der RAM auf extra 
Chips saß oder sogar noch auf extra Platinen.
Da vielpolige Steckverbinder sehr unzuverlässig sind, hatte das durchaus 
seinen Sinn.
Die Tests liefen dann ausschließlich mit Variablen in den Registern der 
CPU.


Bei einem Micro ist so ein Test total unsinnig, da die ALU-Register, die 
IO-Register und der interne SRAM alle aus den gleichen Flipflops 
aufgebaut sind.
Man hat also für den Test keinerlei Satz an vertrauenswürdigen 
Registern.
Der RAM-Test wird also nicht in der Lage sein, eine Fehlermeldung zu 
generieren, er wird nur abstürzen.
Und ob der RAM-Test abstürzt oder die Applikation, macht das System 
keinen Jota sicherer.


Sinnvoller wäre es, die IO-Register zu testen. Sie sind zwar genauso 
aufgebaut, wie der SRAM, können aber über die Anschlüsse des MC leichter 
zerstört werden (EMV).


Peter

von spess53 (Gast)


Lesenswert?

Hi

>Befürchte ich auch nicht, ist aber einfach nur eine Routine-Kontrolle,
>um 1000000000% sicher zu gehen...

Optimist. Z.B. solltest du mit deinem 'Test' auch erkennen ob beim 
Schreiben eines Bits in einer Speicherstelle nicht auch ein Bit in einer 
anderen kippt. Dazu reicht das $55/$AA Schreiben und Lesen nicht ganz 
aus.

Als Programmierübung ist das alles vielleicht mal ganz nett. Praktisch 
aber ohne Nährwert.

>Sinnvoller wäre es, die IO-Register zu testen. Sie sind zwar genauso
>aufgebaut, wie der SRAM, können aber über die Anschlüsse des MC leichter
>zerstört werden (EMV).

Könnte aber ganz lustige Effekte in einer Schaltung haben.

MfG Spess

von Anja (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Bei einem Micro ist so ein Test total unsinnig, da die ALU-Register, die
> IO-Register und der interne SRAM alle aus den gleichen Flipflops
> aufgebaut sind.

Ist aber in vielen Sicherheitsnormen (IEC61508 / ISO26262) so 
vorgeschrieben (bzw. wird daraus abgeleitet).
Man will damit diejenigen (< 1ppm) Verdrahtungsfehler in den 
Metallmasken der Halbleiter herausfischen die beim Endtest beim 
Hersteller durchgerutscht sind, weil der Fehler vielleicht nur bei einer 
bestimmten Temperatur auftritt. Im Normalfall wird das System dann in 
einen sicheren Zustand gebracht. (z.B. Dauer-Reset).

> Man hat also für den Test keinerlei Satz an vertrauenswürdigen
> Registern.

Die muß man natürlich vor dem RAM-Test mit einem eigenen Test prüfen. 
Genauso wie sämtliche ALU-Funktionen.

Einen Teil der Routinen (für niedrige Sicherheitslevel) findet man bei 
Microchip (AN1229)
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en537355

Ab Level C braucht man in der Regel redundante Hardware.

Gruß Anja

von Peter D. (peda)


Lesenswert?

Anja schrieb:
> Ist aber in vielen Sicherheitsnormen (IEC61508 / ISO26262) so
> vorgeschrieben (bzw. wird daraus abgeleitet).

Ja, das ist das Problem.
Was vor 20 Jahren durchaus mal sinnvoll war, darf natürlich niemals mehr 
in Frage gestellt werden und muß bis in alle Ewigkeit so gemacht werden.


Peter

von Anja (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ja, das ist das Problem.
> Was vor 20 Jahren durchaus mal sinnvoll war, darf natürlich niemals mehr
> in Frage gestellt werden und muß bis in alle Ewigkeit so gemacht werden.

So lange gibts diese Normen noch gar nicht. Die ISO26262 wird gerade 
verabschiedet. Du hast Recht: für unkritische Bastelzwecke sind die 
Maßnahmen sicher nicht notwendig.

Von diskreter Bauweise mit mehreren Steckkarten (Fehlerrate ca 1/1000) 
zu integrierter Bauweise (Fehlerrate kleiner 1ppm) gibt es natürlich 
eine gewisse Verbesserung. Allerdings ist die Anzahl der 
sicherheitskritischen Steuerungen im gleichen Zeitraum ebenfalls 
signifikant gestiegen.

Wenn Du Millionen sicherheitskritischer Steuerungen im Feld hast (oder 
eine die tausende Leben gefärden kann) mußt Du natürlich den "Stand der 
Technik"  an Sicherheitsmaßnahmen (= Norm) einhalten.

Und glaube mir: bei Millionen Steuerungen gibt es schon mal die eine 
oder andere, bei der diese Tests berechtigt zuschlagen. Und in Folge 
fließen dann auch Verbesserungen im Herstellprozess oder zusätzliche 
Testschritte beim Chip-Hersteller ein.

Gruß Anja

von Peter D. (peda)


Lesenswert?

Anja schrieb:
> Und glaube mir: bei Millionen Steuerungen gibt es schon mal die eine
> oder andere, bei der diese Tests berechtigt zuschlagen.

Das Problem ist, daß oft irgendwelche Tests gemacht werden ohne Sinn und 
Verstand.
Bevor man einen Test einbaut, muß man erstmal feststellen, was er bring.
Es macht keinen Sinn etwas zu testen, was gegenüber anderen 
Ausfallquellen zu vernachlässigen ist.
Wenn der Test 999 andere Fehler nicht erkennt, ist er sinnlos. Da muß 
ich erst für die 999 anderen Fehler einen Test haben, ehe er das Gerät 
zuverlässiger macht.

Das ist vergleichbar, als wenn ich einen Programmteil optimiere, der nur 
0,1% CPU-Last bewirkt, völlig nutzlos.

Mit solchen Tests wird also nur eine Pseudosicherheit suggeriert. Und 
dann explodieren eben Ölplattformen usw., weil man sich in falscher 
Sicherheit wiegt.

Zu einem Test gehört immer zuerst eine Fehleranalyse.

Ein RAM-Test ist außerdem eine Wissenschaft für sich. Man müßte dazu 
erstmal die Internas des Chips vom Hersteller erfahren.
Wenn z.B. die Rückführung des FF gestört ist, kann er immer noch 
wunderbar kurz Ladung speichern, aber nach einem Tag umkippen. Niemand 
kann aber pro Bittest einen Tag warten.


Peter

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.