Ok, die Hintergrundgeschichte ist dies. Ich landete ein Online-Code-Interview mit einem Unternehmen, das namenlos bleiben soll.
Ich weiß, dass ich für einen Job dort noch nicht bereit bin, aber im Grunde hat mir ein Insider die Chance gegeben. Wie auch immer, unten ist ein Bild der Frage.
Ich habe Erfahrung in der Registerprogrammierung und im Umgang mit Mikrocontrollern, aber das alles mache ich alleine, also habe ich sozusagen noch nie "echten Industrie-Standardcode" gesehen. Ich habe mich definitiv noch nie mit einem "Memory Dump" von einem Mikrocontroller befasst, weil ich noch nie einen solchen Fehler hatte oder sogar wusste, dass er das tun könnte ...
Meine Frage ist zweifach ... zuerst sind die Fragen im Bild ... ob jemand sie beantworten kann ... und meine andere Frage ist ... wenn ein Mikrocontroller ausfällt oder etwas schief geht und er nicht mehr funktioniert, wie macht es einen Speicherauszug? scheint mir, dass es erfordern würde, dass es in Ordnung ist, um so etwas auszuführen. Andernfalls erhalten Sie nur den Speicherauszug, wie die Dinge "vor" dem Absturz aussahen.
Der betreffende Speicherauszug wurde beim Absturz nicht erstellt. Es wurde zum Debuggen genommen. Für einen Softwarefehler (Ausnahme), der zur Laufzeit vom Programm oder Debugger erkannt wird, wird ein Speicherabbild 'beim Absturz' erstellt.
Die Frage ist einfach. Der 'Dump' enthält einen Speicher, der von einer Instanz der Struktur packet_S belegt ist. Sie müssen nur die Bytes in Datentypen von Mitgliedsvariablen interpretieren. Und die Struktur ist sehr einfach. Es dauert 1 + 2 * 2 + 4 Bytes.
Der Inhalt der Struktur beginnt bei 0x1010, count
ist also 0x6F. Dies wird durch 'Endianes' nicht beeinflusst. Die Ints und die Longs werden von der Bytereihenfolge beeinflusst, also müssen Sie sie für A und B interpretieren.
Das ist eine kleine Fangfrage. Ohne Strukturpaketierung wird jedes Element an einer 4-Byte-Grenze ausgerichtet. Das bedeutet, dass es ziemlich viele Füllbytes in der Struktur gibt. Auch wenn diese nicht Null sind, ist ihr Wert irrelevant. Beachten Sie auch, dass der Compiler die Elemente in der Struktur nicht neu anordnen kann. Diese Information bedeutet, dass das Speicherlayout der Struktur gut definiert ist.
Little Endian bedeutet, dass die niedrigste Adresse das niedrigstwertige Byte ist. Wir können also die Strukturwerte wie folgt berechnen:
count = 0x6f
data[0] = 0x9994
data[1] = 0xb2ca
timestamp = 0x2ec5b98e
Wenn ein Mikrocontroller ausfällt oder etwas schief geht und er nicht mehr funktioniert, wie erstellt er dann einen Speicherauszug?
Das tut es im Allgemeinen nicht. Das Erstellen eines breiten Speicherauszugs des gesamten RAM ist riskant, da bei vielen Mikrocontroller-Architekturen das Lesen von bestimmten SFR-Adressen unbeabsichtigte Auswirkungen hat, sodass Sie nicht naiv durch indirekte Adressierung über den gesamten RAM-Adressraum iterieren können.
Wenn Sie das wirklich, wirklich brauchen, besteht eine Möglichkeit darin, einen Mikrocontroller im Stil der 1980er Jahre mit einem externen Speicherbus und einem Watchdog aufzurüsten. Wenn der Watchdog abläuft, haben Sie einen sekundären Post-Mortem-Mikrocontroller, der den RAM-Inhalt auf einem EEPROM-Chip (oder was auch immer) speichert.
Edwin Fairchild
Juraj
Edwin Fairchild
Juraj
Edwin Fairchild
Juraj
Jon
Edwin Fairchild
Juraj