2016-10-03 2 views
0

Я отладки встроенных систем с stm32f746vg микроконтроллера, где некоторые скорости критические секции кода загружаются в ОЗУ данных вместо вспышки. Остальная часть некритического кода загружается во флэш-память, а компоновщик по умолчанию помещает все разделы .text во флэш.GDB номера отсутствует линия

Я делаю это перемещение с малоприятной прототипы функций, как это:

int main(void) __attribute__((section(".data"))); 

Это заставляет main() быть загружено по адресу 0x2000 0000, который является то, что я хочу. К сожалению, GDB ожидает, что main() будет загружен по адресу 0x0080 0000, где остальная часть программного кода. В результате GDB не знает, где номера строк для main(). Есть ли способ рассказать GDB «main() действительно по этому адресу»?

  • У меня есть новейшая версия arm-none-eabi-gdb и arm-none-eabi-gcc.
  • Я бегу arm-none-eabi-gcc с опцией -g.
  • Когда я закомментируйте прототип основной, который содержит директиву __attribute__, GDB не имеет никаких проблем с поиском номера строк.

Ниже мой компоновщик скрипт:

/* Entry Point */ 
ENTRY(Reset_Handler) 


/* Generate a link error if heap and stack don't fit into RAM */ 
_Min_Heap_Size = 0;  /* required amount of heap */ 
_Min_Stack_Size = 0x400; /* required amount of stack */ 

/* Specify the memory areas */ 
/** 
* for the time being, we are going to buffer the image in sram1. sram1 is 
* entirely dedicated to buffering images. 
* DTCM_RAM will be used for user variables 
*/ 
MEMORY 
{ 
    FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 1024K 
    DTCM_SRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K 
/* RAM1 (xrw)  : ORIGIN = 0x20010000, LENGTH = 240K*/ 
    RAM1 (xrw)  : ORIGIN = 0x20010000, LENGTH = 245760 
    RAM2 (xrw)  : ORIGIN = 0x2004c000, LENGTH = 16K 
    ITCM_SRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 16K 
} 

/* Define output sections */ 
SECTIONS 
{ 
    /* Vectors need to be loaded at the start of flash. */ 
    .isr_vector : 
    { 
    . = ALIGN(4); 
    KEEP(*(.vector)) /* Startup code */ 
    . = ALIGN(4); 
    } >FLASH 

    /* The program code and other data goes into FLASH */ 
    .text : 
    { 
    . = ALIGN(4); 
    *(.text)   /* .text sections (code) */ 
    *(.text*)   /* .text* sections (code) */ 
    *(.rodata)   /* .rodata sections (constants, strings, etc.) */ 
    *(.rodata*)  /* .rodata* sections (constants, strings, etc.) */ 
    *(.glue_7)   /* glue arm to thumb code */ 
    *(.glue_7t)  /* glue thumb to arm code */ 
    *(.eh_frame) 

    /*KEEP (*(.init))*/ 
    /*KEEP (*(.fini))*/ 

    . = ALIGN(4); 
    _etext = .;  /* define a global symbols at end of code */ 
    _exit = .; 
    } >FLASH 


    .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH 
    .ARM : { 
    __exidx_start = .; 
     *(.ARM.exidx*) 
     __exidx_end = .; 
    } >FLASH 


    /* used by the startup to initialize data */ 
    _sidata = .; 

    /* Initialized data sections goes into RAM, load LMA copy after code */ 
    .data ORIGIN(DTCM_SRAM) : 
    { 
    . = ALIGN(4); 
    _sdata = .;  /* create a global symbol at data start */ 
    *(.data)   /* .data sections */ 
    *(.data*)   /* .data* sections */ 

    . = ALIGN(4); 
    _edata = .;  /* define a global symbol at data end */ 
    } AT > FLASH 
    __const_data_length__ = SIZEOF(.data); 

    /* Uninitialized data section */ 
    . = ALIGN(4); 
    .bss . : 
    { 
    /* This is used by the startup in order to initialize the .bss secion */ 
    _sbss = .;   /* define a global symbol at bss start */ 
    __bss_start__ = _sbss; 
    *(.bss) 
    *(.bss*) 
    *(COMMON) 

    . = ALIGN(4); 
    _ebss = .;   /* define a global symbol at bss end */ 
    __bss_end__ = _ebss; 
    } >DTCM_SRAM 

    /* User_heap_stack section, used to check that there is enough RAM left */ 
    ._user_heap_stack : 
    { 
    . = ALIGN(4); 
    PROVIDE (end = .); 
    PROVIDE (_end = .); 
    . = . + _Min_Heap_Size; 
    . = . + _Min_Stack_Size; 
    . = ALIGN(4); 
    } >DTCM_SRAM 

    /* ram1 section, vars must be located here explicitly   */ 
    /* Example: extern int foo(void) __attribute__ ((section (".ram1"))); */ 
    /* No initialization is offered for this section.*/ 
    .ram1 ORIGIN(RAM1) : 
    { 
    *(.ram1) 
    } >RAM1 

    /* Remove information from the standard libraries */ 
    /DISCARD/ : 
    { 
    libc.a (*) 
    libm.a (*) 
    libgcc.a (*) 
    } 

    .ARM.attributes 0 : { *(.ARM.attributes) } 
} 

Это мои НКУ флаги

CFLAGS = -gstabs -Wall -std=gnu99 -ffunction-sections -Wno-unused-variable 
CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork 
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mlong-calls 
CFLAGS += -I. -ggdb 
CFLAGS += -DHSE_VALUE=$(HSE_VALUE) 
CFLAGS += -DUSE_STDPERIPH_DRIVER 
+1

'' main' в .data'? Что он должен делать, кроме как столкнуться с проблемами? –

+0

@EugeneSh., По-видимому, предполагается, что он будет загружать 'main' в RAM вместо flash. Я склонен подозревать, что есть лучший способ добиться этого, но неясно, решит ли какой-либо такой подход проблему ОП. –

+0

@JohnBollinger Это действительно неудобно. Я предполагаю, что здесь проблема XY. –

ответ

1

Вы добиться этого путем размещения основной() в специальном разделе кода по вашему выбору, назовите его. fast_exec

int main(void) __attribute__((section(".fast_exec"))); 

Затем, в сценарии компоновщика, разместите его новый раздел для выполнения из ОЗУ. Он будет скопирован с FLASH при запуске:

.fast_exec : { 
    *(.fast_exec) 
} > DTCM_SRAM AT> FLASH 

Вы можете проверить эффект этого, проверив файл карты.

См: https://stackoverflow.com/a/15142268/1096140

+0

Вот что я сейчас делаю. Является ли «.fast_exec» специальное имя, которое распознает GDB? –

+0

Нет, это не особенность. –

+0

Не могли бы вы указать, что говорит gdb, когда вы вводите 'info symbol main' и' info address main'? –

 Смежные вопросы

  • Нет связанных вопросов^_^