Frage zur eingebetteten Firmware - Speicherauszug

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.Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Antworten (3)

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, countist 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 heißt, data[0] und [1] wären 0xD5 und 0x70?
Nein, int ist zwei Bytes
oh nein, weil data uint16 ist, wäre data[0] also 0xD570 ? richtig?
es hängt davon ab, ob das Endbyte das erste oder das letzte ist (Endian)
stimmt, aber von Natur aus ist die Frage in der Tat einfach, aber ich habe gerade "Memory Dump" und all diese Zeilen gesehen und überkompliziert, was sie gefragt haben.
Schlagen Sie die Compiler-Optionen und Endians nach
Das ist nicht ganz richtig. Ohne Strukturpaketierung richtet der Compiler alles an 4-Byte-Grenzen aus. Die Struktur verwendet 4 * 4 Bytes.
@Jon was meinst du mit Strukturpackung??
@EdwinFairchild, in der Frage erwähnte Compileroptionen: entpackt und natürlich ausgerichtet

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
In einigen Versionen des Compilers wird die Struktur "uint16_t data[2]" in zwei 16-Bit-Daten gepackt. da einige Controller über eine ALU-Funktion verfügen, mit der sie mit int16 in der Pipeline arbeiten können.
Jetzt haben Sie es für ihn gelöst und er bekommt den Job sicher nicht, wenn der potenzielle Arbeitgeber das findet
@Juraj oh nein, das Interview ist vorbei, sie zeichnen deinen Tastendruck auf und sobald du das Fenster schließt, ist es vorbei, keine zweite Chance, lol

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.