Forum: Mikrocontroller und Digitale Elektronik RAM Fehler provozieren


von user (Gast)


Lesenswert?

Hallo,

wir sind aktuell dabei eine neue Firmware auf einem ARM Controller zu 
entwickeln. Dieser Controller kann quasi 2 Fehler erkennen 
beziehungsweise einen Fehler korrigieren. (ECC benutzt Hamming 
Algorithmus).

Wie kann man zum Testen einen RAM Fehler provozieren?
Gibt es da eine Möglichkeit?

von PittyJ (Gast)


Lesenswert?

internes oder externes Ram?

von Bauform B. (bauformb)


Lesenswert?

user schrieb:
> Wie kann man zum Testen einen RAM Fehler provozieren?

Eigentlich sollte es fast immer einen Fehler geben, wenn man RAM liest, 
das seit Power On noch nie geschrieben wurde. Bei irgendeinem Controller 
stand mal dabei, dass man darauf achten soll - in dem Fall, um Fehler zu 
vermeiden.

von Cartman (Gast)


Lesenswert?

> immer einen Fehler geben, wenn man RAM liest,
> das seit Power On noch nie geschrieben wurde

Grober Unsinn.

Bei externem RAM einfach einen kraeftigen Bustreiber nehmen
und mit einem Pulsgenerator (z.B. HP 8002A) mit einem kurzen
Puls ansteuern. Den Bustreiber an die Datenleitungen haengen.

von A. B. (Gast)


Lesenswert?

Cartman schrieb:
>> immer einen Fehler geben, wenn man RAM liest,
>> das seit Power On noch nie geschrieben wurde
>
> Grober Unsinn.

Hm, aus dem RM0444, STM32G0x1, Sec. 2.3 Embedded SRAM:

"Note: When enabling the SRAM parity check, it is advised to initialize 
by software the whole SRAM at the beginning of the code, to avoid 
getting parity errors when reading non initialized locations."

von Deppenplätter (Gast)


Lesenswert?

user schrieb:
> Wie kann man zum Testen einen RAM Fehler provozieren?

cache aschalten,Stomversorgung absenken, clock jittern lassen, mit 
kosmischer strahlung beschiessen.

Mal vom Rawhammer szenario inspirieren lassen: 
https://www.heise.de/news/Blacksmith-RAM-Sicherheitsluecke-Rowhammer-ist-schlimmer-als-angenommen-6268583.html

von Jim M. (turboj)


Lesenswert?

Rowhammer funktioniert nur bei DRAM aber nicht bei SRAM.

von PittyJ (Gast)


Lesenswert?

Jim M. schrieb:
> Rowhammer funktioniert nur bei DRAM aber nicht bei SRAM.

Ja, wenn der TE mal Infos gegeben hätte, dann müßte man nicht raten.
Was für Ram, was für Controller.

Wieso glauben die Leute immer, dass ich das gleiche Board auch vor mir 
auf dem Tisch habe.

So, mal Mittagessen machen. Was meint ihr, sollte ich lieber dünsten 
oder braten? Und wieviel Salz muss daran?

von Darth Moan (Gast)


Lesenswert?

user schrieb:
> beziehungsweise einen Fehler korrigieren. (ECC benutzt Hamming
> Algorithmus).
>
> Wie kann man zum Testen einen RAM Fehler provozieren?
> Gibt es da eine Möglichkeit?

Das kann dir nur Das RefMan oder DataSheet deines Controllers sagen.
Alle ECC protected SRAMs in den Controllern die ich bisher am Wickel 
hatte,
hatten nach dem PowerUp keine definierten Zustände für die EEC bits im 
RAM.
Ein Lesezugriff lieferte dann meistens einen Fehler. Wenn der Controller 
sich aber für Saftey enpfehlen möchte, sollte sowas in der Art in 
irgendeinem
Mem oder Bus Controll register zu finden sein:

"Generate Error in ECC for Data Protection
The data paths between the SRAM and the LMU bus interface are
protected by ECC logic. This bit is used to inject an error into the 
next
write access so that the SMU alarm can be tested. Reading this bit 
always
returns 0B. Writing works as follows:
0B No Effect
1B Inject error into next LMU RAM Write Access."

Wenn es sowas nicht gibt, bleibt nur der Power On Fall, der einfach 
undefiniert sein dürfte. Kann dir aber nur die Doku des Herstellers 
sagen, ob das wirklich so ist.

von M. Н. (Gast)


Lesenswert?

Bauform B. schrieb:
> Eigentlich sollte es fast immer einen Fehler geben, wenn man RAM liest,
> das seit Power On noch nie geschrieben wurde.

