Skip to content

microblaze与zynq共存情形(之九)

minichao9901 edited this page Feb 10, 2024 · 1 revision

测试:配置模式

不使用local memory。
关闭了mb的Cache。mb的data使用DP->GP0接口访问。看能否搞定,解决程序在ddr中运行?

image image

mb的ld文件设置的关键:

手动在ld文件前面新增加几个section,手动将前几十个字节的vectors放置到指定的位置(ddr中)

/* Specify the default entry point to the program */

ENTRY(_start)

/* Define the sections, and where they are mapped in memory */

SECTIONS
{
.vectors.reset 0x10000000 : {
   *(.vectors.reset)
} 

.vectors.sw_exception 0x10000008 : {
   *(.vectors.sw_exception)
} 

.vectors.interrupt 0x10000010 : {
   *(.vectors.interrupt)
} 

.vectors.hw_exception 0x10000020 : {
   *(.vectors.hw_exception)
} 

ld文件视图

mb的ld文件视图

image

注意要在ddr_base地址上偏移0x50地址,前0x50以内放置mb的vectors。

zynq的ld文件视图

image

mb的main程序

#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "sleep.h"
#include "xil_cache.h"

#define GPIO_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID // 根据实际硬件配置修改
#define LED_CHANNEL 1

void test_ddr(UINTPTR addr, u32 length, u8 mode)
{
    for(UINTPTR p=addr; p<addr+length; p+=4){
    	Xil_Out32(p,0x11223344);
    }

    for(UINTPTR p=addr; p<addr+length; p+=4){
    	int v= Xil_In32(p);
    	if(mode==0){
    		xil_printf("%p->%x\r\n",p,v);
    	}
    	else if(mode==1 && v!=11223344){
    		xil_printf("%p\r\n",p);
    	}
    }
}


int main() {
    XGpio gpio;
    int Status;

    usleep(50000);
    Xil_DCacheDisable();

    xil_printf("Microblaze GPIO test!\r\n");

    // 初始化GPIO
    Status = XGpio_Initialize(&gpio, GPIO_DEVICE_ID);
    if (Status != XST_SUCCESS) {
        printf("GPIO Initialization failed\n");
        return XST_FAILURE;
    }

    // 设置GPIO为输出
    XGpio_SetDataDirection(&gpio, LED_CHANNEL, 0x00);

    while (1) {
//        scanf("%c",&c);
//        while(c!='c');

    	xil_printf("Microblaze Print Now!\r\n");
        test_ddr(0x11000000,16,0); //test ddr
		test_ddr(0xfffc0000,16,0); //test ocm, remap模式才可以访问
		test_ddr(0xfffd0000,16,0); //test ocm, remap模式才可以访问
		test_ddr(0xfffe0000,16,0); //test ocm, remap模式才可以访问
		test_ddr(0xffff0000,16,0); //test ocm, remap模式才可以访问
		test_ddr(0x00000000,16,0); //test ocm0, 默认非remap模式可以访问
		test_ddr(0x00010000,16,0); //test ocm1, 默认非remap模式可以访问
		test_ddr(0x00020000,16,0); //test ocm2, 默认非remap模式可以访问
		test_ddr(0xFFFF0000,16,0); //test ocm3, 默认非remap模式可以访问


        // 依次翻转四个GPIO引脚
        XGpio_DiscreteWrite(&gpio, LED_CHANNEL, 0b0001);
        usleep(500000/10); // 等待500毫秒

        XGpio_DiscreteWrite(&gpio, LED_CHANNEL, 0b0010);
        usleep(500000/10);

        XGpio_DiscreteWrite(&gpio, LED_CHANNEL, 0b0100);
        usleep(500000/10);

        XGpio_DiscreteWrite(&gpio, LED_CHANNEL, 0b1000);
        usleep(500000/10);
    }

    return 0;
}

zynq的main程序

  • 只负责remap,其实不是必须的。不用zynq,mb也是可以在运行的。关键在于正确设置mb的ld文件。
  • 我自己写的remap函数
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xgpio.h"

void Xil_Remap_OCM(void)
{
    xil_printf("%x\r\n",Xil_In32(0xf8000910));  //read slcr.ocm_cfg
    Xil_Out32(0xf8000000+0x08,0xdf0d); //slcr.unlock
    Xil_Out32(0xf8000910,0x000f);      //slcr.ocm_cfg(remap ocm from 0x00000000->0xfffc0000)
    Xil_Out32(0xf8000000+0x08,0x0);    //slcr_unlock
    xil_printf("%x\r\n",Xil_In32(0xf8000910));  //read slcr.ocm_cfg again
}

int main()
{
    init_platform();
    Xil_Remap_OCM();

    cleanup_platform();
    return 0;
}
  • xilinx官方提供的remap函数(功能更多)
#include "xil_io.h"
#include "xil_mmu.h"
#include "xpseudo_asm.h"
#include "remap_ocm.h"
#include <xil_cache.h>

#define GPIO_BASE  0xE000A000
#define GPIO_DIRM  (GPIO_BASE+0x0284)
#define GPIO_MASK_DATA  (GPIO_BASE+0x0010)

// OCM memory used to communicate with CPU0
#define COMM_VAL  (*(volatile u32 *)(0xFFFF0000))

// Remap all 4 64KB OCM to top of memory starting at 0xFFFC0000
// Open address filtering to include DDR at 0x00000000
#define MY_REMAP()   __asm__ __volatile__(\
    "mov  r5, #0x03                                           \n"\
    "mov  r6, #0                                              \n"\
    "LDR  r7, =0xF8000000  /* SLCR base address    */         \n"\
    "LDR  r8, =0xF8F00000  /* MPCORE base address  */         \n"\
    "LDR  r9, =0x0000767B  /* SLCR lock key        */         \n"\
    "mov  r10,#0x1F                                           \n"\
    "LDR  r11,=0x0000DF0D  /* SLCR unlock key                 \n"\
    "dsb                                                      \n"\
    "isb                   /* make sure it completes */       \n"\
    "pli  do_remap     /* preload the instruction cache */    \n"\
    "pli  do_remap+32                                         \n"\
    "pli  do_remap+64                                         \n"\
    "pli  do_remap+96                                         \n"\
    "pli  do_remap+128                                        \n"\
    "pli  do_remap+160                                        \n"\
    "pli  do_remap+192                                        \n"\
    "isb                   /* make sure it completes */       \n"\
    "b    do_remap                                            \n"\
    ".align 5, 0xFF         /* forces the next block to a cache line alignment */ \n"\
    "do_remap:              /* Unlock SLCR                         */ \n"\
    "str  r11, [r7, #0x8]   /* Configuring OCM remap value         */ \n"\
    "str  r10, [r7, #0x910] /* Lock SLCR                           */ \n"\
    "str  r9,  [r7, #0x4]   /* Disable SCU & address filtering     */ \n"\
    "str  r6,  [r8, #0x0]   /* Set filter start addr to 0x00000000 */ \n"\
    "str  r6,  [r8, #0x40]  /* Enable SCU & address filtering      */ \n"\
    "str  r5,  [r8, #0x0]                                             \n"\
    "dmb                                                              \n"\
   );

