mick_hf 发表于 2017-5-2 11:12:08

stm32769i-disco 板使用外部sdram的问题

大家好,刚接触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) }
}

mick_hf 发表于 2017-5-2 12:01:51

没人嘛自己顶一下

mick_hf 发表于 2017-5-2 12:53:23

没人这么用过么大家都来讨论下

mick_hf 发表于 2017-5-2 17:02:49

大神都去哪了,想把bss段定义到外部sdram里该怎么做?

mick_hf 发表于 2017-5-3 13:45:01

自己搞定了 没人讨论 答案就不贴了
页: [1]
查看完整版本: stm32769i-disco 板使用外部sdram的问题