In Anbetracht des dargestellten Codes zeigt ein Objektspeicherauszug der Header Folgendes an:
pic32-objdump -x main.o9 .rodata 00000004 00000000 00000000 00000360 2 ** 2 INHALT, ALLOC, LOAD, READONLY, CODE10 .headerdata 00000004 00000000 00000000 00000364 2 ** 2 INHALT, ALLOC, LOAD, DATA
Dies zeigt, dass der Abschnitt, in dem Header-Daten platziert werden, dies nicht tut haben die Attribute READONLY und CODE, was wiederum dazu führt, dass der Linker die Daten aus diesem Abschnitt anders verarbeitet. In meinen begrenzten Tests scheint es, dass Inhalte in .headerdata code> wie andere Daten behandelt werden, was bedeutet, dass sie in einen speziellen Abschnitt mit dem Namen .dinit
gestellt und von Flash nach geladen werden RAM beim Programmstart. Sie erwähnen, dass die Daten aus dem Abschnitt .headerdata code> nicht in Ihrer Hex-Datei enthalten sind. Ich vermute, Sie finden sie im Abschnitt .dinit
.
Wenn Sie versuchen, Funktionen zu erhalten, die .rodata code> ähneln, aber Ihren eigenen Abschnittsnamen haben, müssen Sie Ihren Abschnitt .headerdata code> mit einem zusätzlichen markieren r
-Attribut wie folgt:
static const MODULEINFO SER_05_ModuleInfo __attribute __ ((Abschnitt (".headerdata, r"))) =
resultierend in einem Objekt-Header-Dump wie folgt:
9 .rodata 00000004 00000000 00000000 00000360 2 ** 2 INHALT, ALLOC, LOAD, READONLY, CODE 10 .headerdata 00000004 00000000 00000000 00000364 2 ** 2 INHALT , ALLOC, LOAD, READONLY, CODE
Dies wird dann ähnlich wie .rodata code> im Linker behandelt, solange Sie Ihr spezielles Linker-Skript-Snippet als hinzugefügt haben aufgeführt.
Ich gehe davon aus, dass Sie versuchen, Ihren Header zum ersten Datensatz zu machen, der im Programmraum vorhanden ist. Obwohl die von Ihnen aufgelisteten Linker-Skript-Ergänzungen anscheinend funktionieren, ziehe ich es normalerweise vor, nur die zusätzlichen Abschnitte in Übereinstimmung mit den vorhandenen Abschnitten in der bevorzugten Reihenfolge hinzuzufügen. Anstelle eines separaten Abschnitts vom Typ .headerdata ORIGIN (kseg0_program_mem)
können Sie den Abschnitt .text
bearbeiten, um Folgendes zu erhalten:
.text: {* (. headerdata) * (. stub .gnu.linkonce.t. *) KEEP (* (. text. * persönlichkeit *)) * (. mips16.fn. *) * (. mips16. call. *) * (. gnu.warning)} >kseg0_program_mem
Die Verwendung von pic32-objdump -d main.elf
zeigt eine vollständige Demontage der endgültigen Binärdatei in Hier sollten Ihre Header-Daten an der richtigen Adresse angezeigt werden.
Möglicherweise möchten Sie überprüfen, ob das Platzieren Ihres Headers am Anfang des Programmbereichs den Betrieb anderer Teile des Systems, z. B. die Ausnahmebehandlung, nicht beeinträchtigt.
Ich habe eine Kopie von pic30.c
gcc-Compilercode gefunden, der irgendwo im Web herumschwirrt, und die akzeptierten Abschnittsattributflags scheinen zu sein:
b - BSS
x - Ausführbarer Code
r - Nur-Lese-Daten
d - Beschreibbare Daten