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.

[参考译文] TDA4VH-Q1:如何启用 C7x L1D SRAM 以与标量数据一起使用

Guru**** 2430620 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1546849/tda4vh-q1-how-to-enable-c7x-l1d-sram-for-use-with-scalar-data

器件型号:TDA4VH-Q1
Thread 中讨论的其他器件:TDA4VH

工具/软件:

TDA4VH TRM 表明有一个 16KB L1D 分区可用作 SRAM、并独立于 L1D 高速缓存、可用于 LUT 和直方图。 这是正确的、该 SRAM 是否可以在本地用于存储标量操作数? 假设是的、我们想知道如何配置 MMU 来启用该 C7x L1D SRAM(如果存在)。 我们以 DSPLIB 环境为起点编写 C7x 代码。

  1. 我们在 Ubuntu 22.04.1 主机上使用 J784S4 RTOS SDK 10.01.00.04
  2. 我们点击以下链接、按照 DSPLIB 构建说明进行了操作: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-j784s4/10_01_00_04/exports/docs/dsplib/docs/user_guide/build_instructions_linux.html 
  3. 我们已经点击此链接遵循了 CCS 裸机说明: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-j784s4/latest/exports/docs/psdk_rtos/docs/user_guide/ccs_setup_j784s4.html#debugging-without-hlos-running-on-a72-rtos-only-baremetal 
  4. 我们使用 J784S4XG01EVM 修订版 PROC141E5 (001) 进行测试

