0
votes

I'm working on an inherit project based on NUCLEO-F207ZG board with stm32f207ZGT, as IDE I use SW4STM32(Eclipse, AC6).

This project is compiling ok in other pc, but for distance reasons I can't use it to compare configurations.

After importing the with no errors I try to compile it get the console output:

Building target: STM32F207ZG_NUCLEO_144.elf

Invoking: MCU GCC Linker

arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -specs=nosys.specs -specs=nano.specs -T"../STM32F207ZGTx_FLASH.ld" -Wl,-Map=output.map -Wl,--gc-sections -o "STM32F207ZG_NUCLEO_144.elf" @"objects.list" -lm

c:/ac6/systemworkbench/plugins/fr.ac6.mcu.externaltools.arm-none.win32_1.15.0.201708311556/tools/compiler/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/bin/ld.exe: section .RxDescripSection VMA [2000e000,2000e09f] overlaps section .bss VMA [20000118,2001431b]

collect2.exe: error: ld returned 1 exit status

make: *** [STM32F207ZG_NUCLEO_144.elf] Error 1

makefile:45: recipe for target 'STM32F207ZG_NUCLEO_144.elf' failed

15:59:47 Build Finished (took 23s.436ms)

After some search in internet, this appears to be caused by the linker:

/*
*****************************************************************************
**

**  File        : LinkerScript.ld
**
**  Abstract    : Linker script for STM32F207ZGTx Device with
**                1024KByte FLASH, 128KByte RAM
**
**                Set heap size, stack size and stack location according
**                to application requirements.
**
**                Set memory bank area and size if external memory is used.
**
**  Target      : STMicroelectronics STM32
**
**
**  Distribution: The file is distributed as is, without any warranty
**                of any kind.
**
**  (c)Copyright Ac6.
**  You may use this file as-is or modify it according to the needs of your
**  project. Distribution of this file (unmodified or modified) is not
**  permitted. Ac6 permit registered System Workbench for MCU users the
**  rights to distribute the assembled, compiled & linked contents of this
**  file as part of an application binary file, provided that it is built
**  using the System Workbench for MCU toolchain.
**
*****************************************************************************
*/

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = 0x20020000;    /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200;      /* required amount of heap  */
_Min_Stack_Size = 0x400; /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K
RAM (xrw)        : ORIGIN = 0x20000000, LENGTH = 128K
}

/* Define output sections */
SECTIONS
{
  /* The startup code goes first into FLASH */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_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) */
    *(.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 */
  } >FLASH

  /* Constant data goes into FLASH */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >FLASH

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

  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

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

  /* Initialized data sections goes into RAM, load LMA copy after code */
  .data : 
  {
    . = 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 */
  } >RAM AT> FLASH

  
  /* 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;
  } >RAM

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

  

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

  .ARM.attributes 0 : { *(.ARM.attributes) }
  .RxDescripSection     0x2000E000 (NOLOAD) : { *(.RxDescripSection)     } >RAM
  .TxDescripSection     0x2000E100 (NOLOAD) : { *(.TxDescripSection)     } >RAM
  .RxBUF                0x2000E200 (NOLOAD) : { *(.RxBUF)                } >RAM
  .TxBUF                0x2000FFC4 (NOLOAD) : { *(.TxBUF)                } >RAM
}

Makefile:

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include Middlewares/LwIP/system/OS/subdir.mk
-include Middlewares/LwIP/Netif/subdir.mk
-include Middlewares/LwIP/Core/IPv4/subdir.mk
-include Middlewares/LwIP/Core/subdir.mk
-include Middlewares/LwIP/Api/subdir.mk
-include Middlewares/FreeRTOS/portable/ARM_CM3/subdir.mk
-include Middlewares/FreeRTOS/portable/subdir.mk
-include Middlewares/FreeRTOS/subdir.mk
-include Drivers/STM32F2xx_HAL_Driver/subdir.mk
-include Drivers/BSP/STM32F2xx_Nucleo_144/subdir.mk
-include Application/User/Src/MQTTPacket/subdir.mk
-include Application/User/Src/MQTTClient/subdir.mk
-include Application/User/Src/subdir.mk
-include subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(S_UPPER_DEPS)),)
-include $(S_UPPER_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif

-include ../makefile.defs

# Add inputs and outputs from these tool invocations to the build variables 

# All Target
all: STM32F207ZG_NUCLEO_144.elf

# Tool invocations
STM32F207ZG_NUCLEO_144.elf: $(OBJS) $(USER_OBJS) ../STM32F207ZGTx_FLASH.ld
    @echo 'Building target: $@'
    @echo 'Invoking: MCU GCC Linker'
    arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -specs=nosys.specs -specs=nano.specs -T"../STM32F207ZGTx_FLASH.ld" -Wl,-Map=output.map -Wl,--gc-sections -o "STM32F207ZG_NUCLEO_144.elf" @"objects.list" $(USER_OBJS) $(LIBS) -lm
    @echo 'Finished building target: $@'
    @echo ' '
    $(MAKE) --no-print-directory post-build

# Other Targets
clean:
    -$(RM) *
    -@echo ' '

post-build:
    -@echo 'Generating binary and Printing size information:'
    arm-none-eabi-objcopy -O binary "STM32F207ZG_NUCLEO_144.elf" "STM32F207ZG_NUCLEO_144.bin"
    arm-none-eabi-size "STM32F207ZG_NUCLEO_144.elf"
    -@echo ' '

.PHONY: all clean dependents
.SECONDARY: post-build

-include ../makefile.targets

I'm out of ideas, I have tried manually modficate linker and makefile but it has been worst.

Thanks for your help!!

EDIT:

If I remove(comment) the last lines of linker, then it works, but I souldn't be doing this becuse is an automatic generated file.

modifications in linker:

 /* 
  .RxDescripSection     0x2000E000 (NOLOAD) : { *(.RxDescripSection)     } >RAM
  .TxDescripSection     0x2000E100 (NOLOAD) : { *(.TxDescripSection)     } >RAM
  .RxBUF                0x2000E200 (NOLOAD) : { *(.RxBUF)                } >RAM
  .TxBUF                0x2000FFC4 (NOLOAD) : { *(.TxBUF)                } >RAM 
  */

