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.

[参考译文] TMS320F280038C-Q1:放置在 LSRAM4 到 7 次读取访问中的 CLA 阵列极慢

Guru**** 2515435 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1558504/tms320f280038c-q1-cla-array-placed-in-lsram4-through-7-read-access-time-extremely-slow

器件型号:TMS320F280038C-Q1


工具/软件:

您好:

我想在 LS ram 存储器中存储几个常量浮点 LUT 数组、以供 CLA 访问。 我最初将 LUT 存储在闪存中、然后在启动时写入 RAM、并且能够在 CPU 读取 LS RAM 时使这些 LUT 都正常工作。 但是、一旦我授予了对 CLA 的 RAM 访问权限并让 CLA 执行读取、我就注意到了单次读取(在 CLA 中)的访问时间是几百个时钟周期、似乎有些过时了。 读取值是正确的值、因此我猜我的设置不正确。

以下是相关代码部分  

 

///// LUT C File 

#pragma DATA_SECTION (LUT_D2,"LUT_DUTY_MEM1")

const float LUT_D2[16][71] = {..}

///// 


///// LUT H File 

extern const float LUT_D2[LUT_P_MAX+1][LUT_Vr_MAX+1];

//////


///// CLA memory config 


void initCLA(void)
{
    //
    // Copy the program and constants from FLASH to RAM before configuring
    // the CLA
    //
#if defined(_FLASH)
    memcpy((uint32_t *)&Cla1ProgRunStart, (uint32_t *)&Cla1ProgLoadStart,
           (uint32_t)&Cla1ProgLoadSize);
    memcpy((uint32_t *)&Cla1ConstRunStart, (uint32_t *)&Cla1ConstLoadStart,
        (uint32_t)&Cla1ConstLoadSize );

    memcpy((uint32_t *)&LUTRUNSTART, (uint32_t *)&LUTRUNSTART,
        (uint32_t)&LUTRUNSTART );

//    memcpy(&LUTRUNSTART,&LUTRUNSTART,(Uint32)&LUTRUNSTART);

#endif //defined(_FLASH)

    //
    // CLA Program will reside in RAMLS0 and data in RAMLS1, RAMLS2
    //
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS2, MEMCFG_LSRAMMASTER_CPU_CLA1);

    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS4, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS5, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS6, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS7, MEMCFG_LSRAMMASTER_CPU_CLA1);


    MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_PROGRAM);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_PROGRAM);

    MemCfg_setCLAMemType(MEMCFG_SECT_LS2, MEMCFG_CLA_MEM_DATA);

    MemCfg_setCLAMemType(MEMCFG_SECT_LS4, MEMCFG_CLA_MEM_DATA);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS5, MEMCFG_CLA_MEM_DATA);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS6, MEMCFG_CLA_MEM_DATA);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS7, MEMCFG_CLA_MEM_DATA);

//
// Suppressing #770-D conversion from pointer to smaller integer
// The CLA address range is 16 bits so the addresses passed to the MVECT
// registers will be in the lower 64KW address space. Turn the warning
// back on after the MVECTs are assigned addresses
//
#pragma diag_suppress=770

    //
    // Assign the task vectors and set the triggers for task 1
    // and 8
    //
    CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_1, (uint16_t)&Cla1Task1);
//    CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_2, (uint16_t)&Cla1Task2);
    CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_8, (uint16_t)&Cla1Task8);
    //CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_ADCA1);
//    CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_ADCB1);
    CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_EPWM7INT);
//    CLA_setTriggerSource(CLA_TASK_2, CLA_TRIGGER_EPWM7INT);
    CLA_setTriggerSource(CLA_TASK_8, CLA_TRIGGER_SOFTWARE);

#pragma diag_warning=770

    //
    // Enable Tasks 1 and 8
    //
