2017-09-26 63 views
0

我正在開發基於NUCLEO-F207ZG板的stm32f207ZGT繼承項目,作爲IDE I使用SW4STM32(Eclipse,AC6)。STM32f207ZG NUCLEO板,ld.exe:節.RxDescripSection VMA [2000e000,2000e09f]重疊節.bss VMA [20000118,2001431b]

該項目編譯好在其他電腦,但由於距離的原因,我不能用它來比較配置。

沒有錯誤導入後,我嘗試編譯它得到的控制檯輸出:

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)

在互聯網一些搜索後,這似乎是由連接器造成的:

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

** 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: [email protected]' 
    @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: [email protected]' 
    @echo ' ' 
    $(MAKE) --no-print-directory post-build 

# Other Targets 
clean: 
    -$(RM) * 
    [email protected] ' ' 

post-build: 
    [email protected] '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" 
    [email protected] ' ' 

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

-include ../makefile.targets 

我出出主意,我已經試過手動modficate連接和Makefile b這是最糟糕的。

感謝您的幫助!

編輯:

如果我刪除(評論)連接的最後幾行,然後它的工作原理,但我souldn't做這becuse是一個自動生成的文件。

修改的鏈接:

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

編輯2:

我已經在第一編輯評論這行,從ethernetif.c來了,最知道我需要的主題。

#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 
+0

只是錯誤的提供者腳本/這些額外部分的任何特殊原因?我沒有看到任何。 –

+0

我正在開發一個使用以太網,LWIP,IBM Bluemix和MQTT的項目,但是我的第一個聯繫人,所以我懷疑這些IP中的某一個將這些行添加到鏈接描述文件 – taquionbcn

+0

儘管我從來沒有爲Cortex寫過鏈接器文件我自己,看起來上面的文件是矛盾的。 RAM的最後一個範圍是_user_heap_stack,看起來這個文件假設_Min_Stack_Size之後的所有內容都被用作堆棧,直到_estack,這似乎是堆棧指針的初始值。額外的緩衝區和描述符完全不關心分配方案,將它們放在RAM的中間。也許把_est__ack_stack放在'_estack =。;'後面並將有問題的部分移動到0x2001E000將有所幫助。 – Vroomfondel

回答

0

我不知道爲什麼,但現在我有硬件來測試,該項目不工作我編輯點評線

編輯: 的問題是所產生的cubemx代碼爲LWIP。