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.

[参考译文] TMS320F28379D:CLA 问题

Guru**** 2539500 points
Other Parts Discussed in Thread: TIDM-02009

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1534805/tms320f28379d-cla-issues

部件号:TMS320F28379D
主题中讨论的其他器件:TIDM-02009

工具/软件:

德州仪器团队、

我们正在处理一个类似于“ TINV_F28379D “但我对应该在 CLA 中运行的代码有一些问题。 我的链接器文件几乎与 “TINV_F28379D"中“中的文件相同。 编译 “TINV_F28379D"工程“工程时、我可以看到  TINV_runISR1_lab7 () 函数在 Cla1Task1 () 中调用的一些函数将加载到为分配的 RAMLS 存储器中 第 1 款程序 如下图所示。

在我们的工程中、我们对 CLA 设置执行的操作与“TINV_HAL_setupcla ()“中相同、我已确认当我在 Cla1Tak1 () 函数中调用最小函数时、CLA 可以正常工作、但我没有看到任何其他函数加载到 Cla1Prog 中、如下图所示。

在我的 Cla1Task1 () 中运行的函数与'TINV_F28379d'工程中的函数相似、但我的函数无法正常工作。 以下行导致 CLA 停止工作。

SPLL_1PH_SOGI_run(&spll1, pfc_ac_vol_sensed_pu);
...
gi_controller_out = GI_RUN(&gi_controller, pfc_ac_cur_sensed_pu, pfc_ac_cur_ref_inst_pu);
pfc_dutyPU = (gi_controller_out + (pfc_ac_vol_sensed_pu * ref_idx)) / (pfc_vBus_sensed_pu);
...
if(pfc_vBusMeasBuffIndex >= 10)
	pfc_vBusMeasBuffIndex = 0;
...

感谢您的反馈、以便让这个项目正常工作。

