您好!
我尝试移植最初开发为 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