
大家好,刚接触stm32,我自己用MDK5搭了一个交叉编译环境,我的板子是stm32769i,外挂128Mb sdram,现在需要链接一个外部库,但是这个库的bss段太大,放不进sram里去,所以bss段只有放外部sdram里了, 按照网上的教程,替换了交叉编译的startup_stm32f769xx.s,添加了STM32F769NIHx_FLASH.ld文件DATA_IN_ExtSDRAM这个宏也添加了,现在一运行就进hard fault, 我的想法是把堆栈段放sram,bss段放sdram,程序运行在sdram,下面是我的ld文件,大家帮忙看下, 或者直接把堆栈也放进sdram里,该怎么整 另外 _estack = 0x20080000; 为什么是这个地址,可以是其他么? 盼回复,谢谢!! /* Generated by LinkerScriptGenerator [http://visualgdb.com/tools/LinkerScriptGenerator] * Target: STM32F767IG * The file is provided under the BSD license. */ ENTRY(Reset_Handler) _Min_Heap_Size = 0x2000; /* required amount of heap */ _Min_Stack_Size = 0x4000; /* required amount of stack */ MEMORY { FLASH (RX) : ORIGIN = 0x08000000, LENGTH = 2M SRAM (RWX) : ORIGIN = 0x20000000, LENGTH = 512K /* --- begin generated external memories -- */ BSS (RWX) : ORIGIN = 0xc0000000, LENGTH = 2M SDRAM (RWX) : ORIGIN = 0xc0200000, LENGTH = 14M /* --- end generated external memories -- */ } _estack = 0x20080000; SECTIONS { .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > FLASH .text : { . = ALIGN(4); _stext = .; *(.text) *(.text*) *(.rodata) *(.rodata*) *(.glue_7) *(.glue_7t) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); _etext = .; } > FLASH .ARM.extab : { . = ALIGN(4); *(.ARM.extab) *(.gnu.linkonce.armextab.*) . = ALIGN(4); } > FLASH .exidx : { . = ALIGN(4); PROVIDE(__exidx_start = .); *(.ARM.exidx*) . = ALIGN(4); PROVIDE(__exidx_end = .); } > FLASH .ARM.attributes : { *(.ARM.attributes) } > FLASH .preinSRAMit_array : { PROVIDE(__preinit_array_start = .); KEEP(*(.preinit_array*)) PROVIDE(__preinit_array_end = .); } > FLASH .init_array : { PROVIDE(__init_array_start = .); KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array*)) PROVIDE(__init_array_end = .); } > FLASH .fini_array : { PROVIDE(__fini_array_start = .); KEEP(*(.fini_array*)) KEEP(*(SORT(.fini_array.*))) PROVIDE(__fini_array_end = .); } > FLASH . = ALIGN(4); _sidata = .; .data : AT(_sidata) { . = ALIGN(4); _sdata = .; PROVIDE(__data_start__ = _sdata); *(.data) *(.data*) . = ALIGN(4); _edata = .; PROVIDE(__data_end__ = _edata); } > SRAM .bss : { . = ALIGN(4); _sbss = .; PROVIDE(__bss_start__ = _sbss); *(.bss) *(.bss*) *(COMMON) . = ALIGN(4); _ebss = .; PROVIDE(__bss_end__ = _ebss); } > BSS /* --- begin generated external memory sections -- */ . = _sidata + SIZEOF(.data); . = ALIGN(4); _sisdram_text = .; .sdram_text : AT(_sisdram_text) { . = ALIGN(4); _ssdram_text = .; PROVIDE(__sdram_text_start = _ssdram_text); *(.sdram_text) *(.sdram_text*) . = ALIGN(4); _esdram_text = .; PROVIDE(__sdram_text_end = _esdram_text); } > SDRAM . = _sisdram_text + SIZEOF(.sdram_text); . = ALIGN(4); _sisdram_data = .; .sdram_data : AT(_sisdram_data) { . = ALIGN(4); _ssdram_data = .; PROVIDE(__sdram_data_start = _ssdram_data); *(.sdram_data) *(.sdram_data*) . = ALIGN(4); _esdram_data = .; PROVIDE(__sdram_data_end = _esdram_data); } > SDRAM /* --- end generated external memory sections -- */ ._user_heap_stack : { . = ALIGN(8); PROVIDE ( end = . ); PROVIDE ( _end = . ); . = . + _Min_Heap_Size; . = . + _Min_Stack_Size; . = ALIGN(8); } >SRAM /* Remove information from the standard libraries */ /DISCARD/ : { libc.a ( * ) libm.a ( * ) libgcc.a ( * ) } .ARM.attributes 0 : { *(.ARM.attributes) } } |
自己搞定了 没人讨论 答案就不贴了 |
没人嘛 自己顶一下 |
没人这么用过么 大家都来讨论下 |
大神都去哪了,想把bss段定义到外部sdram里该怎么做? |