Hallo zusammen, ich bin noch recht neu im Bereich Microcontroller und deren Programmierung. Ich habe mir ein STM32VL Discovery Board zugelegt, welches ich mit der CoCoox IDE programmiere. Mein eigentliches Ziel ist es nun, die Start-Up Werte des RAM bzw. Flash-Speichers auszulesen. Was meine ich mit Start-Up Werte? Die Speicherinhalte, kurz nach dem Einschalten des Gerätes, möglichst, bevor andere Programmteile mit dem Speicher interagieren. Ist es überhaupt möglich zu einem so frühen Zeitpunkt auf den Speicher zu zugreifen? Kann man leichter auf den RAM oder den Flash zugreifen? Könnt ihr mir erste Anhaltspunkte geben, wie man so etwas bewerkstelligen würde? Bin recht orientierungslos und würde einfach wild los googlen. Aber vllt. hatte ja schon mal jemand ein ähnliches Vorhaben. Danke!
Der Speicherinhalt eines Flash ist nach dem Einschalten der gleiche wie nach dem letzten Programmieren des Flash. Der Inhalt des RAMs ist nach dem Einschalten undefiniert. Schreib doch mal, was Du wirklich vorhast und warum Du als Anfänger solche Probleme lösen willst. Peter
Ich möchte mir die Eigenschaften dieser undefinierten Inhalte mal anschauen und analysieren. Daher werde ich mich wohl auf den RAM konzentrieren. Gibt es dahingehend schon Erfahrungen mit dem Auslesen zu einem möglichst frühen Zeitpunkt?
Der Zeitpunkt ist völlig schnuppe. Dein Compiler fügt vor Deinen Programmcode immer noch eine Startup-Routine ein, die u.A. sämtliche Variablen und den Stack initialisiert. Diese Routine musst Du ersetzen oder erweitern, was für einen Anfänger aber schon eine ordentliche Herausforderung sein dürfte. Peter
An S. schrieb: > Ich möchte mir die Eigenschaften dieser undefinierten Inhalte mal > anschauen und analysieren. Wozu soll das gut sein? Wenn der RAM-Inhalt laut Datenblatt undefiniert ist, darfst Du keine anderen Schlüsse ziehen, als daß Du davon ausgehen mußt, daß es undefiniert ist. Selbst wenn Du in Deinem Sample zufällig bestimmte Muster vorfindest, darfst Du nicht davon ausgehen, daß es in einem anderen Sample genauso ist.
Ich möchte einfach aus Interesse heraus schauen, ob es irgendwelche Korrelationen zwischen verschiedenen Samples des uninitialisierten Speichers gibt mehr nicht :). Aber das st ja primär auch nicht die Frage, sondern eher, wie das umzusetzen wäre.
Also müsste ich mich erst einmal mit der Start-Up-Routine des Programmcodes auseinandersetzen. Kann man dann auf alle Bereiche des RAMs zugreifen oder wird einem nur ein virtueller Bereich zugewießen?
An S. schrieb: > Kann man dann auf alle Bereiche des > RAMs zugreifen oder wird einem nur ein virtueller Bereich zugewießen? Hat der verwendete Controller eine MMU? Was ist "zugewießen"?
-Serial wire debug (SWD) and JTAG interfaces Hast du Zugriff über eines der beiden? Wenn ja, kein Problem. Du schreibst ein Miniatur"programm" in Assembler: reset: jmp reset //Pseudocode, wie das exakt beim STM32 aussieht, weiss ich nicht Damit ist der Prozessor lange Zeit beschäftigt und verändert nichts am RAM. Den kannst du nun per JTAG auf deinen Bildschirm holen, dich daran erfreuen und Statistik betreiben. Sinnfrei ist es auf jeden Fall, aber das ist vieles, was wir so tun :-)
Hi Also bei einem AVR habe ich das mal gemacht. Die Inhalte sind zwar zufällig, aber bis auf einige Bitkipper bei jedem Einschalten identisch. MfG Spess
@spess53: Genau an dieser Eigenschaft bin ich interessiert. U.a. interessiert mich das Verhältnis zwischen den stabilen und instabilen Bits. @Joachim: Auf dem STM32 VL Discovery ist ein STLink verbaut, soweit ich weiß. Dieser unterstützt lediglich SWD. Ich habe noch eine Menge zu lesen, mein Wissen über Microcontoller-Programmierung ist noch sehr begrenzt. Also sollte ich das ganze Projekt lieber in ASM umsetzen, als in C? Danke für die Hilfe soweit!
An S. schrieb: > Genau an dieser Eigenschaft bin ich interessiert. U.a. > interessiert mich das Verhältnis zwischen den stabilen und instabilen > Bits. Und was möchtest Du mit dieser Information anfangen? Möchtest Du herausfinden, wie lange so ein im µC verbautes SRAM seinen Inhalt ohne Stromversorgung behält?
Was genau dabei rumkommt steht noch nicht ganz fest. Es hängt etwas von meiner Kreativität und der gefunden Resultate ab aber das genannte Beispiel eines TRNG wäre zum Beispiel denkbar.
> und der gefunden Resultate ab aber das genannte > Beispiel eines TRNG wäre zum Beispiel denkbar. Nicht wirklich. Mit den Bitinformationen eines uninitialisierten RAM kann man im allgemeinen nichts anfangen. Es ist nicht gleichbleibend genug um da irgendwelche Annahmen treffen zu können. Auf der anderen Seite ist es aber auch nicht zufällig genug um als Lieferrant für Zufallszahlen benutzbar zu sein. Du hast nichts davon, wenn der TRNG 2-tausend mal mit immer dem gleichen Seed startet und nur einmal mit einem anderen. Es ist wie das Wetter in Italien im Sommer. In den meisten Fällen ist es sonnig, bis auf ein paar Regentage die einem passieren können. Es ist sonnig genug, dass man sich im Winter schon mal einen Sommerurlaub bucht, weil die Chance auf Sonne sehr hoch ist. Und wenn man Pech hat, erwischt man genau die paar Regentage. D.h. man hat zwar keine 100% Garantie auf Sonne, es ist aber auch nicht so, dass man völlig zufällig dem Wetter ausgeliefert ist.
Hi Karl. Woher weißt du das? Hast du mal die Entropie von den zufälligen Bits gemessen bzw. diese der NIST Test-Suite durchlaufen lassen?
An S. schrieb: > Hi Karl. Woher weißt du das? Weil auch ich mir schon mal RAM angesehen habe, was da nach dem Einschalten so drinnen steht. :-) Du brauchst dir doch nicht das komplette RAM ansehen. Nimm irgendeinen unbenutzten Bereich raus und jag da dein Programm drüber. Der Rest des RAMs sieht auch nicht anders aus als dieser eine, hinreichend große Bereich. unsigned char* pPtr = malloc( 1000 ); und du hast 1000 Bytes aus dem uninitialisierten Bereich.
Un du konntest nicht genügend Entropie feststellen? Vermutlich hast du Recht, dass ein kleiner Teil genügt, aber dann hätte man die zusätzliche annahme, dass die (Nicht-)Entropie der Speicherzellen über den Speicher gleich verteilt ist. Vllt. gibt es da minimale Abweichungen. Mir ist vorhin auch die Idee gekommen anstelle von ASM jmp reset Doch einfach mittels malloc den Speicher zu allozieren und dann auszugeben. Wollte aber tatsächlich den gesamten Speicher ausgeben lassen und nicht nur einen Teil.
An S. schrieb: > Wollte aber tatsächlich den gesamten Speicher ausgeben > lassen und nicht nur einen Teil. Dann nimm halt nicht malloc, sondern setze Deinen Pointer auf die Anfangsadresse (die ist ja physikalisch vorgegeben) und gib so viel Bytes aus, wie der Controller an RAM hat.
An S. schrieb: > Un du konntest nicht genügend Entropie feststellen? Um ehrlich zu sein, hat mich das nicht wirklich interessiert. Mich hat nur interessiert, ob im Monitor (das Programm, nicht das Sichtgerät) im Dump Kommando nach einem Fill Kommando, tatsächlich alle Speicherstellen korrekt auf den Wert gegangen sind oder nicht. Ob die Adressdekodierung korrekt arbeitet oder nicht. Und natürlich bleibt es da auch nicht aus, dass man einfach mal den 'jungfräulichen' Speicher dumpt. Das ist zwar schon viele Jahre her, ich kann mir allerdings nicht vorstellen, dass die RAM Hersteller in der Zwischenzeit da jetzt besonderen Ehrgeiz darauf gelegt haben, einen definierten Grundzustand im RAM nach dem einschalten herzustellen. RAM war schon immer von der Sorte: du kannst dich auf nix verlassen, und die Programmierer leben seit 50 Jahren damit. Mal hatte der kleine Kondensator im dynamischen RAM noch ein bischen Ladung, mal hatte er es nicht. Mal schaltete der eine Transistor im Flip Flop ein bischen schneller als der andere, mal tat er es nicht.
An S. schrieb: > Könnt ihr mir erste Anhaltspunkte geben, wie man so etwas > bewerkstelligen würde? Bin recht orientierungslos und würde einfach wild > los googlen. Aber vllt. hatte ja schon mal jemand ein ähnliches > Vorhaben. Den STM32F4 kenne ich noch nicht. Meistens läßt sich aber bei Compilern die Initialisierung von Variablen auch ganz abschalten. Im RAM stehen nach Einschaltung alle möglichen Werte zwischen 0x00 und 0xFF wild durcheinander verteilt drinne. Es spielt gewöhnlich gar keine Rolle, weil man ja seine verwendeten Variablen am Anfang zu initialisieren hat. Man kann ein kleines Progrämmchen schreiben, was den µC stoppt, und einen Hex-Dump über RS232 an den PC sendet. Wenn der Speicher zu groß und das Terminalfenster zu klein ist, kann man auch in eine Datei aufzeichnen. So habe ich es hier bei den alten 8051-ern, zu Debugzwecken.
Hi Wilhelm, das STM32VL Discovery hat einen STM32F100RB (http://www.st.com/internet/evalboard/product/250863.jsp) und besitzt leider kein RS-232. Die Daten müssten alle über den ST-Link per USB / SWD geschickt werden.
An S. schrieb: > Hi Wilhelm, das STM32VL Discovery hat einen STM32F100RB > (http://www.st.com/internet/evalboard/product/250863.jsp) und besitzt > leider kein RS-232. Und ich glaubte, an so einem Teil wäre wenigstens ein UART an zwei Pins rausgeführt. Wenn das so wäre, könntest du dir wenigstens mal schnell mit einem einfachen Transistorinverter und TTL-Spannung eine Tx-Leitung zum PC legen, wobei man am PC dann z.B. TeraTerm als Terminal installiert hat. > Die Daten müssten alle über den ST-Link per USB / > SWD geschickt werden. In dieses Thema bin ich leider auch noch nicht involviert. Hat die IDE nicht ein Fenster, in dem man sich auch mal einen Speicherbereich ansehen kann?
Gerade flatterte das hier in mein Postfach: Der Benutzer 'an_s' hat Ihnen die folgende Nachricht geschickt: ==================================== Hallo rufus, du hattest mir in diesem Thread (Beitrag "Re: RAM /Flash Speicher auslesen?") einen Hinweis gegeben, wie ich die Startup-Werte von RAM auslesen kann. Ich probiere das nun schon seit Tagen, aber habe zu wenige Kenntnisse in der µcontroller Programmierung. Würde mich auch noch gerne weiter einlesen, aber habe leider Zeitdruck. Kannst du mich evtl. mit einem Algorithmus versorgen? Habe alleine schon Probleme bei der Ausgabe von Werten am PC / in der Konsole der IDE. ==================================== Ich poste das hier, weil solche Fragen besser der Allgemeinheit gestellt werden. Und wenn Du "das seit Tagen" probierst, vermag ich nicht nachzuvollziehen, was an > setze Deinen Pointer auf die Anfangsadresse (die ist ja > physikalisch vorgegeben) und gib so viel Bytes aus, wie > der Controller an RAM hat. jetzt so großartig kompliziert ist. Das ist der "Algorithmus". Zeig mal den Code, mit dem Du das "seit Tagen" probiert hast.
Ich frag mich ja immer noch, wozu das Ganze überhaupt gut sein soll. Praktischen nutzen sehe ich eher wenig da drinn.
Meine Absichten hatte ich ja bereits schon im Thread angesprochen. Ich kann dir meinen Code zeigen, wenn ich wieder Zugriff auf meinen privaten Rechner habe. Danke für die...Hinweise.
Er kann vielleicht nach einem PowerOn einige zufällig gefüllte Speicherzellen finden, aber nach einem RESET steht das gleiche Zeugs drin. Ich glaube, es gibt effizientere Methoden, einen "echten" Zufallsgenerator zu bauen, z.B. die Aufnahme von "weißem Rauschen".
Nun soweit ich weiß, sind RAM Zellen durch doppelt-überkreuzte Inverter aufgebaut. D.h. direkt nach dem Start sind sie in einem instabilen Zustand und werden entweder in Richtung 0 oder 1 kippen. Dabei werden manche Zellen bei sehr vielen Starts, den selben Wert annehmen (0 oder 1) und manche werden ihren Wert abhängig von Umgebungsbedingungen annehmen (welche dann die (pseudo-)zufälligen Werte darstellen). Bezüglich der Anwendung ist es noch gar nicht sicher, ob es ein RNG werden soll (obwohl der aufbauend auf diesem Prinzip schon existiert). Die Diskussion verlagert sich momentan stark in Richtung "was macht das für einen Sinn / was kann man damit machen". Ich weiß es noch nicht, bevor, ich nicht die Werte ausgelesen habe. Im Notfall mache ich das halt nur aus Spaß und Interesse :) Daher muss ich erst einmal einen Weg finden, an die Werte zu kommen.
An S. schrieb: > Nun soweit ich weiß, sind RAM Zellen durch doppelt-überkreuzte Inverter > aufgebaut. Du musst noch viel lernen. Diese 'Inverter' sind enweder NAND oder NOR und die ganze Schaltung nennt sich 'Flip-Flop' und ist die klassische Methode wie man 1-Bit speichern kann. Zumindest solange wir über 'statisches RAM' sprechen. Bei dynamischem RAM übernimmt ein kleiner Kondensator die Rolle des Speichergliedes. > D.h. direkt nach dem Start sind sie in einem instabilen > Zustand und werden entweder in Richtung 0 oder 1 kippen. Dabei werden > manche Zellen bei sehr vielen Starts, den selben Wert annehmen (0 oder > 1) und manche werden ihren Wert abhängig von Umgebungsbedingungen > annehmen Nicht wirklich. Im wesentlichen ist es so, dass durch Fertungstoleranzen einer der Transistoren im Flip-Flop ein wenig schneller schaltet, bei einer etwas geringeren Spannung schaltet und damit dem Flip-Flop einen in weiten Bereichen immer gleichen Anfangszustand aufzwingt. Dein 'theoretisch zufällig' ist in Wirklichkeit ein 'welcher Transistor ist im Fertigungsprozess ein bischen von den Spec abgewichen' > (welche dann die (pseudo-)zufälligen Werte darstellen). :-) Recht viel Zufall ist da nicht drinnen. Du setzt aufs falsche Pferd. > Die Diskussion verlagert sich momentan stark in Richtung "was macht das > für einen Sinn / was kann man damit machen". Ich weiß es noch nicht, > bevor, ich nicht die Werte ausgelesen habe. Im Notfall mache ich das > halt nur aus Spaß und Interesse :) Dann machs. Aber machs. > Daher muss ich erst einmal einen Weg finden, an die Werte zu kommen. Ganz ehrlich: Wenn einen Pointer derferenzieren und den Wert irgendwo ausgeben dich vor unüberwindliche Probleme stellt, dann solltest du deine Zeit lieber mit anderen Dingen verbringen, als mit einer sinnlosen Messung, die ausser für RAM-Hersteller keinen oder kaum einen praktischen Wert hat.
Karl Heinz Buchegger schrieb: > An S. schrieb: >> Nun soweit ich weiß, sind RAM Zellen durch doppelt-überkreuzte Inverter >> aufgebaut. > > Du musst noch viel lernen. Kann sein, ich bin kein Elektrotechniker, meine Kompetenzen liegen woanders. Ist aber auch nicht von Bedeutung. e dann die (pseudo-)zufälligen Werte darstellen). > :-) > Recht viel Zufall ist da nicht drinnen. > Du setzt aufs falsche Pferd. Kommt drauf an was ich erreichen will, oder? :) Einige der Zufallszahlen, die aus FPGAs extrahiert wurden, haben immerhin einige NIST-Tests bestanden. Scheint doch nicht soo wenig Entropie drin zu sein ;) > Ganz ehrlich: > Wenn einen Pointer derferenzieren und den Wert irgendwo ausgeben dich > vor unüberwindliche Probleme stellt, dann solltest du deine Zeit lieber > mit anderen Dingen verbringen, als mit einer sinnlosen Messung, die > ausser für RAM-Hersteller keinen oder kaum einen praktischen Wert hat. Sinnlose Messungen? Nur für RAM-Hersteller? Es gibt auch noch die Wissenschaft :) Leider scheinen viele der letzten Kommentare sehr affektiert zu sein und vom Ton her etwas aufgeladen. Hatte mir mehr versprochen. Trotzdem danke
Offenbar weiß hier nur "An S." die geheime Wahrheit über RAMs: Uninitialisierte RAMs beinhalten hochkonspirative Verschwörungsdaten der CIA! Mit etwas KnowHow kann damit in die Zukunft sehen und dort Elvis treffen.
Hehe genau solche Beiträge meine ich. Schade, fand das Forum bisher echt toll!
> Hatte mir mehr versprochen.
Wir sind hier Softwerker. Und als solche sind wir in erster Linie daran
interessiert eben nicht von Fertigungstoleranzen abzuhängen. Einen nicht
initialisierten Speicher auszulesen, ist ein Software-Fehler. Und zwar
ein schwerer Fehler.
Aber, mach deine Messungen. Ist doch ok.
Das dauert sowieso schon viel zu lange vom 12. Oktober bis heute, wenn
man bedenkt, dass der zentrale 'Kern' einer ersten Messung ein
C-Dreizeiler ist.
Karl, hatte mir nicht mehr versprochen von der Hilfe, die anfangs echt gut war, sondern von der Art und dem Ton ;) Wurde zuletzt doch sehr sarkastisch und ironisch. Wenn es schon zu lang dauert, kann man den Thread ja auch einfach schließen.
Was ist denn Dein Problem? Du willst das RAM auslesen - schließ den Debugger an und lies es aus. Du wurdest mehrfach darauf hingewiesen, daß der Informationsgehalt fragwürdig ist, aber wenn's Dich interessiert, dann schließ doch einfach den Debugger an und ließ es aus. Was ist denn Dein Problem?
Bronco schrieb: > Was ist denn Dein Problem? Das hier <zitat> Habe alleine schon Probleme bei der Ausgabe von Werten am PC / in der Konsole der IDE. </zitat>
Also in erster Linie dein letzter Beitrag, Bronco! Das weißt du aber sicher selbst, oder? Ansonsten habe ich nicht wirklich Probleme, sondern eher Herausforderungen. Z.B. wie ich die ausgelesenen Daten an den PC senden kann. Ich muss mich wohl diesbezüglich noch mit dem Thema USART beschäftigen. Ich habe bereits den Tipp bekommen: "Wenn das so wäre, könntest du dir wenigstens mal schnell mit einem einfachen Transistorinverter und TTL-Spannung eine Tx-Leitung zum PC legen" Allerdings kenne ich mit den meisten Begriffen noch nicht aus.
An S. schrieb: > Z.B. wie ich die ausgelesenen Daten an den PC senden > kann. Z.B. mit einem Debugger. Hast Du einen Debugger?
Kauf dir das, mit deinen zwei linken Händen lohnt ein Selbstbau nicht. ebay 140850007973
@Michael Ob ich zwei linke Hände habe ist mal noch meine Sache, nicht? ;) Trotzdem Danke. @Bronco, ich habe hier ein STM32VL Discovery Board, auf dem ein STLink Debugger sitzt (http://www.st.com/internet/evalboard/product/250863.jsp)
Toll! Dann kannst Du doch problemlos in http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/RELEASE_NOTE/DM00034783.pdf nachlesen, wie man damit den Speicher ausliest. Was ist denn Dein Problem (also technisch gesehen)?
Ich finde in dem Dokument jedoch lediglich die Release-Notes und einen Versions-Log.
Bis du soweit bist mit dem auslesen, kannst du dich an dem 2 u. 8KB C-MOS Raminhalten ergötzen. Sind .bin-Dateien. An S. schrieb: > @Michael Ob ich zwei linke Hände habe ist mal noch meine Sache, nicht? > ;) Trotzdem Danke. Wenn du das nicht hättest, wäre doch in einem halben Monat das Ding schon lange fertig. Mit RS232 geht auch das: http://www.pollin.de/shop/dt/MzY5OTgxOTk-/Bausaetze_Module/Bausaetze/RS232_TTL_Wandler_Bausatz.html
Danke Michael, ich schau mir mal die Hardware an. Danke auch für die RAM
Daten, auch wenn ich hier schon Megabyte-weise RAM-Inhalte rumliegen
habe.
> Wenn du das nicht hättest, wäre doch in einem halben Monat das Ding
schon lange fertig.
Das hat wohl weniger was mit Geschickt als mit Wissen zu tun ;) Außerdem
ist das nicht die einzige Baustelle, sonst könnte ich weitaus mehr Zeit
investieren.
An S. schrieb: > Ich finde in dem Dokument jedoch lediglich die Release-Notes und einen > Versions-Log. http://www.st.com/internet/evalboard/product/219866.jsp http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/CD00262073.pdf http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/CD00221563.pdf
An S. schrieb: > Mein eigentliches Ziel ist es nun, die Start-Up Werte des RAM bzw. > Flash-Speichers auszulesen. Was meine ich mit Start-Up Werte? Die > Speicherinhalte, kurz nach dem Einschalten des Gerätes, möglichst, bevor > andere Programmteile mit dem Speicher interagieren. Was meinst du wohl, was ein werksneuer bzw. gelöschter Flash für einen Inhalt hat? Etwas mehr vorbereitendes Denken kann man doch erwarten! Brauchst dich nicht wundern, wenn du giftige Antworten kriegst! Oft ist es der "Nichtstun"- Befehl.
Jetzt haben sich soviele Leute Zeit genommen, dir ausführlich zu erklären, warum es keinen Sinn macht, undefinierten Speicher auszulesen! Und sie haben dir auch noch erklärt, wie es gehen würde. Und Anleitungen für deinen Debugger rausgesucht! Und was machst du? Beschwerst dich über den Ton? Das hat doch echt keinen Sinn! Ich les jetzt mein RAM aus und treff mich mit Elvis...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.