2017-08-08 1 views
1

Ich muss eine konstante Zeichenfolge an einer bestimmten Adresse innerhalb der Textabschnitt auf einem STM32F4 platzieren. Dies ist, was sollte mein Gedächtnis wie folgt aussehen:Platzieren Sie Zeichenfolge an bestimmte Adresse in. Textabschnitt

0x08000000 - 0x08007FFF  reserved for bootloader 
0x08008000 - 0x08012FFF  .text (part1) 
0x08013000 - 0x0801303F  String constant (64 bytes reserved) 
0x08013040 - (end of flash) .text (part2) 

LD Skript zur Zeit wie folgt definiert ist:

MEMORY 
{ 
    ROM  (rx) : ORIGIN = 0x08008000, LENGTH = 512K 
    RAM  (rwx) : ORIGIN = 0x20000000, LENGTH = 128K 
} 

_IDENTIFICATION_START = 0x8013000; 

SECTIONS 
{ 
    .text : 
    { 
    KEEP(*(.isr_vector)) 
    *(.text*) 

    /* < init, ctors, dtors & rodata truncated for readability> */ 
    } > ROM 

    .identification _IDENTIFICATION_START : 
    { 
    KEEP(*(.identification)) ; 
    } 

    /* < truncated for readability> */ 
} 

Aber eine Überlappung-Warnung. Ich versuchte dies:

MEMORY 
{ 
    ROM1  (rx) : ORIGIN = 0x08008000, LENGTH = 0xB000 
    ROM2 (rx) : ORIGIN = 0x08013080, LENGTH = 512K 
    RAM  (rwx) : ORIGIN = 0x20000000, LENGTH = 128K 
} 

_IDENTIFICATION_START = 0x8013000; 
_FWADDRESS_START = 0x8013020; 


SECTIONS 
{ 
    .text : 
    { 
    KEEP(*(.isr_vector)) 
    *(.text*) 
    } > ROM1 

    .text : 
    { 
    *(.text*) 

    /* < init, ctors, dtors & rodata truncated for readability> */ 
    } > ROM2 

    .identification _IDENTIFICATION_START : 
    { 
    KEEP(*(.identification)) ; 
    } 

    /* < truncated for readability> */ 
} 

nun völlig ignoriert Region ROM1 es, alles in ROM2 platzieren, aber ich brauche auch den Beginn des Code bei 0x08008000, weil das ist die Adresse des Bootloader springt.

Kann jemand den .text, teilen, eine Lücke lassend, wo ich die Schnur const setzen kann?

Antwort

0

Eine Möglichkeit, dies zu tun, ist es, einen Abschnitt zu erstellen, die dann im Quellcode verwenden, wie Stack in diesem Beispiel [1]:

char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };

[1] https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Variable-Attributes.html

+0

a Erstellen Sektion und Platzieren einer Variablen ist nicht das Problem, wir machen das schon in einigen anderen Projekten. Problem ist, diesen Abschnitt in. Text-Abschnitt zu platzieren, Linker zu sagen, um Text automatisch um diesen Abschnitt zu verknüpfen. Dies wurde gelöst, indem einige .o-files.text-Abschnitte manuell vor die const-Zeichenfolge gesetzt wurden und KEEP (* (. Identification)) aufgerufen wurde, bevor * (. Text) im ROM-Abschnitt aufgerufen wurde. Nicht der eleganteste Weg, da sich der erste .text ändern kann, so dass ich die Kartendatei ab und zu überprüfe, um sicherzustellen, dass ich nicht zu viel ROM verschwenden muss. Würde mich immer noch freuen für eine elegantere Lösung – viper1209

+0

Oh, jetzt verstehe ich es. Ich hatte tatsächlich das gleiche Problem in der Vergangenheit, konnte aber keine schöne Lösung finden. – domen

Verwandte Themen