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.

[参考译文] J722SXH01EVM:使 tisp/dmautils 与 FreeRTOS 配合使用时出现问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1432606/j722sxh01evm-issues-getting-tisp-dmautils-to-work-with-freertos

器件型号:J722SXH01EVM
主题:SysConfig 中讨论的其他器件

工具/软件:

您好:

我利用 tisp 在 c7x 上开发了一个基本的裸机应用程序来测试硬件并开发我们的算法。 这一直可以正常工作、但现在我需要使用 Linux 主机实现 IPC、并且似乎需要 FreeRTOS、尽管我更倾向于使用裸机模式。 (NoRTOS 缺少库)

要迁移到 RTOS、我要做的第一步是加入库、由于入口点的原因、这要求我更改链接器文件以包含 MMU 和 BSS 的一些内容。 我使用示例中的参考。 FreeRTOS 入口点似乎与 SysConfig 生成的 ti_DPL_config.c 中的 MMU 配置有一定的依赖关系。 我也包含该文件

随着这些更改的实施、我的项目再次构建、主函数像以前一样运行、但 TISP (特别是 DRU 的使用)被破坏。 检查传输完成的循环现在会一直挂起。

特别是、DmaUtilsAutoInc3d_wait ()的这一行将永久挂起:
while ((eflRegisterVal & waitWord)!= waitWord){

我的 main 函数没有任何变化-唯一的变化是添加了 FreeRTOS 库、调整入口点、以及相关链接器的更改。 作为参考、以下是我的旧链接器文件:

-heap  0xF0000   // 756 kB
-stack 0x4000    //  16 kB
--cinit_compression=off
--args 0x1000
--diag_suppress=10068 // "no matching section"

MEMORY
{

  L2SRAM_CINIT (RWX)  : org = 0x7E000000, len = 0x000100 //for 256byte init     c7x_0 = 7E000000, c7x_1 = 7E200000
  L2SRAM (RWX)        : org = 0x7E000100, len = 0x1fff00 //for 2MBytes  EL2
  L2SRAMAUX   (RWX): org = 0x7F000000, len = 0x040000   // for 256 KBytes J7AEN c7x_0 = 7F000000, c7x_1 = 7F800000

  EXTMEM_STATIC   (RWX): org = 0x80000000, len = 0x4000000
  EXTMEM          (RWX): org = 0x84000000, len = 0x200000

}

SECTIONS
{
  .sram_start START(_sram_start) > L2SRAM NOINIT

//  .kernel: {
//    *.obj (.text:optimized) { SIZE(_kernel_size) }
//  } > EXTMEM

//  .kernel_data SIZE(_data_size)
  .l2mem            > L2SRAM
  .l1dmemory        > L2SRAM
  .l2dmemory        > L2SRAM
  .text:            > L2SRAM
  .text:touch:      > L2SRAM
  .text:_c_int00:   > L2SRAM_CINIT
  .neardata:        > L2SRAM
  .rodata:          > L2SRAM
  .bss:             > L2SRAM
  .init_array:      > L2SRAM
  .far:             > L2SRAM
  .fardata:         > L2SRAM
  .neardata         > L2SRAM
  .rodata           > L2SRAM
  .data:            > L2SRAM
  .switch:          > L2SRAM
  .args:            > L2SRAM align = 0x4, fill = 0 {_argsize = 0x200; }
  .sysmem:          > L2SRAM
  .cinit:           > EXTMEM
  .const:           > L2SRAM START(const_start) SIZE(const_size)
  .pinit:           > L2SRAM
  .cio:             > L2SRAM
  .stack:           > L2SRAM
  .ddrData          > EXTMEM_STATIC
  .staticData       > EXTMEM_STATIC
  .l2sramaux        > L2SRAMAUX
  xdc.meta:        > L2SRAM, type = COPY
}

这是新的链接器文件。 这基本上是直接从一个例子,但我扩大了堆,并将大多数本地程序数据移动到 SRAM

--ram_model
-heap  0x20000
-stack 0x20000
--args 0x1000
--diag_suppress=10068 /* to suppress no matching section error */
--cinit_compression=off
-e _c_int00_secure

#define DDR0_ALLOCATED_START  0xA3000000

#define C7X_ALLOCATED_START DDR0_ALLOCATED_START

#define C7X_RESOURCE_TABLE_BASE (C7X_ALLOCATED_START + 0x00100000)
#define C7X_IPC_TRACE_BUFFER    (C7X_ALLOCATED_START + 0x00100400)
#define C7X_BOOT_BASE           (C7X_ALLOCATED_START + 0x00200000)
#define C7X_VECTOR_BASE         (C7X_ALLOCATED_START + 0x00400000)
#define C7X_DDR_SPACE_BASE      (C7X_ALLOCATED_START + 0x00410000)

MEMORY
{
    L2SRAM (RWX):  org = 0x7E000000,                len = 0x200000
    DDR0_RESERVED: org = 0x80000000,                len = 0x19800000         /*  Reserved for A53 OS */
    C7X_IPC_D:     org = C7X_ALLOCATED_START,       len = 0x00100000         /*  1MB DDR */
    C7X_BOOT_D:    org = C7X_BOOT_BASE,             len = 0x400              /*  1024B DDR */
    C7X_VECS_D:    org = C7X_VECTOR_BASE,           len = 0x4000             /*  16KB DDR */
    C7X_CIO_MEM:   org = C7X_DDR_SPACE_BASE,        len = 0x1000             /*  4KB */
    C7X_DDR_SPACE: org = C7X_DDR_SPACE_BASE+0x1000, len = 0x00BF0000-0x1000  /*  11.9MB - 4KB DDR  */
    /* For resource table */
    C7X_RT_D:      org = C7X_RESOURCE_TABLE_BASE, len = 0x400         /*  1024B DDR */
    /* IPC trace buffer */
    LINUX_IPC_TRACE_BUFFER: org = C7X_IPC_TRACE_BUFFER, len = 0xFFC00 /* 1023KB DDR */
    LOG_SHM_MEM             : ORIGIN = 0xA7000000, LENGTH = 0x40000
    /* Shared memory for RTOS NORTOS IPC */
    RTOS_NORTOS_IPC_SHM_MEM: org = 0xA5000000, len = 0x1C00000  /* 8MB DDR */
}

SECTIONS
{
    boot:
    {
      boot.*<boot.oe71>(.text)
    } load > C7X_BOOT_D
    .vecs       >       C7X_VECS_D
    .secure_vecs    >   C7X_DDR_SPACE ALIGN(0x100000)
    .text:_c_int00_secure > C7X_DDR_SPACE ALIGN(0x200000)
    .text       >       C7X_DDR_SPACE ALIGN(0x100000)

    .bss        >       L2SRAM  /* Zero-initialized data */
    RUN_START(__BSS_START)
    RUN_END(__BSS_END)

	.l2mem		>		L2SRAM
	.ddrData	>		C7X_DDR_SPACE
    .data       >       L2SRAM  /* Initialized data */

    .cinit      >       L2SRAM  /* could be part of const */
    .init_array >       L2SRAM  /* C++ initializations */
    .stack      >       L2SRAM ALIGN(0x2000)
    .args       >       L2SRAM
    .cio        >       C7X_CIO_MEM
    .const      >       L2SRAM
    .switch     >       L2SRAM /* For exception handling. */
    .sysmem     >       L2SRAM /* heap */

    GROUP:              >  C7X_DDR_SPACE
    {
        .data.Mmu_tableArray          : type=NOINIT
        .data.Mmu_tableArraySlot      : type=NOINIT
        .data.Mmu_level1Table         : type=NOINIT
        .data.gMmu_tableArray_NS       : type=NOINIT
        .data.Mmu_tableArraySlot_NS   : type=NOINIT
        .data.Mmu_level1Table_NS      : type=NOINIT
    }

    .benchmark_buffer:     > C7X_DDR_SPACE ALIGN (32)

    /* This is the resource table used by linux to know where the IPC "VRINGs" are located */
    .resource_table: { __RESOURCE_TABLE = .;} > C7X_RT_D
    /* This IPC log can be viewed via ROV in CCS and when linux is enabled, this log can also be viewed via linux debugfs */
    .bss.debug_mem_trace_buf    : {} palign(128)    > LINUX_IPC_TRACE_BUFFER
    /* this is used when Debug log's to shared memory is enabled, else this is not used */
    .bss.log_shared_mem  (NOLOAD) : {} > LOG_SHM_MEM
    /* this is used only when IPC RPMessage is enabled */
    .bss.ipc_vring_mem   (NOLOAD) : {} > RTOS_NORTOS_IPC_SHM_MEM
}

我唯一猜的是、这可能与 MMU 有关、但我不知道。 感谢您提供任何帮助。

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

    您好、Tyler、

    首先、J722S 没有经过验证和支持的 TISP、因此到目前为止、您已经具备的所有功能都非常出色。 但是、您尝试的操作未经 TI 团队验证、如果您希望 IPC 与 Linux 配合使用、则必须使用适用于 J722S 的 TI PSDK RTOS 版本和 FreeRTOS。  

    此外、TI PSDK RTOS 不支持 NoRTOS/裸机支持。

    谢谢。

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

    显然我不应该提到 TISP、因为它与当前的问题无关。

    我正在尝试让 DMAUtils 在 FreeRTOS 下工作、TI 肯定会支持这一功能、因为您在如何使用 DRU 方面没有给予其他支持。

    让我描述一下问题、我将包括显示问题的源代码、而不包括任何 TISP

    我遇到的第一个问题是、驱动程序 lib 和 dmautils lib 中有 UDMA.c 的冲突副本、因此为了构建程序、我必须从其中一个库中删除其中一个 UDMA.c。 它们显然是非常不同的实现,所以奇怪的是,它们都提供在同一个包。 DMAUtils 下的一个文件包括对 DRU 的支持、因此我将其中一个文件包括在内、并从 drivers.lib makefile 文件中注释另一个文件。

    现在编译工作正常、我可以运行一个触发 DRU 并等待 DRU 完成的简单程序(如下所示)。 这在没有 FreeRTOS 的情况下正常工作。

    __attribute__((section(".ddrData"), aligned(128))) uint8_t ddrBuffer[DDR_SIZE];
    
    
    
    
    __attribute__((section(".l2mem"), aligned(128))) float pInputBlock[128*16*2];
    __attribute__((section(".l2mem"), aligned(128))) float pOutputBlock[128*16*2];
    
    
    
    Udma_DrvHandle udmaHandle;
    int main() {
        printf("Starting program\r\n");
    
        struct Udma_DrvObj udmaDrvObj;
    
        Udma_InitPrms initPrms;
    
        uint32_t instId;
        uint32_t retVal;
    
        Udma_DrvHandle drvHandle = &udmaDrvObj;
    
        instId = UDMA_INST_ID_MAIN_0;
        UdmaInitPrms_init(instId, &initPrms);
        initPrms.printFxn     = &testDmaAutoIncPrintf;
        initPrms.virtToPhyFxn = &testDmaAutoIncVirtToPhyFxn;
        retVal = Udma_init(drvHandle, &initPrms);
    
        if (UDMA_SOK != retVal) {
           printf("[Error] UDMA init failed!!\n");
        }
    
        udmaHandle = drvHandle;
    
        int numChannels = 2;
        uint8_t *pTrMemCh[2];
        int32_t  chIdIn[2];  // Input channel IDs
        int32_t  chIdOut[2]; // Output channel IDs
        uint8_t *dmaUtilsContext = (uint8_t *) memalign(128, DmaUtilsAutoInc3d_getContextSize(numChannels));
    
    
    
        for (size_t ch = 0; ch < numChannels; ch++) {
           pTrMemCh[ch] = (uint8_t *) memalign(128, DmaUtilsAutoInc3d_getTrMemReq(1));
        }
    
        retVal = dmaUtils<float>::init(dmaUtilsContext, numChannels, udmaHandle);
    
        if (retVal != UDMA_SOK) {
           printf("[Error] UDMA init failed!!\n");
        }
    
        uint32_t transferSize = DMAUTILSAUTOINC3D_SYNC_2D;
        DmaUtilsAutoInc3d_TransferDim transferDimIn;  /*!< Structure to hold transfer properties of input DMA channel */
        DmaUtilsAutoInc3d_TransferDim transferDimOut; /*!< Structure to hold transfer properties of output DMA channel */
    
        /***********************/
        /* Configure input DMA */
        /***********************/
    
        // set transfer dimenssion structure
        dmaUtils<float>::dmaAutoIncSetupXferPropIn2D(128, 128, 128, 16, 128*sizeof(double), 128*sizeof(double),
                                                       &transferDimIn);
        // assign channel number
        chIdIn[0] = 0;
        /* chIdIn[0] = dmaChOffset::globalChOffset; */
        /* dmaChOffset::globalChOffset += 1; */
    
        // configure channel
        retVal = dmaUtils<float>::configure_channel(dmaUtilsContext, chIdIn[0], pTrMemCh, (uint8_t *) ddrBuffer,
                                                      (uint8_t *) pInputBlock, transferSize, &transferDimIn);
    
        if (retVal != UDMA_SOK) {
           printf("[Error] UDMA init failed!!\n");
        }
    
        /***********************/
        /* Configure output DMA */
        /***********************/
    
        // set transfer dimenssion structure
        dmaUtils<float>::dmaAutoIncSetupXferPropOut2D(128, 128, 128, 16, 128*sizeof(double), 128*sizeof(double),
                                                         &transferDimOut);
        // assign channel number
        chIdOut[0] = 1;
        /* chIdOut[0] = dmaChOffset::globalChOffset; */
        /* dmaChOffset::globalChOffset += 1; */
    
        // configure channel
        retVal = dmaUtils<float>::configure_channel(dmaUtilsContext, chIdOut[0], pTrMemCh, (uint8_t *) pOutputBlock,
                                                       (uint8_t *) ddrBuffer, transferSize, &transferDimOut);
    
        if (retVal != UDMA_SOK) {
           printf("[Error] UDMA init failed!!\n");
        }
    
        dmaUtils<float>::trigger(dmaUtilsContext, chIdIn, 1);
    
        dmaUtils<float>::wait(dmaUtilsContext, chIdIn, 1);
    
    
        printf("Goodbye\n");
    
    
    }

    现在、如果我包括 FreeRTOS 库`freertos.j722s.c75x.ti-c7000.debug.lib`、编译将会中断、因为我的入口点是_c_int00 -如果我将其更改为_c_int00 _secure、它将再次编译、但程序现在会在最后一个"等待"行中挂起

    请帮助我了解这里出了什么问题。 "我们不支持它"或"未经验证"不会飞-能够使用 DRU 是在该处理器上运行的任何 DSP 应用的基础。 如果我采取了错误的方法,请告诉我。 我正在使用"ipc_rpmsg_echo_linux"应用程序作为基准、我知道该应用程序可以正常工作、并可以与 Linux 进行通信。

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

    只是为了增加一些我的怀疑-

    我找到了 _c_int00_secure 的源代码、据我所知、它只能调用 MmuP_init ()、这表明我的 MMU 配置正在中断 DRU

    我找不到有关 DRU 工作原理或 DRU 如何连接到 MMU 的任何合理文档。 我的 MMU 配置提供对所需 SRAM 和 DDR 区域的 c7x 访问、以及对 DRU 寄存器空间的访问。 我能够执行与 DRU 使用 for 循环从 c7x 尝试的相同复制操作、它成功了。

    如果我从 MMU 配置中删除这三个区域中的任何一个、程序将崩溃或拒绝启动。 我知道所应用的 MMU 设置似乎在某种程度上起着作用。

    因此、我认为 MMU 已授予对 c7x 内核的访问权限、而不是对 DRU 的访问权限。 非常感谢大家对这个主题有任何见解。

    我尝试了将 syscfg 中的 enableMmu 参数设置为0、但在 mup_c75.c 中似乎尚不支持此功能。

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

    我们需要了解在 TI RTOS SDK 当前支持之外、您正在尝试在 C7x 上运行哪些功能、那就是使用 C7x 进行 TIDL/深度学习。 建议您与 TI 现场代表讨论您的案例、以便我们能够有效地沟通。

    在此期间、我们将请我们的专家对您的 DRU 问题进行评论。

    谢谢。

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

    尊敬的 Tyler:

    当您尝试添加 FreeRTOS 支持时、似乎 DRU 会停止工作、因为 IPC 示例需要这样做。 事实上、IPC 与操作系统无关。 它应该同时适用于 FreeRTOS 和 noRTOS。 以下是 AM263Px MCU+ SDK 10.00.00.35中的示例: /ipc_notify_echo_am263px-cc_r5fss0-1_nortos_ti-arm-clang。 附件是您可能对该示例感兴趣的两个文件:

    e2e.ti.com/.../ipc_5F00_notify_5F00_echo.c

    e2e.ti.com/.../0640.main.c

    此致、

    Ming

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

    尊敬的 Ming:

    我确实尝试了复制这些示例、但我发现它们依赖于 FreeRTOS 库。 特别是对于此示例、在 FreeRTOS 库中定义了 Semaphorep。 适用于 c7x 处理器的 J722S SDK 中没有 NoRTOS 库、仅适用于 r5f 处理器。 但是、如果我加入 FreeRTOS 库来使用这些方法、入口点会发生变化、突然 DRU 不再起作用。

    感谢 您的任何进一步见解

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

    尊敬的 Ming:

    我的问题是合理的、还是我缺少了一些明显的东西?

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

    尊敬的 Tyler:

    您是否可以共享您在几个回复之前提供的代码的项目文件:

    __attribute__((section(".ddrData"), aligned(128))) uint8_t ddrBuffer[DDR_SIZE];
    
    
    
    
    __attribute__((section(".l2mem"), aligned(128))) float pInputBlock[128*16*2];
    __attribute__((section(".l2mem"), aligned(128))) float pOutputBlock[128*16*2];
    
    
    
    Udma_DrvHandle udmaHandle;
    int main() {
        printf("Starting program\r\n");
    
        struct Udma_DrvObj udmaDrvObj;
    
        Udma_InitPrms initPrms;
    
        uint32_t instId;
        uint32_t retVal;
    
        Udma_DrvHandle drvHandle = &udmaDrvObj;
    
        instId = UDMA_INST_ID_MAIN_0;
        UdmaInitPrms_init(instId, &initPrms);
        initPrms.printFxn     = &testDmaAutoIncPrintf;
        initPrms.virtToPhyFxn = &testDmaAutoIncVirtToPhyFxn;
        retVal = Udma_init(drvHandle, &initPrms);
    
        if (UDMA_SOK != retVal) {
           printf("[Error] UDMA init failed!!\n");
        }
    
        udmaHandle = drvHandle;
    
        int numChannels = 2;
        uint8_t *pTrMemCh[2];
        int32_t  chIdIn[2];  // Input channel IDs
        int32_t  chIdOut[2]; // Output channel IDs
        uint8_t *dmaUtilsContext = (uint8_t *) memalign(128, DmaUtilsAutoInc3d_getContextSize(numChannels));
    
    
    
        for (size_t ch = 0; ch < numChannels; ch++) {
           pTrMemCh[ch] = (uint8_t *) memalign(128, DmaUtilsAutoInc3d_getTrMemReq(1));
        }
    
        retVal = dmaUtils<float>::init(dmaUtilsContext, numChannels, udmaHandle);
    
        if (retVal != UDMA_SOK) {
           printf("[Error] UDMA init failed!!\n");
        }
    
        uint32_t transferSize = DMAUTILSAUTOINC3D_SYNC_2D;
        DmaUtilsAutoInc3d_TransferDim transferDimIn;  /*!< Structure to hold transfer properties of input DMA channel */
        DmaUtilsAutoInc3d_TransferDim transferDimOut; /*!< Structure to hold transfer properties of output DMA channel */
    
        /***********************/
        /* Configure input DMA */
        /***********************/
    
        // set transfer dimenssion structure
        dmaUtils<float>::dmaAutoIncSetupXferPropIn2D(128, 128, 128, 16, 128*sizeof(double), 128*sizeof(double),
                                                       &transferDimIn);
        // assign channel number
        chIdIn[0] = 0;
        /* chIdIn[0] = dmaChOffset::globalChOffset; */
        /* dmaChOffset::globalChOffset += 1; */
    
        // configure channel
        retVal = dmaUtils<float>::configure_channel(dmaUtilsContext, chIdIn[0], pTrMemCh, (uint8_t *) ddrBuffer,
                                                      (uint8_t *) pInputBlock, transferSize, &transferDimIn);
    
        if (retVal != UDMA_SOK) {
           printf("[Error] UDMA init failed!!\n");
        }
    
        /***********************/
        /* Configure output DMA */
        /***********************/
    
        // set transfer dimenssion structure
        dmaUtils<float>::dmaAutoIncSetupXferPropOut2D(128, 128, 128, 16, 128*sizeof(double), 128*sizeof(double),
                                                         &transferDimOut);
        // assign channel number
        chIdOut[0] = 1;
        /* chIdOut[0] = dmaChOffset::globalChOffset; */
        /* dmaChOffset::globalChOffset += 1; */
    
        // configure channel
        retVal = dmaUtils<float>::configure_channel(dmaUtilsContext, chIdOut[0], pTrMemCh, (uint8_t *) pOutputBlock,
                                                       (uint8_t *) ddrBuffer, transferSize, &transferDimOut);
    
        if (retVal != UDMA_SOK) {
           printf("[Error] UDMA init failed!!\n");
        }
    
        dmaUtils<float>::trigger(dmaUtilsContext, chIdIn, 1);
    
        dmaUtils<float>::wait(dmaUtilsContext, chIdIn, 1);
    
    
        printf("Goodbye\n");
    
    
    }

    我想从我这边看这个,并尝试复制。

    此致、

    Daniel

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

    尊敬的 Daniel:

    我不知道如何正确向您发送工程、但我已将 CCS 工程目录压缩到这里。 请告诉我、我是否应该以不同的方式行事。

    你会发现,就像现在一样,代码将在最后的 wait()调用中挂起。 如果删除 FreeRTOS 库并将入口点从 _c_int00 _secure 更改为 _c_int00、则可以正常工作。

    如前所述、我认为它与 MMU 有一定关系、因为_c_int00_secure 条目唯一的作用是初始化 MMU、但要感谢您的输入!

    e2e.ti.com/.../basic_2D00_project.zip

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

    尊敬的 Tyler:  

    我不知道如何正确地向您发送工程、但我已将 CCS 工程目录压缩到此处。 请告诉我是否应该以不同的方式进行操作。

    感谢您的参与、这应该足以继续。 我们将不断更新我们的调查结果

    此致、

    Daniel

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

    尊敬的 Tyler:

    特别是在本示例中、SemaphoreP 在 FreeRTOS 库中定义。 适用于 c7x 处理器的 J722S SDK 中没有 NoRTOS 库、仅适用于 r5f 处理器。 [/报价]

    我知道您遇到的问题、我也注意到 C7x 内核缺少 NoRTOS 库。 我目前正就此与开发团队联系、了解我们如何提供潜在的解决方案。

    谢谢、

    Neehar

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

    尊敬的 Tyler:

    关于在 C7x 上运行的裸机 IPC 示例、我目前仍与开发团队保持联系。

    我能够为使用裸机在 MCU R5上运行的 IPC Notify echo 应用程序生成二进制文件、目前我正在测试这些二进制文件。 这可能有助于 从示例中查看实现、因为它为您的开发提供了参考。

    谢谢、

    Neehar

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

    嗨、Neehar、

    感谢您的更新。 假设您能够使 IPC 在裸机 C7x 上运行、并且没有破坏 DRU (就像 RTOS 那样)、那么这对我们来说已经足够了。 期待进一步更新。

    - Tyler

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

    大家好、

    这个状态是什么?

    - Tyler

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

    尊敬的 Tyler:

    抱歉耽误您的时间、如果我们可以为您生成二进制/补丁并附上 C7x 上的裸机 IPC 示例、我仍会与开发团队反复沟通。 我们目前不支持 C7x 上的裸机、因此、他们一直  不情愿。

    此外、我还会研究何时能够为 TISP 提供 FreeRTOS 支持。  
    我仍然可以在平均时间提供 MCU R5裸机 IPC 示例、最终目标是在 C7x 上提供。

    由于美国节假日、可能会进一步延迟。

    谢谢、

    Neehar

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

    嗨、Neehar、

    如果不清楚、示例应用对我们来说并不重要。 我们只需要1)最小 nortos 库允许我们使用 IPC 编译自己的应用、或者2)一种在不中断 DRU 的情况下编译 FreeRTOS 应用的方法

    R5对我们没有帮助、应用程序需要在 c7x 上运行。

    查看此问题的合适人员可以在一个小时内解决问题、为什么您的团队如此不愿意帮助我们解决这个简单的问题?

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

    尊敬的 Tyler:

    很抱歉耽误时间、因为我也不在办公室。 我已经为 C75-0内核生成了 BareMetal 或 nortos 库、并将其附加在下面。 请在测试后查看并返回给我。 我仍在使用这些 nortos 库测试您的应用程序代码、但我想向您提供此更新。 此外、我还努力找出您在使用 FreeRTOS 时遇到的问题的根本原因。

    e2e.ti.com/.../nortos.j722s.c75ss0_2D00_0.ti_2D00_c7000.release.lib 

    谢谢、

    Neehar

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

    嗨、Neehar、

    感谢初始库。 它没有完全起作用、但希望我们可以快速迭代它以开始运动

    我本质上是在尝试使用新的 nortos 库重建'ipc_rpmsg_echo_linux'示例、我们很快就会遇到链接问题、包含`rPMessage_waitForLinuxReady (SystemP_wait_forever);` line

    库中缺少几种方法、下面链接了这些方法。

     undefined            first referenced                                                                                                                                                                
      symbol                  in file                                                                                                                                                                     
     ---------            ----------------                                                                                                                                                                
     ClockP_getTimerCount /home/tmiddlet/ti-processor-sdk-rtos-j722s-evm-10_00_00_05/mcu_plus_sdk_j722s_10_00_00_25/source/kernel/nortos/lib/nortos.j722s.c75ss0-0.ti-c7000.release.lib<ClockP_nortos.obj>
     ClockP_init          ./syscfg-generated/ti_dpl_config.obj                                                                                                                                            
     HwiP_destruct        /home/tmiddlet/ti-processor-sdk-rtos-j722s-evm-10_00_00_05/mcu_plus_sdk_j722s_10_00_00_25/source/kernel/nortos/lib/nortos.j722s.c75ss0-0.ti-c7000.release.lib<ClockP_nortos.obj>
     HwiP_disable         ./syscfg-generated/ti_dpl_config.obj                                                                                                                                            
     HwiP_restore         /home/tmiddlet/ti-processor-sdk-rtos-j722s-evm-10_00_00_05/mcu_plus_sdk_j722s_10_00_00_25/source/kernel/nortos/lib/nortos.j722s.c75ss0-0.ti-c7000.release.lib<DebugP_log.obj>   
     Hwi_vectorTableBase  /home/tmiddlet/ti-processor-sdk-rtos-j722s-evm-10_00_00_05/mcu_plus_sdk_j722s_10_00_00_25/source/kernel/nortos/lib/nortos.j722s.c75ss0-0.ti-c7000.release.lib<HwiP_c75.obj>     
     xPortInIsrContext    /home/tmiddlet/ti-processor-sdk-rtos-j722s-evm-10_00_00_05/mcu_plus_sdk_j722s_10_00_00_25/source/kernel/nortos/lib/nortos.j722s.c75ss0-0.ti-c7000.release.lib<HwiP_c75.obj>     


    请告诉我、您是否可以添加这些方法、或者考虑一种解决方法。

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

    您好 Neehar、感谢您提供初始库。 您是否对 FreeRTOS 兼容性有任何更新或者更新了 nortos 库?

    谢谢、

    David

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

    您好、David:

    我生成了一个当前正在测试的更新 noRTOS 库。 当我能够成功运行示例时、我将在此处提供它。 Tyler 遇到的问题是因为存在未针对 C75上的 noRTOS 实现的 ClockP 和 HwiP API。

    谢谢、

    Neehar

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

    嗨、Neehar、

    这是怎么回事? 这种方法似乎有希望吗?

    - Tyler

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

    你好 Neehar ,很高兴听到有一个图书馆在测试。 您在这里有任何更新吗?

    谢谢您、

    David

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

    尊敬的 Tyler 和 David:

    我仍在努力 为 C7x 获取一个可工作的 noRTOS 库。 我遇到问题、因为一些 HwiP API 仅针对 FreeRTOS 实现、在裸机环境中无法正常工作。 我目前正在填写这些 API。

    谢谢、

    Neehar

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

    嗨、Neehar、

    我想重申的是、我们只需要 IPC 和 DRU 在同一环境中工作、FreeRTOS 和 noRTOS 都可以满足我们的需求。 我不知道您是否更容易实现这条使 IPC 在没有 RTOS 的情况下正常工作的路径、或者是否可以更简单地解决 FreeRTOS 中发生的 DRU 引导问题。 似乎您所采取的方法可能更全面、但我不知道解决 DRU 启动问题有多困难。 希望您能选择电阻最小的路径。

    谢谢、

    Tyler

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

    您好 Neehar、您是否有关于这些 API 的裸机实现的更新? 我们的 DSP 团队因该问题而受阻、这是我们为了继续开发而需要解决的最高优先级。

    谢谢、

    David

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

    您好 Neehar、我们将再次关注此问题。 我认为、从我们首次向 TI 提出这个问题已经过去了3-4个月、我们认为 DRU + IPC 是 TDA4上的基本功能。 我们感谢您在这里为运行这些功能而付出的辛勤努力、我们希望我们的团队和我们的路线图将被阻止、因此我们希望获得最新状态的更新。

    谢谢、

    David

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

    您好、David:

    TDA4AEN 器件已经支持 IPC。 您在寻找 IPC 的内核?  

    关于 DRU 的使用、您还希望在哪个核心上访问 DRU?

    VISION 中目前不支持 DRU、在 VISION apps/utils 文件夹中、我们正在研究在下一个版本(或在下一个版本之后)中启用 DRU。  

    此致、

    Brijesh  

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

    您好、Brijesh、

    问题历史记录中对此进行了详细说明、但我将简要介绍一下。

    c7x 不支持 DRU、这意味着 DDR 和 SRAM 之间无法实现快速传输。 这对于 DSP 应用至关重要、因此我们请 TI 实施它。 他们回复了一个新的 SDK 版本、提供了一个原型 TISP 库和对 DRU 的有限支持。

    没有问题、直到我尝试将其与 IPC 集成、这对于 c7x 上的任何有用应用也至关重要。 c7x 上的 IPC 仅在您使用 FreeRTOS 时有效、但出于某些原因、FreeRTOS 会中断之前提供的有限 DRU 支持。

    我们需要 IPC 和 DRU 都在 c7x 上工作。 无论是否存在 FreeRTOS、都无关紧要、因此该问题有两种解决方案。 修复 FreeRTOS 上的 DRU、或实现 IPC 所需的 NoRTOS 方法。

    如果需要进一步说明、请告诉我。

    - Tyler

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

    尊敬的 Tyler:

    C7x 支持 FreeRTOS、并在 SDK 版本中验证。 如果您使用视觉应用、甚至 IPC 在 C7x 上运行正常。 我已经使用视觉应用对 C7x 上的回波测试进行了测试、并且测试正常运行。 因此无法理解您在使用 IPC 时所面临的确切问题。 支持具有 FreeRTOS 的 IPC、在 J722S 上运行正常。  

    关于 DRU、我需要检查。  使用 MCU+驱动程序不支持该机制、因此 dmautils 中应该支持该机制、这也是 TIDL 在内部使用的机制、但也可能会出现意外情况。

    让我们先看看您的 IPC 问题、然后检查 DRU。

    此致、

    Brijesh

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

    尊敬的 Brijesh、我们正在 C7x 上运行一个非视觉或 TIDL 的定制 DSP 应用。 我们使用的是 TISP (C7x DSP)、这是 SDK 10.0中全新的 SDK 组件、TISP 使用的 DRU 与 IPC 兼容、 相关的信息,甚至代码片段都可以在上面的这个线程和 Neehar 似乎是对我们的情况,我们非常感激。

    我们的软件团队非常灵活、我们对以下任何一种解决方案都很满意:

    A53上的 Linux + TISP、C7x 上的 FreeRTOS

    A53上的 Linux + C7x 上的 TISP 和裸机

    对于 TI 团队来说、如果您想举行一次简短的会议、我们可以讨论/找出问题的根本原因并分享非常感谢的当前状态。  

    谢谢、

    David

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

    您好、Brijesh 和 Neehar、您对此问题有任何更新吗? 我们的团队(和其他团队)在 J722S 平台上的这方面仍然受阻。 我相信2周前的状态是 Neehar 有一个初步的解决方案,但它没有实施一些必要的 HwiP API 用于裸机使用。

    谢谢、

    David

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

    您好、David:

    我对新构建的 noRTOS 库有问题、目前我正在努力修复这些问题。 我将在几天后跟进更新。

    谢谢、

    Neehar

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

    感谢 Neehar、我们期待您的更新。

    此致

    David

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

    跟踪以使线程不锁定。

    谢谢、

    Neehar

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

    您好、David 和 Tyler、

    很抱歉暂停一下、因为我相信我的同事帮助您在另一个 E2E 主题上调试了问题。

    当前计划是将对 TISP 的 FreeRTOS 支持集成到版本11.0的 SDK 中。 这可能会发生变化、我将跟进任何其他更新。 感谢您的耐心!

    谢谢、

    Neehar