This lab was mostly more familiarization with the SDK.
The lab goals were stated as follows:
Add new software applications to SDK
Use example code to target the UART in a Hello World application
Apply example project templates, including
Memory Tests
Peripheral Tests
Identify application code size and location
Modify linker scripts to change the target memory location
So we started out by creating an empty application, then bringing in source from the examples linked in the Board Support Package that we generated in the previous lab.We then looked at the output of the compilation,
the types of files generated, an the size of the file generated.
We took a look at the linker script, lscript.ld, this is the file that contains all of the memory mapping for the project, and this is always chip specific. I remember a few years ago, when I was first starting out programming arm chips, this file,
which is essential was very difficult to find for many chips, so you would have to make it on your own, often wrong.
/*******************************************************************/ /* */ /* This file is automatically generated by linker script generator.*/ /* */ /* Version: */ /* */ /* Copyright (c) 2010-2016 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 : 0x0; _ABORT_STACK_SIZE = DEFINED(_ABORT_STACK_SIZE) ? _ABORT_STACK_SIZE : 1024; _SUPERVISOR_STACK_SIZE = DEFINED(_SUPERVISOR_STACK_SIZE) ? _SUPERVISOR_STACK_SIZE : 2048; _IRQ_STACK_SIZE = DEFINED(_IRQ_STACK_SIZE) ? _IRQ_STACK_SIZE : 1024; _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 { axi_bram_ctrl_0_Mem0 : ORIGIN = 0x40000000, LENGTH = 0x2000 ps7_ddr_0 : ORIGIN = 0x100000, LENGTH = 0x1FF00000 ps7_qspi_linear_0 : ORIGIN = 0xFC000000, LENGTH = 0x1000000 ps7_ram_0 : ORIGIN = 0x0, LENGTH = 0x30000 ps7_ram_1 : ORIGIN = 0xFFFF0000, LENGTH = 0xFE00 } /* Specify the default entry point to the program */ ENTRY(_vector_table) /* Define the sections, and where they are mapped in memory */ SECTIONS { .text : { KEEP (*(.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_ram_0 .init : { KEEP (*(.init)) } > ps7_ram_0 .fini : { KEEP (*(.fini)) } > ps7_ram_0 .rodata : { __rodata_start = .; *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) __rodata_end = .; } > ps7_ram_0 .rodata1 : { __rodata1_start = .; *(.rodata1) *(.rodata1.*) __rodata1_end = .; } > ps7_ram_0 .sdata2 : { __sdata2_start = .; *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) __sdata2_end = .; } > ps7_ram_0 .sbss2 : { __sbss2_start = .; *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) __sbss2_end = .; } > ps7_ram_0 .data : { __data_start = .; *(.data) *(.data.*) *(.gnu.linkonce.d.*) *(.jcr) *(.got) *(.got.plt) __data_end = .; } > ps7_ram_0 .data1 : { __data1_start = .; *(.data1) *(.data1.*) __data1_end = .; } > ps7_ram_0 .got : { *(.got) } > ps7_ram_0 .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_ram_0 .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_ram_0 .fixup : { __fixup_start = .; *(.fixup) __fixup_end = .; } > ps7_ram_0 .eh_frame : { *(.eh_frame) } > ps7_ram_0 .eh_framehdr : { __eh_framehdr_start = .; *(.eh_framehdr) __eh_framehdr_end = .; } > ps7_ram_0 .gcc_except_table : { *(.gcc_except_table) } > ps7_ram_0 .mmu_tbl (ALIGN(16384)) : { __mmu_tbl_start = .; *(.mmu_tbl) __mmu_tbl_end = .; } > ps7_ram_0 .ARM.exidx : { __exidx_start = .; *(.ARM.exidx*) *(.gnu.linkonce.armexidix.*.*) __exidx_end = .; } > ps7_ram_0 .preinit_array : { __preinit_array_start = .; KEEP (*(SORT(.preinit_array.*))) KEEP (*(.preinit_array)) __preinit_array_end = .; } > ps7_ram_0 .init_array : { __init_array_start = .; KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array)) __init_array_end = .; } > ps7_ram_0 .fini_array : { __fini_array_start = .; KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array)) __fini_array_end = .; } > ps7_ram_0 .ARM.attributes : { __ARM.attributes_start = .; *(.ARM.attributes) __ARM.attributes_end = .; } > ps7_ram_0 .sdata : { __sdata_start = .; *(.sdata) *(.sdata.*) *(.gnu.linkonce.s.*) __sdata_end = .; } > ps7_ram_0 .sbss (NOLOAD) : { __sbss_start = .; *(.sbss) *(.sbss.*) *(.gnu.linkonce.sb.*) __sbss_end = .; } > ps7_ram_0 .tdata : { __tdata_start = .; *(.tdata) *(.tdata.*) *(.gnu.linkonce.td.*) __tdata_end = .; } > ps7_ram_0 .tbss : { __tbss_start = .; *(.tbss) *(.tbss.*) *(.gnu.linkonce.tb.*) __tbss_end = .; } > ps7_ram_0 .bss (NOLOAD) : { __bss_start = .; *(.bss) *(.bss.*) *(.gnu.linkonce.b.*) *(COMMON) __bss_end = .; } > ps7_ram_0 _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_ram_0 .stack (NOLOAD) : { . = ALIGN(16); _stack_end = .; . += _STACK_SIZE; . = ALIGN(16); _stack = .; __stack = _stack; . = ALIGN(16); _irq_stack_end = .; . += _IRQ_STACK_SIZE; . = ALIGN(16); __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_ram_0 _end = .; }
The main purpose of the linker script is to describe how the sections in the input files should be mapped
into the output file, and to control the memory layout of the output file.
The second experiment was to add peripheral tests and study the files included. We had built this project as part of the hardware labs as well. This was a more thorough inspection of the generated files.
The third experiment was the memory test example, like the peripheral test, this was one we did in the HW module, we just went in and looked at the files and examined what would happen in we moved some of the memory regions around.
Oddly, we did not execute any of these examples on the board. It will be interesting to see what lab 5 brings.
See you then.
Top Comments