This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM5749:由 Remoteproc 加载到 L2SRAM 段的 DSP 固件

Guru**** 654100 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1199695/am5749-dsp-firmware-loaded-to-l2sram-segment-by-remoteproc

器件型号:AM5749

您好!

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