Gast
#2526939
Hallo, neuere Mikrocontroller haben inzwischen ja meist so viel SRAM, dass man auf die Idee kommen kann, beim Debuggen das Programm nur ins RAM zu laden und dort laufen zu lassen. Für den STM32 habe ich dazu ein Trampolin ins Flash geschrieben, dass nach einem Reset den Stack aus 0x20000000 lädt und dann nach 0x20000004 springt. Hat man im Linker Skript etwas wie .text:{ *(.text .text.* .gnu.linkonce.t.*) *(.rodata .rodata* .gnu.linkonce.r.*) } > SRAM0 .data : { *(.data .data.* .gnu.linkonce.d.*) . = ALIGN(4); *(.ramfunc); . = ALIGN(4); } > SRAM0 geht das aber nach dem Hochladen nur einmal, das die initialisierten Daten im ersten Lauf verändert werden. Damit das Ganze auch auch nach einem Programmlauf neu Starten kann, bräuchte man einen Bereich im SRAM, aus dem die initialisierten Daten jedesmal neu geladen werden, wie in Linkerskripten für Flash. Allerdings bringt .text:{ *(.text .text.* .gnu.linkonce.t.*) *(.rodata .rodata* .gnu.linkonce.r.*) .etext = .; } > SRAM0 .data : AT (_etext) { _sdata = .; *(.data .data.* .gnu.linkonce.d.*) . = ALIGN(4); *(.ramfunc); . = ALIGN(4); _edata = .; } > SRAM0 nichts, da dann die zu initialisierenden Daten und die Initialisierungsdaten aufeinander liegen. Kurzum, hinter dem Text müsste man (_edata -_sdata) Platz lassen. Der GNU Linker kennt aber meines Wissens keine Vorwärtsreferenz. Man muss explizit xxx Bytes frei lassen. Das geht natürlich einige Zeit gut. Aber entweder der Bereich ist zu gross, und man verschenkt noch mehr SRAM, oder er ist zu klein und der Linker meldet keinen Fehler und beim Programmlauf geht irgendetwas schief. Übersehe ich eine Möglichkeit?