//    CLA_enableTasks(CLA1_BASE, (CLA_TASKFLAG_1 | CLA_TASKFLAG_2| CLA_TASKFLAG_8));
    CLA_enableTasks(CLA1_BASE, (CLA_TASKFLAG_1 | CLA_TASKFLAG_8));

    //
    // Force task 8, the one time initialization task
    //
    CLA_forceTasks(CLA1_BASE, CLA_TASKFLAG_8);
}


//////////////


////// Linker File 
   RAMLS4_7           : origin = 0x0000A000, length = 0x00002000
   
   FLASH_BANK1_SEC567  : origin = 0x095000, length = 0x003000

      LUT_MEM_RAM1        : LOAD = FLASH_BANK1_SEC567,
 	  RUN = RAMLS4_7,
      LOAD_START(LUTLOADSTART),
      RUN_START(LUTRUNSTART),
      LOAD_SIZE(LUTLOADSIZE)
	  ALIGN(8)



/////// CLA Program 

#include "TPS_LUT.h"
float Lut_test;


__attribute__((interrupt)) void Cla1Task1(void)
{
// x,y two uint16_t values with correct limits 
Lut_test = LUT_D2[x][y];


///////



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

    尊敬的 Jason:

    让我看看这一点、我很快就会做出回应。

    此致、

    Ozino

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

    您好 Ozino、

    发现我的代码中有一个错误  

      Memcpy ((uint32_t *)&LUTRUNSTART、(uint32_t *)&LUTRUNSTART、
        (uint32_t )& LUTRUNSTART );

    应为  

      Memcpy ((uint32_t *)&LUTRUNSTART、(uint32_t *)&LUTLOADSSTART、
        (uint32_t )& LUTLOADSIZE );

    但在修复上述行时仍然看到延迟  


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

    尊敬的 Jason:

    我怀疑您的链接器设置不正确。

    您能否确认如何映射 CLA 特定存储器段(暂存区,BSS_CLA、CONST_CLA)。 我也注意到您尝试启用 CLA1Task2、但它未在您的应用中定义(注释掉)。 您是否也可以确认是否将任务 8 用作正常任务或后台任务。 如果用作后台任务、则需要调用不同的 API 以通过这种方式进行设置。 有关更多详细信息、请参阅末尾的学院链接。  

    请注意、C2000 CLA 示例应该演示我提出的各种问题。

    请参考本指南以确保 在应用中正确启用 CLA: /cfs-file/__key/communityserver-discussions-components-files/171/CLAProjectStructureUG.pdf 

    您还可以参阅 CLA Academy 一节、了解如何配置 CLA。

    https://dev.ti.com/tirex/explore/node?node=A__ASh.QBtmaD.DbEzgWFwnEw__C28X-ACADEMY__1sbHxUB__LATEST

    此致、

    Ozino

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

    “您能否确认如何映射 CLA 特定存储器段(暂存区,BSS_CLA、CONST_CLA)“

    我将 CLA 程序存储在 LS0-1 中、将非数组数据存储在 LS2 中。 这些阵列放置在 LS4-7 中。 这似乎是正确的映射(请参见图片)。

    “启用 CLA1Task2、但未在应用程序中定义(注释掉)“

    CLA1Task2 目前没有在我的程序中使用、应该在所有地方进行注释、我认为是这样。  

    “您是否也可以确认是否将任务 8 用作正常任务或后台任务。“

    任务 8 是用于进行变量初始化并在启动时调用一次的正常任务。  

    从装配体看、单次读取后有大量 MNOP。 即使 CPU 没有主动读取或写入此存储器范围、我是否也可能遇到仲裁问题? 或者、我知道各种 CLA 流水线问题、例如写读问题、但我只在这里进行读操作、因此不会认为这可能是个问题。

    再次感谢、
    Jason




    	.dwpsn	file "../CPU1CLA1_cla_VS.cla",line 564,column 5,is_stmt,isa 0
            MMOVIZ    MR1,#0                ; [CPU_FPU] |564| 
    	.dwpsn	file "../CPU1CLA1_cla_VS.cla",line 563,column 5,is_stmt,isa 0
            MMOV16    @clav,MR3             ; [CPU_FPU] |563| 
    	.dwpsn	file "../CPU1CLA1_cla_VS.cla",line 564,column 5,is_stmt,isa 0
            MMOVXI    MR3,#102              ; [CPU_FPU] |564| 
            MMOVZ16   MR2,@LUTP_cla         ; [CPU_FPU] |564| 
            MLSL32    MR2,#16               ; [CPU_FPU] |564| 
            MASR32    MR2,#16               ; [CPU_FPU] |564| 
    $C$L21:    
            MMOVXI    MR1,#1                ; [CPU_FPU] |564| 
            MAND32    MR1,MR1,MR3           ; [CPU_FPU] |564| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MBCNDD    $C$L22,EQ             ; [CPU_FPU] |564| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            ; branchcc occurs ; [] |564| 
            MADD32    MR0,MR0,MR2           ; [CPU_FPU] |564| 
    $C$L22:    
            MLSL32    MR2,#1                ; [CPU_FPU] |564| 
            MLSR32    MR3,#1                ; [CPU_FPU] |564| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MBCNDD    $C$L21,NEQ            ; [CPU_FPU] |564| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            ; branchcc occurs ; [] |564| 
            MMOVZ16   MR2,@LUTV_cla         ; [CPU_FPU] |564| 
            MLSL32    MR2,#1                ; [CPU_FPU] |564| 
            MADD32    MR2,MR2,MR0           ; [CPU_FPU] |564| 
            MMOV16    MAR0,MR2,#LUT_D2      ; [CPU_FPU] |564| 
            MNOP      ; [CPU_FPU] 
    	.dwpsn	file "../CPU1CLA1_cla_VS.cla",line 569,column 5,is_stmt,isa 0
            MMOVIZ    MR0,#15523            ; [CPU_FPU] |569| 
            MMOVXI    MR0,#55050            ; [CPU_FPU] |569| 
    	.dwpsn	file "../CPU1CLA1_cla_VS.cla",line 564,column 5,is_stmt,isa 0
            MMOV32    MR2,*MAR0             ; [CPU_FPU] |564| 
            MMOV32    @LUT_Test,MR2         ; [CPU_FPU] |564| 

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

    您好、

    基于 CLA 架构、需要 MNOP。 我们需要确保插入正常的流水线延迟、因为 CLA 没有受保护的流水线、因此需要 NOP 以确保正确进行写操作、然后进行读取。  

     CLA 存储器或寄存器访问所需的 MNOP 指令 

    您能否确认是否启用了优化? 我相信当使用优化 (-O2) 时、NOP 会被其他指令取代。  TMS320F2837x CLA MNOP 

    此致、
    Ozino

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否确认是否启用了优化? 我相信当使用优化 (-O2) 时、NOP 会被其他指令所取代。

    优化在 2 — 全局优化中打开  



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

    使用优化-O2 时、您是否注意到性能有所提高? 您看到减少了多少个 NOP?

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

    抱歉、应该已澄清。 我一直在 O2 处进行优化。 我之前的结果是在 O2 上

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

    我将这篇文章转发给编译器团队以供进一步评论。

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

    尊敬的 Jason:

    您能否确认系统初始化正确无误。 我们的编译器团队已确认、启用优化后、使用 MNOP 指令的可能性较小、但没有消除。 MNOP 指令只能占几个周期、而不能占数百个周期。  因此、我怀疑系统配置一定有问题。

    您可以尝试使用我们的 CLA 示例作为入门模板、以确保您已正确配置器件。  

    您还可以参考此文件中的步骤以确保正确完成 CLA 设置。  /cfs-file/__key/communityserver-discussions-components-files/171/CLAProjectStructureUG.pdf 

    此致、

    Ozino