das ist in den meisten Fällen korrekt.
Selbst für RAM, dass in einem definierten Zustand hochfährt (bspw 
komplett 0) wird in der Regel ein ECC Fehler detektiert, da das ECC 
Codewort für den Wert
0 in der Regel != 0 ist.

Genua für solche Zwecke gibt es "modifizierte" Hamming codes, mit denen 
genau das erreicht werden kann, dass "unberührter" Speicher valide ist.

user schrieb:
> Wie kann man zum Testen einen RAM Fehler provozieren?
> Gibt es da eine Möglichkeit?

Kannst du die ECC-Korrektur+Generierung abschalten was reinschreiben und 
dann wieder aktivieren? Dann sollte er eigentlich anschlagen beim 
auslesen.
Eventuell schreibt er aber immer ECC codewörter und es lässt sich nur 
die Detektion/Korrektur unterdrücken.

Wenn es sich um internes RAM handelt wird es dann schon schwieriger. 
Zuverlässig fällt mir da nicht wirklich was alternatives ein. Der 
Hersteller wird das bspw. durch seinen MBIST (Memory built-in self test) 
und die Scan Ketten durchaus machen können. Da hat man aber als Kunde 
keinen Zugriff drauf. Ebenso kann man als Kunde nicht an den 
Sense-Verstärkern der RAM-Zellen spielen. Damit lassen sich auch 
bit-Kipper provozieren.

Bei externem RAM kann man an einem Board einfach mal mit der Prüfspitze 
was nach Masse kurzschließen oder so. das ist zwar auch nicht so geil, 
funtioniert aber. Alternativ im Lesebetrieb ne Leiterbahn kappen. Dann 
kann man aber auch nicht mehr schreiben. Also ansich nicht so gut im 
laufenden Betrieb.

Oder tatsächlich radioaktiv: Sucht euch jemanden mit Röntgengerät 
(vorzugsweise zur Baugruppenuntersuchung, wegen der besseren 
Fokusierung) und ballert einfach im Betrieb ins RAM. Wenn der RAM intern 
ist, ist es aber eventuell schwierig, da man wahrscheinlicher 
irgendwelche internen Signale umbringt anstelle der SRAM Zellen. SRAM 
Zellen sind "leider" relativ robust.

von Εrnst B. (ernst)


Lesenswert?

M. H. schrieb:
> Genua für solche Zwecke gibt es "modifizierte" Hamming codes, mit denen
> genau das erreicht werden kann, dass "unberührter" Speicher valide ist.

Aber will man das? Ein Lesezugriff auf eine zuvor nie geschriebene 
Speicherstelle ist m.M.n ein Fehler. Ist doch gut, wenn das nicht nur 
vom Compiler/Lint angemeckert wird, sondern zusätzlich auch die 
µC-Hardware ein Auge darauf hat.

von user (Gast)


Lesenswert?

Es handelt sicxh hierbei um einen Controller von der Firma Silabs.

von Dergute W. (derguteweka)


Lesenswert?

user schrieb:
> Es handelt sicxh hierbei um einen Controller von der Firma Silabs.

Axo, den.

scnr,
WK

von Wühlhase (Gast)


Lesenswert?

Könnt ihr den Softwarekram nicht in eine virtuelle Umgebung setzen? Also 
z.B. Schreib-Leseoperationen logisch von Verifikationsoperationen zu 
trennen.

Dann könntet ihr Schreib-Leseoperationen auf der Hardware testen, und 
das Verifikationsgeraffel testet ihr in einer komplett anderen Umgebung, 
wo ihr dem Prüflingcode vor die Füße werft was euch beliebt. Quasi 
beides in verschiedene Klassen aufteilt und dafür Unittests durchführt.

Das ist zwar noch nicht so gut wie die Transistoren auf eurem IC direkt 
extern ansteuern zu können, aber besser als nichts und grundsätzlich 
auch nicht schlecht.

von Darth Moan (Gast)


Lesenswert?

Εrnst B. schrieb:
> M. H. schrieb:
>> Genua für solche Zwecke gibt es "modifizierte" Hamming codes, mit denen
>> genau das erreicht werden kann, dass "unberührter" Speicher valide ist.
>
> Aber will man das? Ein Lesezugriff auf eine zuvor nie geschriebene
> Speicherstelle ist m.M.n ein Fehler. Ist doch gut, wenn das nicht nur
> vom Compiler/Lint angemeckert wird, sondern zusätzlich auch die
> µC-Hardware ein Auge darauf hat.