此致、
Wilson

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

    您好、Wilson:

    感谢您的提问。 我正在与设计所有者联系、并将很快回复。 感谢您的耐心。

    此致、

    Ozino

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

    您好、Wilson:

    能否仔细检查链接器命令文件与  TINV_HAL_setupCLA ()  函数。 从屏幕截图中可以看出、您似乎正在将 CLA 程序存储器加载到 RAM LS2-LS5 中。 请确保您以类似的方式配置了 CLA 存储器以确保没有中断。  

    请注意除 CLA1Prog 存储器段之外、与 CLA 数据存储器关联的 CLA 暂存区、controlVariables 和.bss 段。

    此致、

    Ozino

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

    嗨、Wilson、

    感谢您的代码。 您能否确认闪存或 RAM 是否耗尽? 您的开始映射到 RAM 启动、但看起来已将应用程序设置为从闪存运行。 解析引导加载程序后、是否分支到 main 例程的开头? 您是否正确初始化了主代码中的闪存?

    您能否确认观察到的行为? 您是否能够在 CLA 任务中设置断点并单步执行代码?

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/debugging.html CLA 调试提示。

    此致、

    Ozino

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

    Ozino、

    从闪存运行。 首先映射到 RAM 完全是一个错误,感谢指出了这一点。

    关于闪存初始化、我们如何在器件初始化过程中执行此操作:

    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize);
    InitFlash();     // Call the flash wrapper init function from F2837xD_sysCtrl.c

    根据我之前所述的行为、在某些特定条件下、我可以设置断点并调试 CLA。 有几行代码在进行注释后、允许我调试 CLA 内部的代码。

    以下是我们的 CLA 任务:

    __attribute__((interrupt))  void Cla1Task1 ( void )
    {
    #if(CLA_DEBUG == 1)
        __mdebugstop();
    #endif
    
    
    #if PM_CONTROL_RUNNING_ON == CLA_CORE
        PFC_RUN_HF();
        PH_L2_PWM_CH.ETCLR.bit.INT = 1;     // Clears PWM2 interrupt flag.
    #endif
    
    #if(CLA_DEBUG == 1)
        __mdebugstop();
    #endif
    
    }

    下面是我们的控制函数:
    #pragma FUNC_ALWAYS_INLINE(PFC_RUN_HF)
    static __inline void PFC_RUN_HF(void)
    {
        //
        //Read Current and Input Voltage Measurements.
        //
        GpioDataRegs.GPASET.bit.GPIO13 = 1;
    
        PM_ReadACReturnCurrent();
        PM_ReadReturnACVoltages();
        PFC_SPLL();
        PFC_AC_CurrentRef();
        PFC_RunCurrentLoop();
        PFC_PwmDriver();
        if(start_pwm_update_flag == 1)
        {
            HAL_PFC_UpdatePWM(pfc_dutyPU, pfc_phase2ScaleFactor, l2_out_pi);
        }
        PFC_AdaptiveDeadTime();
    
        //
        //Read BUS voltage sensed result.
        //
        PM_ReadBusVoltage();
        pfc_vBusMeasBuff_pu[pfc_vBusMeasBuffIndex++] = pfc_vBus_sensed_pu;
        if(pfc_vBusMeasBuffIndex >= 10)
        {
            pfc_vBusMeasBuffIndex = 0;
        }
        acFreq_lpf = acFreq_lpf+(spll1.fo-acFreq_lpf)*0.00005f;
        GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;
    }

    出现问题的代码行:

    SPLL_1PH_SOGI_run(&spll1, pfc_ac_vol_sensed_pu);
    ...
    gi_controller_out = GI_RUN(&gi_controller, pfc_ac_cur_sensed_pu, pfc_ac_cur_ref_inst_pu);
    pfc_dutyPU = (gi_controller_out + (pfc_ac_vol_sensed_pu * ref_idx)) / (pfc_vBus_sensed_pu);
    ...
    PFC_PwmDriver();
    pfc_vBusMeasBuff_pu[pfc_vBusMeasBuffIndex++] = pfc_vBus_sensed_pu;
    if(pfc_vBusMeasBuffIndex >= 10)
    	pfc_vBusMeasBuffIndex = 0;
    ...

    我猜问题的一部分是 CLA 无法访问一些变量/函数,或者某种程度上这些代码行/函数无法正确编译,但是除了将控制变量放在#pragma SET_DATA_SECTION(“ controlVariables“)…#pragma SET_DATA_SECTION () 中之外,我看不到还有什么要做的。

    我重申一下、我可以在特定条件下调试 CLA、但不能在我尝试运行完全控制功能时进行调试。

    此致、
    Wilson

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

    您好、Wilson:  

    给你一个问题的代码,它是 PFC_SPLL 函数 () 的一部分吗? 请让我知道它们在控制功能中的哪些功能中存在。

    您能否确认仅从 C28x 内核运行时代码是否按预期运行。

    您能否确认问题代码中显示的所有变量是否都包含在“controlVariables"的“的 data_section 中。

    我还注意到、dclfuncs 映射到.cmd 文件中 Cla1Prog 所在的同一段。 我认为这些 API 调用是根本原因的一部分。

    您会发现、在 TI 提供的示例中并非如此。 您是否可以像在 tidm_02009 示例中所做的那样、为其创建一个单独的部分。

    此外、此处还提供了一个指向说明如何在现有应用中启用 CLA 的文档的链接。 请阅读涉及 dclfun 和 isrcodefuncs 的各节。

    /cfs-file/__key/communityserver-discussions-components-files/171/CLAProjectStructureUG.pdf 

    如果您有任何其他问题、请告诉我。

    此致、

    Ozino

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

    Ozino、

    感谢您跟进此问题。

    以下是未进行注释时会使 CLA 停止工作的一些行:
    SPLL_1PH_Sogi_run (&spll1、PFC_ac_vol_sensed_pu);此行在 PFC_SPLL () 函数中调用、我认为调用函数和访问 spll1 结构引起了问题。

    gi_controller_out = gi_run (&gi_controller、pfc_ac_cur_sensed_pu、pfc_ac_cur_ref_inst_pu);
    PFC_dutyPU =(gi_controller_out +(PFC_ac_vol_sensed_pu * ref_idx)/(PFC_vBus_sensed_pu);

    以上两行代码位于 PFC_RunCurrentLoop() 函数内。 调用 gi_run() 函数并访问 gi_controller 结构是导致问题的原因。

    PFC_PwmDriver();
    PFC_vBusMeasBuff_PU[PFC_vBusMeasBuffIndex+]= PFC_vBus_sensed_pu;
    IF (PFC_vBusMeasBuffIndex >= 10)

    以上三行在 PFC_run_hf () 函数内。 它似乎是从 PFC_PwmDriver () 函数调用任何变量导致了这个问题。 访问数组 PFC_vBusMeasBuff_pu[]并使用逻辑运算符“>="也“也会导致该问题。

    从 C28x 内核运行时、代码运行正常!

    所有 导致此问题的变量都在#pragma SET_DATA_SECTION(“controlVariables")“)...#pragma SET_DATA_SECTION () 部分中。

    我将 dlcfuncs 放置在“TINV_F28379D"工程“工程示例的同一存储器部分中、但我将查看 tidm_02009 示例:

    // tinv_F28379D linker file
    
         GROUP
        {
            isrcodefuncs
            dclfuncs
        }    LOAD = FLASHH,
             RUN =  RAMLS2LS3LS4LS5,
             LOAD_START(isrcodefuncsLoadStart),
             LOAD_SIZE(isrcodefuncsLoadSize),
             LOAD_END(isrcodefuncsLoadEnd),
             RUN_START(isrcodefuncsRunStart),
             RUN_SIZE(isrcodefuncsRunSize),
             RUN_END(isrcodefuncsRunEnd),
             PAGE = 0, ALIGN(4)
    
                           /* CLA specific sections */
        Cla1Prog        : LOAD = FLASHH,
                          RUN = RAMLS2LS3LS4LS5,
                          LOAD_START(Cla1ProgLoadStart),
                          RUN_START(Cla1ProgRunStart),
                          LOAD_SIZE(Cla1ProgLoadSize),
                          PAGE = 0, ALIGN(4)

    最后、我已经阅读了 CLAProjectStructureUG.pdf 指南、并且没有成功就这么遵循。

    此致、

    Wilson

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

    您好、Wilson:

    感谢您的详细答复和反馈。 我将添加 TIDM-02009 参考设计所有者、对这个问题进行评论、看看应用程序方面是否有权变措施。

    您能否确认是否为 isrcodefuncs 添加了 memcpy?

    您是否还能确认您的库中是否包含 DCL 库? 您能否确认 API 调用是否已更新以使用与 CLA 等效的 API 版本。

    您将会注意到、DCL 函数周围存在 基于是否针对 CLA 或 C28 进行编译的保护机制。 请注意、以“_Lx"结尾“结尾的 DCL 函数表示 CLA 目标函数。

    请参阅 DCL 用户指南以了解要使用哪些函数。

    https://dev.ti.com/tirex/explore/node?node=A__AJWaWA2Sb64MnpYgHjEPPQ__C2000WARE__1kRFgrO__LATEST&placeholder=true 

    此致、

    Ozino

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

    Ozino、

    是、我在初始化过程中添加了以下行:
    memcpy (&isrcodefuncsRunStart、&isrcodefuncsLoadStart、(size_t)&isrcodefuncsLoadSize);

    DCL 库应使用 CLA 等效代码:



     

    此致、
    Wilson

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

    您好、Wilson:

    包含 IQmath 库的任何特定原因? 您能否确认您的工程是否是组合位字段和 driverlib 示例? 还是只是位域?

    当您排除有问题的代码行时、能否确认在“Memory Allocation“视图或.map 中引用的 CLAT任务?

    当您包含有问题的代码并尝试在 CLA 上进行调试时、会出现什么行为? 您是否能够单步完成反汇编?  

    您能否在没有问题代码的情况下为有问题的代码包含一份生成的.map 文件的副本?

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/debugging.html -> CLA 调试提示

    此致、

    Ozino

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

    Wilson、

    我正在浏览开放的主题、看到这一个。  您是否能够解决该问题?  

    谢谢、
    Jason

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

    Jason、

    感谢您的联系。 编号 这仍然是一个持续存在的问题。

    此致、

    Wilson

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

    威尔逊, 好的,可能需要一段时间来提炼这个螺纹。  这是否与 tidm 02019 有关、或者只是中间展示的一个示例?  很抱歉、您可以简要总结一下。  我认为这与 CLA 有关、无法加载符号、是这样吗?

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

    Jason、

     TIDM-02019 只是一个示例。 我们正在测试 PFC 实现方案、但在 CLA 上运行代码时遇到问题。 代码最初是在 C28 CPU 上实现的、运行正常、但我们希望通过使用 CLA 运行 PFC 控制律来释放一些处理器时间、并且它不工作。

    此致、

    Wilson

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

    您好、Wilson:

    您是否能够提供一个复制问题的小型项目、以便我最终可以进行调查? 将 CLA 文件和链接器 cmd 文件复制到现有的 CLA 示例中并仅包含导致该问题的结构定义可能更简单。

    此外、查看 CLA 初始化代码的注意事项:

    // Enable CLA clock
    CpuSysRegs.PCLKCR0.bit.CLA1 = 1;
    Cla1Regs.MVECT1 = (uint16_t)(&Cla1Task1);

    启用 PCLK 后、 时钟需要几个周期才能启动、并且能够实际写入该外设中的寄存器、因此此时 CLA PCLK 很可能实际上并不为寄存器写入计时。  在调试器连接的情况下、这不会有问题、因为 GEL 文件会在 OnReset () 函数的前面显式启用 CLA PCLK 本身、但这是应该更改的、以便最终以独立方式运行。 我建议在代码中将 PCLK 启用移至之前的位置。  

    此致、

    Delaney