2

I am trying to build my code for Nucleo STM32F042k6 with PlatformIO firmware Mbed but i get the following error:

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

Can anyone help me?

The build worked previously, but since I installed PlatformIO on a new computer, it no longer works.

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")
}

`

Clifford
  • 88,407
  • 13
  • 85
  • 165
Reza Hez
  • 41
  • 1
  • 3
  • 1
    Can you please show the file in question ("STM32F042X6.ld.link_script.ld")? – Erlkoenig Sep 02 '19 at 12:29
  • there is contian of this File. – Reza Hez Sep 02 '19 at 12:57
  • 1
    Since the error occurs when trying to skip over the heap area, this means that your RAM usage is too high (by 504 bytes). Try using fewer/smaller (global/static) variables. There might also be a way to reduce heap size if you don't need that. – Erlkoenig Sep 02 '19 at 13:04
  • thank you very much @Erlkoenig. but this code worked all the time . i've just commnited out most of the code so i can see the effect. but it's always the same error. `.pio\build\nucleo_f042k6\STM32F042X6.ld.link_script.ld:82 cannot move location counter backwards (from 20000950 to 20000800)` – Reza Hez Sep 02 '19 at 13:19
  • Did you include some large framework such as an IP stack that might consume a lot of memory? Maybe an updated version was installed that needs more memory... – Erlkoenig Sep 02 '19 at 13:21
  • thank you for anwer. i try find it out. – Reza Hez Sep 02 '19 at 13:52
  • You can try using the [linker map file](https://stackoverflow.com/q/38961649/4730685) to examine which part of the program consumes the memory. – Erlkoenig Sep 02 '19 at 13:53
  • The linker error refers to line 82 of the linker script - save us from counting by indicating which line that is. – Clifford Sep 03 '19 at 08:57
  • Your RAM usage may have changed for a number of reasons such as change of compiler, compiler options, version change or update of Mbed, change of code, change of any library you have used. How marginal was it on the working build? 4K is a very large stack for a 6K part perhaps. Have you changed the stack size or added or changed the size of any static data? – Clifford Sep 03 '19 at 09:28

1 Answers1

1

Recently I have met the same issue using silabs chip, just go to adjust your heap size/stack size. Your problem should be solved. If I'm not mistaken it means that you are running out of RAM to place heap.

I know it was already 2/3 years haha, hope this helps those who get into this problem in the future :)

Nic
  • 11
  • 3