在 DSPLIB 链接器命令文件中、我们猜测 L1D SRAM 映射到地址 0x64800000、但当我们链接变量时、我们的应用程序无法正确执行、我们无法使用 CCS 修改这些地址范围。

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

    您好、

    假设是、我们想知道如何配置 MMU 来启用此 C7x L1D SRAM(如果存在)。

    标准引脚堆叠设置。 可检查的 MMU 配置  InitMmu 在  vision_apps\platform\j784s4\rtos\c7x_1\main.c 中

    在 DSPLIB 链接器命令文件中、我们猜测 L1D SRAM 映射到地址 0x64800000、但当我们链接变量时、我们的应用程序无法正确执行、我们无法使用 CCS 修改这些地址范围。

    此外、从 DSPLIB (C7120) 中可用的默认链接器脚本中、 如果映射  了 L2SRAM、则映射似乎位于 0x64E00000 处




    我能够读取和写入相同的数据使用下面的代码片段:  

    #include<iostream>
    
    __attribute__((section(".l1dmemory"), aligned(64))) int32_t l1_data[1024];
    
    int main()
    {
         for (int i = 0; i < 1024; ++i)
            l1_data[i] = i;
        for (int i = 0; i < 1024; ++i)
            std::cout<< l1_data[i]<<",";
        return 0;
    }

    此致、
    Sivadeep

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

    感谢您发送编修。 首先、我之前分享的 L1D 地址有一个拼写错误、正如您所说的、我们实际上使用的是 0x64E00000。

    您提供的示例工作正常、如您所述。 谢谢你。

    但是、我们在固件中使用此存储器时遇到问题、并且似乎我们执行了多项操作。 我们使用 DSPLIB 开始这项工作、然后转向使用内在函数、但我们一直无法使用 L1D SRAM、即使使用基本的 DSPLIB 示例也是如此。 例如、我回到了这个非常基本的 DSPLIB 示例、如果我们将变量链接到.l2dmemory、该示例会正常工作、但如果我们将它们链接到.l1dmemory、则会失败、如图所示。 请参阅 main 之前的三条 DATA_SECTION pragma 语句。 如果我们将它们更改为 l2dmemory、则事情会正常工作。 您能帮助我们了解这种方法失败的原因吗... 这是因为矢量参数必须保留在 L2 中吗?

    请注意、这不是我们当前使用 L1D SRAM 时遇到的问题、但我想在启用缓存之前回去。 我相信我们在启用缓存时会引入额外的问题、因为我们从 DSPLIB 测试代码中“借用“了调用 enable_cache_MMU ((uint64_t) pte_lvl0) 的函数和相关的.c/.h 文件。 此函数会启用缓存和 MMU、您说裸机配置不需要 MMU。 我们同意这一点、但我们正在寻找一种启用缓存的方法、我们在 DSPLIB 中找到了此代码。 在启用 MMU 时、可能会引入更多问题。

    #include "dsplib.h"
    #include <stdint.h>
    
       // Setup input and output buffers for single- and double-precision datatypes
    #pragma DATA_SECTION (".l1dmemory")
       float in0[] = {0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0,0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0, 0.99,
                      0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1,0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1, 0.1,
                      0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0,0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0, 0.99,
                      0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1,0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1, 0.1,
                      0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0,0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0, 0.99,
                      0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1,0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1, 0.1,
                      0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0,0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0, 0.99,
                      0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1,0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1, 0.1,
                      0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0,0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0, 0.99,
                      0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1,0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1, 0.1,
                      0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0,0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0, 0.99,
                      0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1,0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1, 0.1,
                      0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0,0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0, 0.99,
                      0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1,0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1, 0.1,
                      0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0,0.71649936, 0.13543484, 0.50923542, 0.54119591, 0.19242506, 0.38308575, 0.56363197, 0, 0.99,
                      0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1,0.24567145, 0.05629663, 0.99152828, 0.4799542,  0.97309674, 0.79839982, 0.06691247, 1, 0.1
       };
    #pragma DATA_SECTION (".l1dmemory")
       float in1[] = {0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1,
                      5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0, 5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0,
                      0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1,
                      5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0, 5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0,
                      0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1,
                      5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0, 5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0,
                      0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1,
                      5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0, 5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0,
                      0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1,
                      5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0, 5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0,
                      0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1,
                      5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0, 5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0,
                      0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1,
                      5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0, 5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0,
                      0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 1,
                      5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0, 5.49778714, 0.,         0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 0
       };
    #pragma DATA_SECTION (".l1dmemory")
       float out[256] = {0.0};
    
    /******************************************************************************/
    /*                                                                            */
    /* main                                                                       */
    /*                                                                            */
    /******************************************************************************/
    
    int main(void)
    {
       uint32_t size = 256;
    
       // handles and struct for call to kernel
       DSPLIB_STATUS       status;
       DSPLIB_add_InitArgs kerInitArgs;
       int32_t             handleSize = DSPLIB_add_getHandleSize(&kerInitArgs);
       DSPLIB_kernelHandle handle     = malloc(handleSize);
    
       DSPLIB_bufParams1D_t bufParamsIn, bufParamsOut;
    
       // fill in input and output buffer parameters
       bufParamsIn.data_type = DSPLIB_FLOAT32;
       bufParamsIn.dim_x     = size;
    
       bufParamsOut.data_type = DSPLIB_FLOAT32;
       bufParamsOut.dim_x     = size;
    
       kerInitArgs.dataSize  = size;
       kerInitArgs.funcStyle = DSPLIB_FUNCTION_OPTIMIZED;
    
       status = DSPLIB_SUCCESS;
    
       // init
       if (status == DSPLIB_SUCCESS)
          status = DSPLIB_add_init(handle, &bufParamsIn, &bufParamsOut, &kerInitArgs);
    
    
       // exec checkparams
       DSPLIB_add_exec_checkParams(handle, in0, in1, out);
    
       unsigned long start_time, stop_time;
       // exec
       if (status == DSPLIB_SUCCESS) {
          start_time = __TSC;
          status = DSPLIB_add_exec(handle, in0, in1, out);
          stop_time = __TSC;
       }
       printf("\nNumber of clock cycles elapsed in %lu\n", stop_time - start_time);
    
       // print results
       for (size_t c = 0; c < size; c++) {
          printf("%10g + %10g = %10g\n", in0[c], in1[c], out[c]);
       }
    
       return 0;
    }