您好!
我尝试移植最初开发为 BareMetal 应用程序(不带 TI-RTOS)的 C66 DSP 固件、并且与 ARM 内核上正在运行的 Linux OS 不兼容。
此固件基于 TI 演示、其中初始化了所有板级支持(pinmux、DDR 等)。
此外、不支持 IPC 堆栈和 Remoteproc 支持、因为 TI-RTOS 是 TI IPC 3.x 堆栈所必需的独立软件。
此初始固件包含一些我需要注意的时间关键型(低延迟)代码。
由于需要 TI-RTOS 和 IPC 3.x 堆栈、因此我从"big-data-IPC-examples"项目开始。
目前、我不需要 CMEM API 支持在 ARM 和 DSP 之间共享更多内存、因此我删除了所有 CMEM 初始化和现在的代码
对于 ipcdev 测试程序中的 MessageQApp.c 示例、基本看起来更像、但具有自定义的 resource_table。
我注意到、"大数据 IPC-Examples"编译系统生成的链接器文件与 BareMetal 工程中的手写链接器文件完全不同。
实际上、大多数位于 DSP L2SRAM 上的裸机固件部分、但"大数据 IPC-Examples"使用 DDR。
由于时序限制、首选使用 L2SRAM。
下面是 BareMetal 链接器(.cmd)脚本的摘录:
SECTIONS
{
BOARD_IO_DELAY_DATA : load > L2SRAM
BOARD_IO_DELAY_CODE : load > L2SRAM
.csl_vect : > RST_START
GROUP: load > L2SRAM
{
.bss:
.neardata:
.rodata:
}
.vects > L2SRAM
.l2_int > L2SRAM
.pmIdleFunc > L2SRAM
.text:_c_int00 > L2SRAM
.text:_isr > L2SRAM
.text > L2SRAM
.bss > L2SRAM
.data > L2SRAM
.sysmem > L2SRAM
.stack > L2SRAM
.cinit > L2SRAM
.const > L2SRAM
.cio > L2SRAM
.testData > L2SRAM
.init_array > L2SRAM
.init > L2SRAM
.far > L2SRAM
.plt > L2SRAM
.fardata > L2SRAM
.switch > L2SRAM
}
现在生成的 linker.cmd 如下所示:
MEMORY
{
L2SRAM (RWX) : org = 0x800000, len = 0x48000
OCMC_RAM1 (RWX) : org = 0x40300000, len = 0x80000
OCMC_RAM2 (RWX) : org = 0x40400000, len = 0x100000
OCMC_RAM3 (RWX) : org = 0x40500000, len = 0x100000
EXT_CODE (RWX) : org = 0x95000000, len = 0x100000
EXT_DATA (RW) : org = 0x95100000, len = 0x100000
EXT_HEAP (RW) : org = 0x95200000, len = 0x300000
TRACE_BUF (RW) : org = 0x9f000000, len = 0x60000
EXC_DATA (RW) : org = 0x9f060000, len = 0x10000
PM_DATA (RWX) : org = 0x9f070000, len = 0x20000
}
SECTIONS
{
.text: load >> EXT_CODE
.ti.decompress: load > EXT_CODE
.stack: load > EXT_DATA
GROUP: load > EXT_DATA
{
.bss:
.neardata:
.rodata:
}
.cinit: load > EXT_DATA
.pinit: load >> EXT_DATA
.init_array: load > EXT_DATA
.const: load >> EXT_DATA
.data: load >> EXT_DATA
.fardata: load >> EXT_DATA
.switch: load >> EXT_DATA
.sysmem: load > EXT_DATA
.far: load >> EXT_DATA
.args: load > EXT_DATA align = 0x4, fill = 0 {_argsize = 0x64; }
.cio: load >> EXT_DATA
.ti.handler_table: load > EXT_DATA
.c6xabi.exidx: load > EXT_DATA
.c6xabi.extab: load >> EXT_DATA
.tracebuf: load > EXT_DATA
.resource_table: load > 0x40800000, type = NOINIT
.vecs: load > EXT_CODE
xdc.meta: load > EXT_DATA, type = COPY
}
实际上、EXT_CODE、EXT_DATA 和 EXT_HEAP 是指 DDR 存储器。
您是否认为可以使用 L2SRAM 而不是 DDR?
我们还希望使 IPC 堆栈与 Linux 配合使用。
AFIK、我需要自定义(或删除?) 来自 config.Bld 的 externalMemoryMap
并自定义 resource_table 以将 L2SRAM 地址用于 DSP_MEM_text、
DSP_MEM_DATA、DSP_MEM_HEAP0、DSP_MEM_HEAP1。
Remoteproc 驱动程序是否能够使用段将 DSP 固件加载到 L2SRAM?
[1] https://git.ti.com/cgit/processor-sdk/big-data-ipc-examples/tree/host_linux/simple_buffer_example/shared/DRA7XX/config.bld?h=01.03.00.00#n51
此致、
Romain