EDIT 2:

This lines I've commented on first EDIT, came from ethernetif.c and most sure I will need theme.

#if defined ( __ICCARM__ ) /*!< IAR Compiler */

#pragma location=0x2000E000
__no_init ETH_DMADescTypeDef  DMARxDscrTab[ETH_RXBUFNB];/* Ethernet Rx MA Descriptor */
#pragma location=0x2000E100
__no_init ETH_DMADescTypeDef  DMATxDscrTab[ETH_TXBUFNB];/* Ethernet Tx DMA Descriptor */
#elif defined ( __CC_ARM   )
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RXBUFNB] __attribute__((at(0x2000E000)));/* Ethernet Rx MA Descriptor */
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TXBUFNB] __attribute__((at(0x2000E100)));/* Ethernet Tx DMA Descriptor */
#elif defined ( __GNUC__   )
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RXBUFNB] __attribute__((section(".RxDescripSection")));/* Ethernet Rx MA Descriptor */
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TXBUFNB] __attribute__((section(".TxDescripSection")));/* Ethernet Tx DMA Descriptor */
#endif
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
#pragma location=0x2000E200
__no_init uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE]; /* Ethernet Receive Buffer */
#pragma location=0x2000FFC4
__no_init uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE]; /* Ethernet Transmit Buffer */
#elif defined ( __CC_ARM   )
uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE] __attribute__((at(0x2000E200)));  /* Ethernet Receive Buffer */
uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE]  __attribute__((at(0x2000FFC4))); /* Ethernet Transmit Buffer */
#elif defined ( __GNUC__   )
uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE] __attribute__((section(".RxBUF")));/* Ethernet Receive Buffer */
uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE] __attribute__((section(".TxBUF")));/* Ethernet Transmit Buffer */
#endif
1
just wrong inker script/ Any special reasons for those additional sections? I do not see any.0___________
I'm developing a project with Ethernet, LWIP, IBM Bluemix and MQTT, but is my first contact so I suspect some one of this IPs is adding this lines to the linker scripttaquionbcn
Although I have never written a linker file for a Cortex myself, it appears that the above file is contradicting itself. The last range of RAM is the _user_heap_stack and it seems this file assumes that everything after _Min_Stack_Size is used as stack also - up to _estack which seems to be the init value for the stackpointer. The additional buffers and descriptors do not care for the allocation scheme at all, placing themselves in the middle of the RAM. Maybe putting the _estack after the _user_heap_stack with _estack = .; and moving the problematic sections up to 0x2001E000 will help.Vroomfondel
Or putting _estack = 0x2001E00; in case your minimum stack requirement is wrong.Vroomfondel
I change the _estack to 0x2001E000 and I keep getting same error: Description Resource Path Location Type section .RxDescripSection VMA [2000e000,2000e09f] overlaps section .bss VMA [20000118,2001431b] HIPRA_ETHERNET C/C++ Problemtaquionbcn

1 Answers

0
votes

I don't know why but now that I have the HW to test, the project is working without the lines I comment in EDIT

EDIT: The problem is in the cubemx generated code for LWIP.