int main()
{

	// Remap all 4 64KB blocks of OCM to top of memory
	MY_REMAP();

	// Disable L1 cache for OCM
	Xil_SetTlbAttributes(0xFFFC0000,0x04de2);           // S=b0 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0

	COMM_VAL = 0;

	/**********************************************************
     * mb bootloop
     * If not using FSBL to download Microblaze elf to DDR
     * the reset vector of the Microblaze needs to contain
     * a 'branch to self' in order to provide the Microblaze
     * valid code to run before before the debugger can halt
     * the Microblaze and download the application that 
     * places valid code at the Microblaze's reset vector
     *
     * If using SDK/XMD to download the Microblaze application
     * uncomment the following two lines of code
     **********************************************************/
	Xil_Out32(0x30000000, 0xb8000000);
	Xil_DCacheFlush();

	///////////////////////////////////////////////
	//Take PL out of reset
	//Enable emio bit 0
	//Xil_Out32(GPIO_DIRM, 0x1);
	//Set emio[0] to release PL reset
	//Xil_Out32(GPIO_MASK_DATA, 0xfffe0001);


	///////////////////////////////////////////////
	// Loop forever
//    while(1) {
//    	xil_printf("CPU0: Hello World\n\r");
//
//    	// Wait until UART TX FIFO is empty
//    	while ((Xil_In32(STDOUT_BASEADDRESS + 0x2C) & 0x08) != 0x08);
//
//    	COMM_VAL = 1;
//    	while(COMM_VAL == 1);
//    }

    return 0;
}

