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.

[参考译文] TDA4VM:C7x 图像处理算法、将图像复制到缓冲区中。

Guru**** 2551110 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1566487/tda4vm-c7x-image-processing-algorithm-issue-copying-the-image-into-the-buffer

器件型号:TDA4VM


工具/软件:

您好、

我有一个图像处理算法、该算法将一个 RGBIR 原始图像作为输入并生成完整的 IR 原始输出。
图像分辨率为宽度 2592 和高 1944。 我已连接到 J721e SoC 中的 XDS110 板载调试器、并将二进制文件加载到 C7x 内核中。  
我在 Ubuntu 22 中使用 Code Composer Studio 版本 12.4。

在将图像读取到输入缓冲区时、我注意到它的复制速度较慢。
我尝试了 100 行,我注意到它花了 170 秒。 尝试以不同方式复制 100 行、复制每个像素、迭代复制 32 像素、逐行复制、单次复制。  
不管怎么说,它花了 170 秒。  

我附上了一段代码供参考。

您能给我建议复制的适当方法吗?  
此问题是否确实是由 fread () 引起的?

int i = 0;
文件*fp = fopen(“/home/thalamr/workspace_v_latest/rgbir_instrinsic/input1.raw “、“rb);
const unsigned int img_width = 2592;
const unsigned int img_height = 1944;
const unsigned int OUT_STRIDE = 2688;

unsigned short* input =(unsigned short*) malloc (out_stride * img_height * sizeof (unsigned short));
unsigned short* outputBayer =(unsigned short*) malloc (out_stride * img_height * sizeof (unsigned short));


对于 (I = 0;I < img_height;I++)

  fread (&input[i * OUT_STRIDE]、sizeof (unsigned short)、img_width、FP);
}

谢谢。此致、
Srinivas Thalam

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

    性能的瓶颈在于实施的低级细节 fread 。  不幸的是、没有解决办法。  为了更好地理解、请阅读文章 使用 printf的提示。  一个相关的段落说用于与主机交换数据的密钥缓冲区...

    注意:该段相当小、这意味着大型读取和写入可能需要执行许多 C$$IO$$断点命中。 此缓冲区可以增加、但限制因素是调试器需要能够调整自己的内部缓冲区大小。

    谢谢。此致、

    -乔治

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

    您好、George、

    我们在为程序分配的 DSP lnk.cmd 文件中具有有限的存储器。
    由于我的.raw 映像是 10MB、我需要 50 MB 的空间用于堆。  

    这里我附加了 lnk.cmd 文件中的一段代码。

    -heap 0x70000 // 448KB
    -stack 0x4000 // 16KB
    --cinit_compression=off
    -args 0x1000
    -- diag_suppress=10068 //“无匹配段“

    移动数据

    MSMCSRAM_CINIT (rwx):org = 0x70000000、len = 0x000100
    L2SRAM (RWX):org = 0x64800000、len = 0x080000 //(对于 J7)
    L1DSRAM (RWX):org = 0x64E00000、len = 0x004000 // 16kB、对于 J7
    MSMCSRAM (RWX):org = 0x70000100、len = 0x7fff00
    EXTMEM_STATIC (RWX):org = 0x80000000、len = 0x200000
    EXTMEM_DATACN (RWX):org = 0x80200000、len = 0x400000
    EXTMEM (RWX):org = 0x80600000、len = 0x400000
    EXTMEMPAGE (RWX):org = 0x80A00000、len = 0x200000
    }

    此路径中使用的 lnk.cmd 文件。

    /ti-processor-sdk-rtos-j721e-evm-09_02_00_05/DSPLIB_09_02_00_04/cmake/linkers/lnk.cmd

    我将 L2SRAM 大小增加到 10MB、我没有得到任何 eros、但在 CCS 中、当我使用更多的 448kb 时、在调试器中、光标消失。
    已尝试增大 L1DSRAM aslo。

    L2SRAM (RWX):org = 0x64800000、len = 0x100000 //(对于 J7)
    L1DSRAM (RWX):org = 0x65000000、len = 0x004000 // 16kB、对于 J7

    您能帮我增大尺寸吗?


    谢谢。此致、
    Srinivas Thalam

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

    Srinivas — 您需要使用 C I/O 吗? 如果您将使用 CCS 进行调试、为什么不只使用 CCS 存储器加载功能将原始二进制映像加载到存储器中呢?

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

    内存范围、如所示 L2SRAM 必须与系统中存在的存储器相匹配。  我认为您的系统有一个规范、可以记录所有存储器范围。  如果此存储器范围与该规范不匹配、则不起作用。   

    增加堆和栈不太可能提高性能。  我在最后一篇文章中提到的缓冲区有一个固定的长度,不依赖于堆或堆栈。

    谢谢。此致、

    -乔治

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

    尊敬的 George Mock:

    在触摸 link.cmd 文件之前、我已经尝试了两种不同的方法。

    1.使用 malloc ()。

    unsigned short* input =(unsigned short*) malloc (out_stride * img_height * sizeof (unsigned short));

    2.使用__attribute__

    unsigned short input[2592 * 1944]__attribute__((section(“.sysmem")“)));

    当我在 CCS 中加载图像 (Tools->Load Memory) 时、我注意到只有大约 440kb 被复制到缓冲区中(下面提到的内存浏览器屏幕截图)。
    440kb 分配给 lnk.cmd 文件中的堆 memroy。 当我检查内存浏览器的其余部分 memroy 它 dispavied 目标未能读取 0x000。

    我需要大约 50mb、因为我有输入图像、输出图像和两个缓冲区、每个缓冲区大小为 10MB。

    你能建议我克服这个问题的方法吗?

    谢谢。此致、
    Srinivas Thalam

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

    这看起来是早期版本的 CCS 中存在的已知问题。 CCS 12.4 相当旧。 请尝试更新您的版本。 CCS 20.3.0 是最新的、但自从更新 IDE 框架以来、它有了很大的变化。 理想情况下、您应转到此版本、因为我们不再支持 CCS 12.x 但如果不想移至新的 IDE 框架、可以尝试更新至 CCS 12.8.1。

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

    我同时使用 12.4 和 12.8.1 版本、我在这两个版本中都遇到了相同的错误、我只能使用 448kb 的 L2SRAM (-heap 0x70000 // 448KB)。 我安装了最新版本 20.1.1 ,没有得到完美地使用最新版本,它是相当不同的 12 版本。

    我们是否需要增加内存、因为在这两个版本中、我们只能使用有限的内存。

    此致、
    Srinivas Thalam

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

    Srinivas,

    我认为 C7x 上只有 448KB 的 L2 RAM。  

    此致、

    Brijesh

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

    您好、Brijesh、

    感谢您的确认。

    我使用了外部内存和 Able 处理我的映像并在 1.6370 秒内生成输出、这是更不寻常的时间。
    那么,你建议我加载我的 9.6 MB 原始图像 以减少时间的哪个内存区域?
    如何以及在何处分配 (2592 * 1944 * 2) 字节的空间来加载我的图像?

    此致、
    Srinivas Thalam

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

    您好、

    您只需要对这样大的映像使用 DDR。  但您可能会在部分中处理映像、 在内部存储器中复制映像的一小部分、对其进行处理、将输出写回 DDR、并对 其余映像执行相同的操作。  

    此致、

    Brijesh