Das kommt doch auf die Anwendung an. Viel Speicher, der erst beschrieben 
werden muss, kann den Startup deutlich verlängern. Oft spielt das ja 
keine Rolex, aber wenn doch, ...

Außerdem muss der Speicher beim ersten Schreiben in der ECC-Zellgröße 
beschrieben werden. Bei mir bisher 32 bit. Aber alle haben bisher auch 
byteweises Schreiben erlaubt, was der MemContoller dann in einen RMW 
Zugriff umsetzt. Daher würde ein byteweise Erstbeschreiben ebenfalls zum 
Fehler führen.

Die Silabs Dinger kenne ich nicht, kann zu denen also nix sagen.

von A. B. (Gast)


Lesenswert?

Darth Moan schrieb:
> Das kommt doch auf die Anwendung an. Viel Speicher, der erst beschrieben
> werden muss, kann den Startup deutlich verlängern. Oft spielt das ja

Wozu denn? Es macht keinen Sinn, Speicher auszulesen, der nicht vorher 
mit sinnvollen Werten gefüllt wurde. Initialisiert man das gesamte RAM 
"pauschal", um die ECC-Logik ruhig zu stellen, verdeckt man nur 
Software-Fehler. Den gesamten RAM-Bereich z. B. zu Nullen, ist nur 
kontraproduktiv.

Und Bereiche, die von der Programmlogik her initialisiert werden müssen, 
müssen so oder so halt initialisiert werden - ECC hin oder her. Es gibt 
also sinnvollerweise keinerlei Entscheidungsspielraum.

von Darth Moan (Gast)


Lesenswert?

A. B. schrieb:
> Und Bereiche, die von der Programmlogik her initialisiert werden müssen,
> müssen so oder so halt initialisiert werden - ECC hin oder her. Es gibt
> also sinnvollerweise keinerlei Entscheidungsspielraum.

Du würdest also hingehen und auf den Systemen keine Variablen kleiner 32 
bit erlauben? Das wäre eine Starke Einschränkung des zB C Standards.

Eine uint8_t Variable würde vom Programm ggf. mit einem byteweisen 
Schreibzugriff initialisiert werden. Wenn du aber Vorher nicht 
sichergestellt hast, das die 32bit Zelle des ECC geschützten RAM mit 
eben einem 32 bitigen Schreibzugriff initialisiert wurde, bekommst du 
dabei einen ECC Fehler. Also ggf. landest du in einem TRAP.

Und welchen SW Fehler hast du nun detektiert?

Der Trap wird ausgelöst bevor das eigentliche Schreiben stattfindet. Du 
hast die Speicherstelle also noch immer nicht initialisiert.
Also was machst du dann im TRAP Handler?

Ausserdem gibt es durchaus auch sowas wie Reset-feste Datenstrukturen.
Wenn man zB im Programm in einen fatalen Fehler läuft (zB TRAPS und der 
Gleichen mehr) kann man durchaus in einem beliebig festgelegten 
Speicherbereich nützliche Informationen zur Fehlerursache ablegen, um 
diese dann nach einem Reset auszuwerten. Unmittelbar nach dem Reset 
weiss man aber zunächst nicht, ob man aus dem Power Down oder einem 
Hard-Reset kommt. Manche HW kann das unterscheiden andere kann es nicht.
Steht dann die festgelegte Magic Number drin, ist das ein Indiz dafür,
das vor dem Reset dort Daten abgelegt wurden. Die man dann auslesen 
könnte.
Sollte aber das Schreiben dieser Daten gar nicht vollständig erfolgt 
sein, weil irgendwas dazwischen kam, bekommt man wohl ggf einen ECC 
Fehler beim Leseversuch. Diesen muss man dann eben abbrechen mit der 
Erkenntnis, das dort keine Daten oder nur unvollständige Daten liegen 
und entsprechend reagieren.
Das kann aber niemand pauschal ohne Kenntnis über die Anwednung und 
deren Anforderungen einfach so festlegen.

Daher schrieb ich, das kommt auf die Anwendung an. Wenn es nicht 
gefordert ist, würde ich nicht auf die Idee kommen einen zyklischen Test 
der ECC HW oder Reset-festen Datenstrukturen zu implementieren. Wozu 
auch? Naja OK, so aus Neugier kann man das schon in einem Bastelprojekt 
einfach so aus Daffke mal rudimentär umsetzten.

von Purzel H. (hacky)


Lesenswert?

Fehler produzieren... ist das nicht offensichtlich ?

- undervoltage
- overclocking
- overtemp
- emv

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.