Tool/software: TI-RTOS
Hello all,
I have been working on a computer vision product that uses the BeagleBone Black, and I've been developing PRU code that grabs frames and writes it to RAM. I have the PRU code working independently from ti-rtos and I am figuring out how to integrate the code into ti-rtos. I have got the HexPRU utility working correctly, as far as I can tell. I found the TI Linker file that shows how to accomplish the linking of the obj files generated by the hexpru utility, but it uses the TI compiler/linker and the project I am creating uses GCC. I'm hoping it would be easier to refactor the linker file than it would be to rewrite the build system for the libraries that my project depends on. The lds file that I have going is posted below, its mostly the boiler plate linker file.
MEMORY
{
SRAM : o = 0x402F0400, l = 0x0000FC00 /* 64kB internal SRAM */
L3OCMC0 : o = 0x40300000, l = 0x00010000 /* 64kB L3 OCMC SRAM */
M3SHUMEM : o = 0x44D00000, l = 0x00004000 /* 16kB M3 Shared Unified Code Space */
M3SHDMEM : o = 0x44D80000, l = 0x00002000 /* 8kB M3 Shared Data Memory */
DDR0 : o = 0x80000000, l = 0x20000000 /* 256MB external DDR Bank 0 */
}
/* Linker script to place sections and symbol values. Should be used together
* with other linker script that defines memory region DDR0.
* It references following symbols, which must be defined in code:
* Entry : Entry of reset handler
*
* It defines following symbols, which code can use without definition:
* __exidx_start
* __exidx_end
* __etext
* __data_start__
* __preinit_array_start
* __preinit_array_end
* __init_array_start
* __init_array_end
* __fini_array_start
* __fini_array_end
* __data_end__
* __bss_start__
* __bss_end__
* __end__
* end
* __HeapLimit
* __HeapBase - To be compatible with Linaro's semihosting support
* __StackLimit
* __StackTop
* __StackBase - To be compatible with Linaro's semihosting support
* __stack
*/
ENTRY(Entry)
SECTIONS
{
.rsthand :
{
. = ALIGN(0x10000);
KEEP(*(.isr_vector))
*startup_ARMCA8.o (.text)
} > DDR0
. = ALIGN(4);
.text :
{
*(.text*)
KEEP(*(.init))
KEEP(*(.fini))
/* .ctors */
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT(.ctors.*))
*(.ctors)
/* .dtors */
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT(.dtors.*))
*(.dtors)
*(.rodata*)
KEEP(*(.eh_frame*))
} > DDR0
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > DDR0
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > DDR0
__exidx_end = .;
.data :
{
. = ALIGN(4);
__data_start__ = .;
*(vtable)
*(.data*)
. = ALIGN(4);
/* preinit data */
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP(*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
/* init data */
PROVIDE_HIDDEN (__init_array_start = .);
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
/* finit data */
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
/* All data end */
__data_end__ = .;
} > DDR0
.bss :
{
. = ALIGN(4);
__bss_start__ = .;
*(.bss*)
*(COMMON)
__bss_end__ = .;
} > DDR0
.heap (NOLOAD):
{
/* The line below can be used to FILL the memory with a known value and
* debug any stack overruns. For this to work, the specifier (NOLOAD) above
* must be removed at the expense of an increase in the output binary size */
FILL(0xDEADBEEF)
. = ALIGN(4);
__end__ = .;
end = __end__;
/* The line below created to be compatible with Linaro's semihosting support */
__HeapBase = __end__;
*(.heap*)
. = . + HEAPSIZE;
__HeapLimit = .;
} > DDR0
framegrabber_text :
{
PRU1_framegrabber.obj(.text);
} > DDR0
framegrabber_data :
{
PRU1_framegrabber.obj(.data);
} > DDR0
ramwriter_text :
{
PRU0_ramwriter.obj(.text);
} > DDR0
ramwriter_data :
{
PRU0_ramwriter.obj(.data);
} > DDR0
/* .stack section doesn't contain any symbols. It is only
* used for linker to calculate size of stack sections, and assign
* values to stack symbols later */
.stack (NOLOAD):
{
/* The line below can be used to FILL the memory with a known value and
* debug any stack overruns. For this to work, the specifier (NOLOAD) above
* must be removed at the expense of an increase in the output binary size */
FILL(0xBAD0BAD0)
. = ALIGN(4);
__StackLimit = . ;
*(.stack*)
. = . + STACKSIZE;
__StackTop = . ;
/* The line below created to be compatible with Linaro's semihosting support */
__StackBase = . ;
} > DDR0
PROVIDE(__stack = __StackTop);
}
I then reference the sections that contain the data and instruction files in a file that (I'm hoping) will contain the data and instruction ram for the PRUs.
const unsigned char __attribute__ ((section ("framegrabber_text"))) framegrabber_inst [0x1000];
const unsigned char __attribute__ ((section ("framegrabber_data")))framegrabber_ram [0x1000];
const unsigned char __attribute__ ((section ("ramwriter_text")))ramwriter_inst [0x1000];
const unsigned char __attribute__ ((section ("ramwriter_data")))ramwriter_ram [0x1000];
At the end of all of it, I get the following error:
section framegrabber_text loaded at [80000000,80000fff] overlaps section .text loaded at [80000000,8001727b]
I assume that this is an error with the rest of the sections. Does anyone know how to fix this error? I've been able to paste together various fixes from previous E2E posts and other resources but I am newish to the GCC linker script, so I feel I'm a bit out of my league here. Any help is appreciated. Also, this is my first post here so if this is in the wrong place, let me know.
At