运行结果

image image image

以上分别是:
1)mb-only的运行结果,可见在mb中可以正确运行,但是只能读写ddr+ocm3的数据。 读写ocm_lower_addr错误,读写ocm_higher_addr也不行。
2)mb+zynq_remap(官方)的运行结果:可见mb+zyqn_remap,可以正确读写ddr/ocm_higher_addr/ocm3的数据。读写ocm_lower_addr错误。 3)mb+zyqn_remap(我写的)的运行结果:与前面用官方的remap结果一样。

存在的问题:运行速度比较慢,不是正确的情况,看样子直接在ddr中运行,没有cache是很慢的。

附录1:mb的完整ld文件

/*******************************************************************/
/*                                                                 */
/* This file is automatically generated by linker script generator.*/
/*                                                                 */
/* Version: Xilinx EDK 14.5 EDK_P.58f                                */
/*                                                                 */
/* Copyright (c) 2010 Xilinx, Inc.  All rights reserved.           */
/*                                                                 */
/* Description : MicroBlaze Linker Script                          */
/*                                                                 */
/*******************************************************************/

_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x400;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x400;

/* Define Memories in the system */

MEMORY
{
   ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR : ORIGIN = 0x10000050, LENGTH = 0x0FFFFFB0
   ps7_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x0000FE00
}

/* Specify the default entry point to the program */

ENTRY(_start)

/* Define the sections, and where they are mapped in memory */

