工具/软件:TI-RTOS
大家好、
我一直在开发使用 BeagleBone Black 的计算机视觉产品、并且一直在开发用于获取帧并将其写入 RAM 的 PRU 代码。 我让 PRU 代码独立于 TI-RTOS 工作、我正在思考如何将代码集成到 TI-RTOS 中。 我已使 HexPRU 实用程序正常工作、就我所能说的那样。 我找到了显示如何完成 由 hexpru 实用程序生成的 obj 文件链接的 TI 链接器文件、但它使用 TI 编译器/链接器、而我创建的项目使用 GCC。 我希望重新计算链接器文件比重写我的项目所依赖的库的编译系统更容易。 我要发布的 lds 文件如下、它主要是锅炉板连接器文件。
内存
{
SRAM: O = 0x402F0400、l = 0x0000FC00 // 64KB 内部 SRAM */
L3OCMC0:o = 0x40300000、l = 0x00010000 // 64KB L3 OCMC SRAM */
M3SHUMEM:o = 0x44D00000,l = 0x00004000 // 16kB M3共享统一代码空间*/
M3SHDMEM:o = 0x44D80000,l = 0x00002000 // 8kB M3共享数据存储器*/
DDR0: o = 0x8000000、l = 0x20000000 // 256MB 外部 DDR 组0 */
}//
链接器脚本,用于放置段和符号值。 应*
与定义存储器区域 DDR0的其他链接器脚本一起使用。
*它引用了以下符号,这些符号必须在代码中定义:
* entry:entry of reset handler
*
它定义了以下符号,这些符号可以在没有定义的情况下使用:
*__exidx_start
*__exidx_end
*__etext
*__data_start__
*__preinit_array_start
*__preinit_array_end
*__init_array_start
*__init_array_end *__init_array_end
*__fini_array_start
*___limi_array_end
*___bss_end______en__enss_en____en___en___en__en__en___en___en___en___en___en______en__en___en____en___
-与 Linaro 的半主机支持*
__StackLimit
*__StackTop
*__StackBase 兼容-与 Linaro 的半主机支持
*__stack
*/
entry (entry)
SECTIONS
{兼容
速记:
{
。 =对齐(0x10000);
Keep (*(.isr_vector))
*STARTUP_ARMCA8.o (.text)
} > DDR0
。 =对齐(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。*))
*(.ditors)
*(.rodata*)
Keep (*(.eh_FRAME*))
} > DDR0
arm.extab:
{
*(.arm.extab*.gnu.linkone.armextab.*)
} > DDR0
_exidx_start =.;
arm.exidx:
{
*(.arm.exidx*.gnu.linkone.armexidx.*)
} > DDR0
_exidx_end =.;
.data:
{
。 =对齐(4);
__data_start__=.;
*(VTABLE)
*(.data*)
。 =对齐(4);
/*预初始化数据*/
Provide_hidden (__preinit_array_start =.);
Keep (*(.preinit_array))
Provide_hidden (__preinit_array_end =.);
。 =对齐(4);
/*初始化数据*/
Provide_hidden (__init_array_start =.);
Keep (*(sort (.init_array。*)))
Keep (*(.init_array))
Provide_hidden (__init_array_end =.);
。 =对齐(4);
/* finit 数据*/
Provide_hidden (__fini_array_start =.);
Keep (*(sort (.fini_array。*)))
Keep (*(.fini_array))
Provide_hidden (__fini_array_end =.);
。 =对齐(4);
/*所有数据结束*/
__DATA_END__=;
} > DDR0
.bss:
{
。 =对齐(4);
_bss_start__=.;
*(.bss*)
*(通用)
__bss_end__=;
} > DDR0
堆(NoLoad):
{
/*下面的行可用于用已知值和填充存储器
*调试任何堆栈溢出。 为使其正常工作、请参见上面的说明符(NoLoad)
必须删除*、但代价是输出二进制大小增加*/
Fill (0xDEADBEF)
。 =对齐(4);
__end__=.;
结束=__end__;
/*下面创建的行与 Linaro 的半主机支持兼容*/
__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
(.ramdata):{PRURAM0)
/*.stack 段不包含任何符号。 只是这样
*用于链接器计算堆栈段的大小并进行分配
*值到稍后堆栈符号*/
.stack (NoLoad):
{
/*下面的行可用于用已知值和填充存储器
*调试任何堆栈溢出。 为使其正常工作、请参见上面的说明符(NoLoad)
必须删除*、但代价是输出二进制大小增加*/
填充(0xBAD0BAD0)
。 =对齐(4);
__StackLimit=. ;
*(.stack*)
。 =。 + STACKSIZE;
_StackTop =。 ;
/*下面创建的行与 Linaro 的半主机支持兼容*/
__StackBase =。 ;
} > DDR0
提供(__stack =__StackTop);
}
然后、我引用包含数据和指令文件的段、该文件(我希望)将包含 PRU 的数据和指令 RAM。
const unsigned char __attribute__(((section ("framegrabber_text"))) framegrabber_inst[0x1000];
const unsigned char __attribute__((section ("framegrabber_data"))) framegrabber_writer [0x1000];
const ramchar __attribute_("0x1000_)("ramramram_attribute_)("0x1000_write_)[0x1000_writer_write_(
"0x1000)("ramramramram_write_)[0x1000_write_)(")("ramramramram_write_)(0x1000)
在所有这些文件的末尾、我会得到以下错误:
在[800000008001727b]加载的段 framegrabber_text 与在[800000008001727b]加载的段.text 重叠
我假设这是其余部分的错误。 是否有人知道如何修复此错误? 我已经能够将以前的 E2E 帖子和其他资源中的各种修复粘贴到一起、但我对 GCC 链接器脚本不了解、因此我觉得我在这里有点偏离我的联盟。 感谢您的任何帮助。 此外、这是我在这里发布的第一篇文章、因此如果这是错误的地方、请告诉我。
在