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 + Linux 远程处理器集成:DmaUtilsAutoInc3d_wait()中的无限循环

Guru**** 2482225 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1419572/j722sxh01evm-tisp-linux-remote-proc-integration-infinite-loop-in-dmautilsautoinc3d_wait

器件型号:J722SXH01EVM

工具与软件:

您好!

我修改了mcu_plus_sdk_j722s_10_00_00_25/examples/drivers/ipc/ipc_rpmsg_echo_linux c75ss0-0_freertos/ti-c7000目标示例、使其链接到 TISP 库中、并 tisp/test/misc/TISP_blockCopy_superNode/TISP_blockCopy_superNode_test.cpp test. 可以使用 Linux remoteproc 框架加载另一个具有所生成二进制文件的精简版源文件、如果将 TISP::execute::graph(mySuperNodeVec);调用注释掉、则运行正常、否则 DSP 最终将永远循环进入 mcu_plus_sdk_j722s_10_00_00_25/source/drivers/dmautils/src/dmautils_autoincrement_3d.c::DmaUtilsAutoInc3d_wait().


的符号 mcu_plus_sdk_j722s_10_00_00_25/source/drivers/dmautils/src/dmautils_autoincrement_3d.c::DmaUtilsAutoInc3d_wait():

waitWord = dmautilsContext -> channelContext[channelId] -> waitWord;
eflRegisterVal = __get_indexed(__EFR, 0);
while ((eflRegisterVal & waitWord) != waitWord) {
eflRegisterVal = __get_indexed(__EFR, 0);
}

waitWord is 0x1 and eflRegisterVal 始终读为0。 在此之前、DMA 传输设置功能不会报告任何错误。 
Any suggestion as to what might be causing this? Any help would be very apreciated, thank you.





#ifdef __cplusplus
extern "C" {
#endif
#include <kernel/dpl/DebugP.h>
#ifdef __cplusplus
}
#endif

#include "TISP_superNode.hpp"
//#include "TISP_test.h"
#include "TISP_types.hpp"
#include "TISP_util.hpp"
#include <fftlib.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <tisp.hpp>

#include <drivers/hw_include/csl_clec.h>

#define WIDTH (16)
#define HEIGHT (16)

#define BLOCK_WIDTH (8)
#define BLOCK_HEIGHT (2)

#define TOTAL_DMA_CHANNELS (2)

#define NUM_REPS (1024)

#define DDR_SIZE (4 * 1024 * 1024) // 4 MB

Udma_DrvHandle TISP::SuperNode::appDrvHandle;

static __attribute__((aligned(128))) uint8_t ddrBuffer[DDR_SIZE];

#define RESTRICT restrict

void TISP_blockCopy_test_cn(float *RESTRICT pX,
                            float *RESTRICT pY,
                            size_t          width,
                            size_t          height,
                            size_t          inPitch,
                            size_t          outPitch)
{
   for (int32_t i = 0; i < height; i++) {
      for (int32_t j = 0; j < width; j++) {
         pY[i * outPitch + j] = pX[i * inPitch + j];
      }
   }
}