SECTIONS
{
.vectors.reset 0x10000000 : {
   *(.vectors.reset)
} 

.vectors.sw_exception 0x10000008 : {
   *(.vectors.sw_exception)
} 

.vectors.interrupt 0x10000010 : {
   *(.vectors.interrupt)
} 

.vectors.hw_exception 0x10000020 : {
   *(.vectors.hw_exception)
} 

.text : {
   *(.text)
   *(.text.*)
   *(.gnu.linkonce.t.*)
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.init : {
   KEEP (*(.init))
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.fini : {
   KEEP (*(.fini))
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.ctors : {
   __CTOR_LIST__ = .;
   ___CTORS_LIST___ = .;
   KEEP (*crtbegin.o(.ctors))
   KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors))
   KEEP (*(SORT(.ctors.*)))
   KEEP (*(.ctors))
   __CTOR_END__ = .;
   ___CTORS_END___ = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.dtors : {
   __DTOR_LIST__ = .;
   ___DTORS_LIST___ = .;
   KEEP (*crtbegin.o(.dtors))
   KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors))
   KEEP (*(SORT(.dtors.*)))
   KEEP (*(.dtors))
   PROVIDE(__DTOR_END__ = .);
   PROVIDE(___DTORS_END___ = .);
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.rodata : {
   __rodata_start = .;
   *(.rodata)
   *(.rodata.*)
   *(.gnu.linkonce.r.*)
   __rodata_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.sdata2 : {
   . = ALIGN(8);
   __sdata2_start = .;
   *(.sdata2)
   *(.sdata2.*)
   *(.gnu.linkonce.s2.*)
   . = ALIGN(8);
   __sdata2_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.sbss2 : {
   __sbss2_start = .;
   *(.sbss2)
   *(.sbss2.*)
   *(.gnu.linkonce.sb2.*)
   __sbss2_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.data : {
   . = ALIGN(4);
   __data_start = .;
   *(.data)
   *(.data.*)
   *(.gnu.linkonce.d.*)
   __data_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.got : {
   *(.got)
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.got1 : {
   *(.got1)
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.got2 : {
   *(.got2)
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.eh_frame : {
   *(.eh_frame)
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.jcr : {
   *(.jcr)
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.gcc_except_table : {
   *(.gcc_except_table)
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.sdata : {
   . = ALIGN(8);
   __sdata_start = .;
   *(.sdata)
   *(.sdata.*)
   *(.gnu.linkonce.s.*)
   __sdata_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.sbss (NOLOAD) : {
   . = ALIGN(4);
   __sbss_start = .;
   *(.sbss)
   *(.sbss.*)
   *(.gnu.linkonce.sb.*)
   . = ALIGN(8);
   __sbss_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.tdata : {
   __tdata_start = .;
   *(.tdata)
   *(.tdata.*)
   *(.gnu.linkonce.td.*)
   __tdata_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.tbss : {
   __tbss_start = .;
   *(.tbss)
   *(.tbss.*)
   *(.gnu.linkonce.tb.*)
   __tbss_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.bss (NOLOAD) : {
   . = ALIGN(4);
   __bss_start = .;
   *(.bss)
   *(.bss.*)
   *(.gnu.linkonce.b.*)
   *(COMMON)
   . = ALIGN(4);
   __bss_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 );

_SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );

/* Generate Stack and Heap definitions */

.heap (NOLOAD) : {
   . = ALIGN(8);
   _heap = .;
   _heap_start = .;
   . += _HEAP_SIZE;
   _heap_end = .;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

.stack (NOLOAD) : {
   _stack_end = .;
   . += _STACK_SIZE;
   . = ALIGN(8);
   _stack = .;
   __stack = _stack;
} > ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR_ps7_ddr_0_S_AXI_HP0_BASEADDR_ps7_ddr_0_S_AXI_HP1_BASEADDR

_end = .;
}

附录2:zynq的完整ld文件

/*******************************************************************/
/*                                                                 */
/* This file is automatically generated by linker script generator.*/
/*                                                                 */
/* Version: Xilinx EDK 14.5 EDK_P.58f                                */
/*                                                                 */
/* Copyright (c) 2010 Xilinx, Inc.  All rights reserved.           */
/*                                                                 */
/* Description : Cortex-A9 Linker Script                          */
/*                                                                 */
/*******************************************************************/

_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x2000;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x2000;

_ABORT_STACK_SIZE = DEFINED(_ABORT_STACK_SIZE) ? _ABORT_STACK_SIZE : 1024;
_SUPERVISOR_STACK_SIZE = DEFINED(_SUPERVISOR_STACK_SIZE) ? _SUPERVISOR_STACK_SIZE : 2048;
_FIQ_STACK_SIZE = DEFINED(_FIQ_STACK_SIZE) ? _FIQ_STACK_SIZE : 1024;
_UNDEF_STACK_SIZE = DEFINED(_UNDEF_STACK_SIZE) ? _UNDEF_STACK_SIZE : 1024;

/* Define Memories in the system */

MEMORY
{
   ps7_ddr_0_S_AXI_BASEADDR : ORIGIN = 0x00100000, LENGTH = 0x0FF00000
   ps7_ram_0_S_AXI_BASEADDR : ORIGIN = 0x00000000, LENGTH = 0x00030000
   ps7_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x0000FE00
}

/* Specify the default entry point to the program */

ENTRY(_vector_table)

/* Define the sections, and where they are mapped in memory */

SECTIONS
{
.text : {
   *(.vectors)
   *(.boot)
   *(.text)
   *(.text.*)
   *(.gnu.linkonce.t.*)
   *(.plt)
   *(.gnu_warning)
   *(.gcc_execpt_table)
   *(.glue_7)
   *(.glue_7t)
   *(.vfp11_veneer)
   *(.ARM.extab)
   *(.gnu.linkonce.armextab.*)
} > ps7_ddr_0_S_AXI_BASEADDR

.init : {
   KEEP (*(.init))
} > ps7_ddr_0_S_AXI_BASEADDR

.fini : {
   KEEP (*(.fini))
} > ps7_ddr_0_S_AXI_BASEADDR

.rodata : {
   __rodata_start = .;
   *(.rodata)
   *(.rodata.*)
   *(.gnu.linkonce.r.*)
   __rodata_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.rodata1 : {
   __rodata1_start = .;
   *(.rodata1)
   *(.rodata1.*)
   __rodata1_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.sdata2 : {
   __sdata2_start = .;
   *(.sdata2)
   *(.sdata2.*)
   *(.gnu.linkonce.s2.*)
   __sdata2_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.sbss2 : {
   __sbss2_start = .;
   *(.sbss2)
   *(.sbss2.*)
   *(.gnu.linkonce.sb2.*)
   __sbss2_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.data : {
   __data_start = .;
   *(.data)
   *(.data.*)
   *(.gnu.linkonce.d.*)
   *(.jcr)
   *(.got)
   *(.got.plt)
   __data_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.data1 : {
   __data1_start = .;
   *(.data1)
   *(.data1.*)
   __data1_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.got : {
   *(.got)
} > ps7_ddr_0_S_AXI_BASEADDR

.ctors : {
   __CTOR_LIST__ = .;
   ___CTORS_LIST___ = .;
   KEEP (*crtbegin.o(.ctors))
   KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors))
   KEEP (*(SORT(.ctors.*)))
   KEEP (*(.ctors))
   __CTOR_END__ = .;
   ___CTORS_END___ = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.dtors : {
   __DTOR_LIST__ = .;
   ___DTORS_LIST___ = .;
   KEEP (*crtbegin.o(.dtors))
   KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors))
   KEEP (*(SORT(.dtors.*)))
   KEEP (*(.dtors))
   __DTOR_END__ = .;
   ___DTORS_END___ = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.fixup : {
   __fixup_start = .;
   *(.fixup)
   __fixup_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.eh_frame : {
   *(.eh_frame)
} > ps7_ddr_0_S_AXI_BASEADDR

.eh_framehdr : {
   __eh_framehdr_start = .;
   *(.eh_framehdr)
   __eh_framehdr_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.gcc_except_table : {
   *(.gcc_except_table)
} > ps7_ddr_0_S_AXI_BASEADDR

.mmu_tbl (ALIGN(16384)) : {
   __mmu_tbl_start = .;
   *(.mmu_tbl)
   __mmu_tbl_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.ARM.exidx : {
   __exidx_start = .;
   *(.ARM.exidx*)
   *(.gnu.linkonce.armexidix.*.*)
   __exidx_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.preinit_array : {
   __preinit_array_start = .;
   KEEP (*(SORT(.preinit_array.*)))
   KEEP (*(.preinit_array))
   __preinit_array_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.init_array : {
   __init_array_start = .;
   KEEP (*(SORT(.init_array.*)))
   KEEP (*(.init_array))
   __init_array_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.fini_array : {
   __fini_array_start = .;
   KEEP (*(SORT(.fini_array.*)))
   KEEP (*(.fini_array))
   __fini_array_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.ARM.attributes : {
   __ARM.attributes_start = .;
   *(.ARM.attributes)
   __ARM.attributes_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.sdata : {
   __sdata_start = .;
   *(.sdata)
   *(.sdata.*)
   *(.gnu.linkonce.s.*)
   __sdata_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.sbss (NOLOAD) : {
   __sbss_start = .;
   *(.sbss)
   *(.sbss.*)
   *(.gnu.linkonce.sb.*)
   __sbss_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.tdata : {
   __tdata_start = .;
   *(.tdata)
   *(.tdata.*)
   *(.gnu.linkonce.td.*)
   __tdata_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.tbss : {
   __tbss_start = .;
   *(.tbss)
   *(.tbss.*)
   *(.gnu.linkonce.tb.*)
   __tbss_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.bss (NOLOAD) : {
   __bss_start = .;
   *(.bss)
   *(.bss.*)
   *(.gnu.linkonce.b.*)
   *(COMMON)
   __bss_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR

_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 );

_SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );

/* Generate Stack and Heap definitions */

.heap (NOLOAD) : {
   . = ALIGN(16);
   _heap = .;
   HeapBase = .;
   _heap_start = .;
   . += _HEAP_SIZE;
   _heap_end = .;
   HeapLimit = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.stack (NOLOAD) : {
   . = ALIGN(16);
   _stack_end = .;
   . += _STACK_SIZE;
   _stack = .;
   __stack = _stack;
   . = ALIGN(16);
   _irq_stack_end = .;
   . += _STACK_SIZE;
   __irq_stack = .;
   _supervisor_stack_end = .;
   . += _SUPERVISOR_STACK_SIZE;
   . = ALIGN(16);
   __supervisor_stack = .;
   _abort_stack_end = .;
   . += _ABORT_STACK_SIZE;
   . = ALIGN(16);
   __abort_stack = .;
   _fiq_stack_end = .;
   . += _FIQ_STACK_SIZE;
   . = ALIGN(16);
   __fiq_stack = .;
   _undef_stack_end = .;
   . += _UNDEF_STACK_SIZE;
   . = ALIGN(16);
   __undef_stack = .;
} > ps7_ddr_0_S_AXI_BASEADDR

_end = .;
}
Clone this wiki locally