Ошибка компоновщика: невозможно переместить счетчик местоположения назад (с 200009f8 на 20000800)

Я пытаюсь собрать свой код для Nucleo STM32F042k6 с прошивкой PlatformIO Mbed, но получаю следующую ошибку:

.pio\build\nucleo_f042k6\STM32F042X6.ld.link_script.ld:82 cannot move location counter backwards (from 200009f8 to 20000800)

Может кто-нибудь помочь мне?

Сборка работала раньше, но так как я установил PlatformIO на новый компьютер, она больше не работает.

STM32F042X6.ld.link_script.ld :

STACK_SIZE = 4096;
MEMORY
{
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32k
  RAM (xrw) : ORIGIN = 0x200000C0, LENGTH = 6k - 0x0C0
}
ENTRY(Reset_Handler)
SECTIONS
{
    .text :
    {
        KEEP(*(.isr_vector))
        *(.text*)
        KEEP(*(.init))
        KEEP(*(.fini))
        *crtbegin.o(.ctors)
        *crtbegin?.o(.ctors)
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
        *(SORT(.ctors.*))
        *(.ctors)
        *crtbegin.o(.dtors)
        *crtbegin?.o(.dtors)
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
        *(SORT(.dtors.*))
        *(.dtors)
        *(.rodata*)
        KEEP(*(.eh_frame*))
    } > FLASH
    .ARM.extab :
    {
        *(.ARM.extab* .gnu.linkonce.armextab.*)
    } > FLASH
    __exidx_start = .;
    .ARM.exidx :
    {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    } > FLASH
    __exidx_end = .;
    __etext = .;
    _sidata = .;
    .data : AT (__etext)
    {
        __data_start__ = .;
        _sdata = .;
        *(vtable)
        *(.data*)
        . = ALIGN(8);
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP(*(.preinit_array))
        PROVIDE_HIDDEN (__preinit_array_end = .);
        . = ALIGN(8);
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP(*(SORT(.init_array.*)))
        KEEP(*(.init_array))
        PROVIDE_HIDDEN (__init_array_end = .);
        . = ALIGN(8);
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP(*(SORT(.fini_array.*)))
        KEEP(*(.fini_array))
        PROVIDE_HIDDEN (__fini_array_end = .);
        KEEP(*(.jcr*))
        . = ALIGN(8);
        __data_end__ = .;
        _edata = .;
    } > RAM
    .bss :
    {
        . = ALIGN(8);
        __bss_start__ = .;
        _sbss = .;
        *(.bss*)
        *(COMMON)
        . = ALIGN(8);
        __bss_end__ = .;
        _ebss = .;
    } > RAM
    .heap (COPY):
    {
        __end__ = .;
        end = __end__;
        *(.heap*)
        . = ORIGIN(RAM) + LENGTH(RAM) - STACK_SIZE;
        __HeapLimit = .;
    } > RAM
    .stack_dummy (COPY):
    {
        *(.stack*)
    } > RAM
    __StackTop = ORIGIN(RAM) + LENGTH(RAM);
    _estack = __StackTop;
    __StackLimit = __StackTop - STACK_SIZE;
    PROVIDE(__stack = __StackTop);
    ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
}

`


person Reza Hez    schedule 02.09.2019    source источник
comment
Не могли бы вы показать файл, о котором идет речь (STM32F042X6.ld.link_script.ld)?   -  person Erlkoenig    schedule 02.09.2019
comment
есть продолжение этого файла.   -  person Reza Hez    schedule 02.09.2019
comment
Поскольку ошибка возникает при попытке пропустить область кучи, это означает, что использование вашей оперативной памяти слишком велико (на 504 байта). Попробуйте использовать меньше/меньше (глобальные/статические) переменные. Также может быть способ уменьшить размер кучи, если вам это не нужно.   -  person Erlkoenig    schedule 02.09.2019
comment
большое спасибо @Erlkoenig. но этот код работал все время. я только что выделил большую часть кода, чтобы увидеть эффект. но всегда одна и та же ошибка. .pio\build\nucleo_f042k6\STM32F042X6.ld.link_script.ld:82 cannot move location counter backwards (from 20000950 to 20000800)   -  person Reza Hez    schedule 02.09.2019
comment
Вы включили какую-то большую структуру, такую ​​как стек IP, которая может потреблять много памяти? Возможно, была установлена ​​обновленная версия, которой нужно больше памяти...   -  person Erlkoenig    schedule 02.09.2019
comment
спасибо за ответ. я пытаюсь узнать это.   -  person Reza Hez    schedule 02.09.2019
comment
Вы можете попробовать использовать файл карты компоновщика, чтобы узнать, какая часть программы потребляет память.   -  person Erlkoenig    schedule 02.09.2019
comment
Ошибка компоновщика относится к строке 82 скрипта компоновщика — избавьте нас от подсчета, указав, какая это строка.   -  person Clifford    schedule 03.09.2019
comment
Использование вашей оперативной памяти могло измениться по ряду причин, таких как изменение компилятора, параметров компилятора, изменение версии или обновление Mbed, изменение кода, изменение любой библиотеки, которую вы использовали. Насколько это было маргинально на рабочей сборке? Возможно, 4K — это очень большой стек для части 6K. Изменили ли вы размер стека, добавили или изменили размер каких-либо статических данных?   -  person Clifford    schedule 03.09.2019