#ifdef __cplusplus
extern "C" {
#endif
int32_t tisp_test_main()
{
   DebugP_log((char *)"Init local vars\n");

   struct Udma_DrvObj appUdmaDrvObj;

   TISP::SuperNode::appDrvHandle = TISP::SuperNode::superNode::setUdmaDrvHandle(appUdmaDrvObj);

   /* DebugP_log((char *)"\nTISP demo with FFTLIB_1dBatched\n"); */

   uint32_t blockWidth  = BLOCK_WIDTH;
   uint32_t blockHeight = BLOCK_HEIGHT;

   /* size_t dataMemSize = width * height * sizeof(float); */

   uint32_t blockSize = blockHeight * blockWidth * sizeof(float);

   float *pInputBlock  = (float *) memalign(128, blockSize * 2);
   float *pOutputBlock = (float *) memalign(128, blockSize * 2);

   DebugP_log((char *)"Init mem to copy\n");

   uint32_t width  = WIDTH;
   uint32_t height = HEIGHT;

   float *input   = (float *) ddrBuffer;
   float *inputCn = input + width * height;

   for (uint32_t i = 0; i < width * height; i++) {
      /* input[i] = (float)rand() / (float)(RAND_MAX / (2 * 8)) - 8; */
      input[i]   = i;
      inputCn[i] = input[i];
   }

   DebugP_log((char *)"\n--------------------------------------------------");
   DebugP_log((char *)"\n        Memcopy Demo using TISP                 ");
   DebugP_log((char *)"\n--------------------------------------------------\n");

   float *output  = inputCn + width * height;
   // float *refOut = output + width * height;


   DebugP_log((char *)"\nCreating Graph:\n");
   DebugP_log((char *)"\nDDR-->L2-->blockCopy-->L2-->DDR\n");

   auto k0 = new TISP::misc::blockCopy<float, TISP::DMA_IN_OUT>(pInputBlock, pOutputBlock, blockWidth, blockHeight);

   TISP::opVec myOpVec;

   myOpVec.push_back(k0);

   auto s0 = new TISP::SuperNode::i2d_to_o2d<float, float>(myOpVec, input, output, pInputBlock, pOutputBlock, width,
                                                           height, blockWidth, blockHeight, width * sizeof(float),
                                                           width * sizeof(float), (TOTAL_DMA_CHANNELS));

   uint64_t startTime, endTime;
   startTime = (__get_GTSC(1), __STSC);

   TISP::SuperNode::superNodeVec mySuperNodeVec;
   mySuperNodeVec.push_back(s0);

   DebugP_log((char *)"\nExecuting graph\n");

   /* s0->exec(); */
   // TISP::execute::graph(mySuperNodeVec); // Uncommenting this line reesults in an infinite loop

   endTime            = (__get_GTSC(1), __STSC);
   uint64_t totalTime = (endTime - startTime);
   DebugP_log((char *)"Cycles - Using Opvec = %llu\n", totalTime);
   DebugP_log((char *)"Bandwidth: %.2f GB/sec\n", ((float) WIDTH * HEIGHT * sizeof(float)) / (totalTime));

   DebugP_log((char *)"\nFreeing resources...\n");

   free(pInputBlock);
   free(pOutputBlock);

   delete (k0);
   /* delete (k1); */
   delete (s0);

   DebugP_log((char *)"\nDemo complete!");
   return 1;
}
#ifdef __cplusplus
}
#endif

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

    尊敬的 Delio:

    haikuo shen 说:
    降低 tisp/test/misc/TISP_blockCopy_superNode/TISP_blockCopy_superNode_test.cpp test
    的版本

    为了确认、您是否能够在 TISP 框架内测试编辑后的 TISP 测试(即裸机示例、不使用 Linux)? 它是否能够成功运行?

    从 Linux 方面来说、您进行了哪些修改?  

    此致!

    Asha

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

    尊敬的 Delio:

    [报价 userid="47253" url="~/support/processors-group/processors/f/processors-forum/1419572/j722sxh01evm-tisp-linux-remote-proc-integration-infinite-loop-in-dmautilsautoinc3d_wait/5446447 #544644747"]我尚未针对 OSPI NAND 引导进行设置、当我在 SDK 文档中查找设置该引导的说明时、我找不到执行该操作的步骤

    感谢您指出运行说明中的混乱、我已将其传递给我们的团队以改进文档。 这是指使用 SBL NULL 模式来设置 EVM、这两个方向在此处。 您可以按照这些说明进行操作、然后就应该能够使用此方法通过 CCS 将.out 文件加载到 C7x 内核。  

    更改极少。 我在下面的更改中包含了一个差异。 请注意、我之前已成功地增强了  ipc_rpmsg_echo_linux 示例、但这与测试 MMALIB 集成的方法相同。[/QUOT]

    感谢您的提供、下面将转交给我们的一些 DMA 专家、以听取他们的意见。 由于该库不使用 C7x DRU、因此通过 MMALIB 集成时、情况会有所不同。  

    此致!

    Asha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢您提供、我将此事转交给我们的一些 DMA 专家、以供他们参考。 由于该库不使用 C7x DRU、因此通过 MMALIB 集成时、情况会有所不同。  [报价]

    感谢您发送编修。

    这是指使用 SBL NULL 模式设置 EVM -这里提供了相关说明。 您可以按照这些说明进行操作、然后就应该能够使用此方法通过 CCS 将.out 文件加载到 C7x 内核。  [报价]

    感谢您提供指向说明的 URL。

    此致

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

    尊敬的 Delio:

    因此、根据上面的对话、当您使用 SBL 引导此二进制文件时、它无法引导、但在您使用 CCS 加载时可以正常引导、您能否确认这一点?  

    此致、

    Brijesh

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

    您好、 Brijesh:

    [报价 userid="80721" url="~/support/processors-group/processors/f/processors-forum/1419572/j722sxh01evm-tisp-linux-remote-proc-integration-infinite-loop-in-dmautilsautoinc3d_wait/5447956 #5447956"]根据上述对话、当您使用 SBL 启动此二进制文件时、它不能启动、但使用 CCS 加载它时可以正常启动、您能确认这一理解吗?  [报价]

    我尚未使用 SBL 和 CCS 进行测试。 我将构建一个 ELF 可执行文件、用于使用 Linux 远程 proc 框架引导 c75ss0-0 (即 DSP 0)。 该 可执行文件将运行、我可以看到调试日志出现在 Linux 远程 proc 跟踪缓冲区(在本例中为/sys/kernel/debug/remoteproc/remoteproc0/trace0)中。

    放置 DebugP_LOG()语句我能够 mcu_plus_sdk_j722s_10_00_00_25/source/drivers/dmautils/src/dmautils_autoincrement_3d.c::DmaUtilsAutoInc3d_wait()永远确认循环中的 while 循环。

    waitWord is 0x1 and eflRegisterVal 始终读为0。 在此之前、DMA 传输设置函数不会报告错误。 
    谢谢你。
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Delio:

    您还可以确认 C7x 二进制 文件使用的存储器映射是为 Linux dts 文件中的 C7x 内核保留的映射吗?

    此致、

    Brijesh

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

    您好、 Brijesh:

    并且您能否同时确认 C7x 二进制使用的内存映射是否 为 Linux dts 文件中为 C7x 内核保留的内存映射?

    是、已确认。

    此致

    ——

    Delio

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

    嗨、Brijesh、我只是想在这里查看您是否有任何更新? 谢谢你

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

    您好、Abigail:

    并且您不会看到任何 DMA 函数报告的任何错误? TR 的内存和环是否来自高速缓存区域? 那么、您可以 在更新此存储器后应用高速缓存操作吗? 此外、 TR 中给出的缓冲地址是否在 存储器的有效区域内?  

    另外请确认通道确实已启用、否则我们将无法获得中断/完成。  

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    并且您没有看到任何 DMA 函数报告的任何错误?

    正确

    高速缓存区域 TR 和环网的内存是否是?

    如何找到? 请记住、我没有更改任何与内存布局相关的内容。

     更新此内存后、您能否应用高速缓存操作?

    除非我误解了这句话、否则我不认为我可以在*存储器复制之后做任何事情、因为存储器复制操作从不返回(它卡在无限循环中)。

     TR 中给出的缓冲区地址是否位于有效的 内存区域内?  [报价]

    请查看我在上一篇文章中随附的更改的差异。 缓冲区与原始示例代码位于同一区域。

    此外、请确认信道已真正启用、否则我们将无法获得中断/完成。  [报价]

    通过这种方式、我如何检查通道是否真正启用?

    谢谢你。

    此致

    ——

    Delio

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

    您好、Brijesh、我只是想代表 Delio 在这里继续查看我们是否有任何更新?

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

    嗨、Brijesh、您好!我想再次跟进。 谢谢你

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

    您好!

    延迟是由于我们的专家查看此线程、他不在办公室、并在12月13日返回。 建议等待。 感谢您的耐心。

    谢谢。