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**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1071017/tms320f28379d-calling-a-function-with-many-arguments-in-cla

部件号:TMS320F28379D

尊敬的 TI 您好,

 

我正在使用 CLA 来使用一个具有许多参数的函数来计算调节循环。  

我的函数接受结构输入。 我正在尝试初始化(引用并启用) main.c 中断服务例程中结构的一部分。

我的函数是内联函数:

static inline void RST_Regulor(float R_Input, float S_Input, float T_Input,
                               uint16_t Enable, float oldActu, float *Output)
{
    uint16_t i;
    /*******************************************
     *             Compute T polynome          *
     *******************************************/
     /* Shift the delay line to the right by 1 */
    for(i = SIZE_OF_T-1; i > 0; i--)
    {
        /*shift*/
        Poly_T[i] = Poly_T[i-1];

        /*Multiplication and Addition*/
        T  += coef_t[i] * Poly_T[i];
    }
    /* Get adc physical input into start of the delay line */
    /* note the adc input is simulated in software */
    if (Enable == 1)
    {
        Poly_T[0] = T_Input; //reference
    }
    else
    {
        Poly_T[0] = R_Input; //measured
    }
    
    /*Add the first param */
    T  += coef_t[0] * Poly_T[0];

    /*******************************************
     *             Compute R polynome          *
     *******************************************/
    /* Shift the delay line to the right by 1 */
    for(i = SIZE_OF_R-1; i > 0; i--)
    {
        /*shift*/
        Poly_R[i] = Poly_R[i-1];

        /*Multiplication and Addition*/
        R   += coef_r[i] * Poly_R[i];
    }
    /* Get adc physical input into start of the delay line */
    /* note the adc input is simulated in software */
    Poly_R[0] = R_Input;
    R  += coef_r[0] * Poly_R[0];

    /*******************************************
     *             Compute S polynome          *
     *******************************************/
     //Shift the delay line to the right by 1
    for(i = SIZE_OF_S-1; i > 0; i--)
    {
        /*shift*/
        Poly_S[i] = Poly_S[i-1];

        /*Multiplication and Addition*/
        S   += coef_s[i] * Poly_S[i];
    }
    /* Get adc physical input into start of the delay line */
    /* note the adc input is simulated in software */
    Poly_S[0] = oldActu;
    S  += coef_s[0] * Poly_S[0];

    /**** Result*****/

    if(Enable == 1)
    {
        /* Regulation output if enable*/
        *Output = (T - R - S) * INVERS_S0;
    }
    else
    {
        /* Old value if RST regulation is not enabled */
        *Output = oldActu;
    }
    
}

我正在使用以下映射:

    #pragma DATA_SECTION(coef_r,"RAMLS4")
    const float coef_r[SIZE_OF_R] = {0.2483687f, 0.03341229f, -0.2149564f};
    
    #pragma DATA_SECTION(Poly_R,"RAMLS4")
    float Poly_R[SIZE_OF_R];
    
    #pragma DATA_SECTION(coef_s,"RAMLS4")
    const float coef_s[SIZE_OF_S] = {0.1058185f, -0.06386142f, -0.01921073f, -0.02274637f};
    
    #pragma DATA_SECTION(Poly_S,"RAMLS4")
    float Poly_S[SIZE_OF_S];
    
    #pragma DATA_SECTION(coef_t,"RAMLS4")
    const float coef_t[SIZE_OF_T] = {0.06682458f};
    
    #pragma DATA_SECTION(Poly_T,"RAMLS4")
    float Poly_T[SIZE_OF_T];
    
    #pragma DATA_SECTION(R,"RAMLS4")
    float R;
    #pragma DATA_SECTION(S,"RAMLS4")
    float S;
    #pragma DATA_SECTION(T,"RAMLS4")
    float T;

问题是,当我使用___mdebugstop()调试 CLA 时,我的多项同步保利_R, 保利_S 和保利_T 为空。

顺便提一下,这个代码已经在 C28 CPU 中执行了,它也能正常工作。我的多项功能 为空。

2.我无法理解的另一件事是,结构部分草签了。

例如,引用变量会受到影响,但使能变量不会受到影响。

 sDCDCConfig.CurrentRef    = Ref;   
 sDCDCConfig.EnableControl = Enable;
 

我正在使用21.6 C2000编译器。

CLA 代码如下:

#pragma DATA_SECTION(sDCDCConfig,"CpuToCla1MsgRAM");
#pragma DATA_SECTION(DutyCycleMan,"Cla1ToCpuMsgRAM");
ST_DcDcConfiguration    sDCDCConfig;
float DutyCycleMan;

    //__mdebugstop();
    /* RST regulation */
    RST_Regulor(IDC_CLA,                    //R
                CLA_StaActu,                //S
                sDCDCConfig.CurrentRef,     //T
                sDCDCConfig.EnableControl,  //enable
                CLA_StaActu,                //old actuation
                &DutyCycleMan);             //RST output regulation

提前感谢您,

S.Tarik

//由 tarik le 2022年21月01日 编辑

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

    您好,S.Tarik

    您是否已将这些 LS RAM 所有权配置为 CLA? 变量/结构是在.c 文件还是.CLA 文件中初始化的?

    此致,

    维纳

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

    您好,维纳,

    我单击“这解决了我的问题”时出错,我的问题已经存在。

    可以吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="128297" url="~/support/icros/c2000微控制器-group/c2000 /f/c2000微控制器-forume/10717/tms320f28379d-calling-a function-with many-arguments-In-CLA/3964024#3964024"]您是否已将这些 LS RAM 所有权配置为报价?[/CLA]

    是的,我做到了:

           MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;
           MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 1;
    
           MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1;
           MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 0;

    我使用 LS4RAm 作为 prog,而 LS3RAM 用于数据。

    [引用 userid="128297" url="~ë/support/icpers/c2000-icroms-group/c2f/c2000-微控制器-forume/10717/tms320f28379d-call-a-function-with man-argum-存在于 CLA/3964024#3964024"]在.c/structc/文件中初始化的变量是否为.[]?

    结构在.c 中被部分初始化,并驻留在 Cpu1ToClax1MSG 中

    还有一个问题:

    我的函数是内联函数,我是否应该添加类似这样的 memcpy?

    //       memcpy((uint32_t *)&Cla1ConstRunStart, (uint32_t *)&Cla1ConstLoadStart,
    //           (uint32_t)&Cla1ConstLoadSize );

    我的.cmd 文件中没有 Cla1ConstRunStart,Cla1ConstLoadStart 和 Cla1ConstLoadSize 变量。

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

    您好,

    [引用 userid="300446" url="~/support/icros/c2000微控制器-group/c2000 /f/c2000微控制器-forum/1071017/tms320f28379d-calling-a-function-with man-argum-存在于 CLA/3964036#3964036"]线程,请打开吗?

    回复线程时,线程将自动重新打开。

    [引用 userid="300446" url="~/support/icros/c2000微控制器-group/c2000 /f/c2000微控制器-forum/1071017/tms320f28379d-calling-a-function-with many-arguments-in-CLA/3964080#3964080"]我是否应该添加类似这样的模块?[/quote

    如果要独立于 Flash 运行代码,则需要执行此操作。 如果 您的 CLA 代码中有常量,则需要将常量加载到 Flash 中并从 RAM 运行。 这是因为 CLA 无法访问闪存。

       .const_cla       :   LOAD = FLASH2,
                            RUN = RAMLS1,
                            RUN_START(Cla1ConstRunStart),
                            LOAD_START(Cla1ConstLoadStart),
                            LOAD_SIZE(Cla1ConstLoadSize)

    要将内容从 Flash 复制到 RAM,需要使用 memcpy。 默认情况下不会执行此操作。 您可以检查.map 文件以查看是否有任何字节分配给 const_CLA 部分。 变量的初始值可能存储在 const_CLA 部分中。

    请注意,您无法初始化.CLA 文件中的全局变量。 您只能在任务内初始化它们

    此致,

    维纳

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

    我使用的是位于 LSRAM4中的 const float 选项卡[],我这样做是因为我不知道 在我正在处理的项目中,const 变量在默认情况下位于何处。  

        #pragma DATA_SECTION(coef_r,"CpuClaData")
        const float coef_r[SIZE_OF_R] = {0.2483687f, 0.03341229f, -0.2149564f};
        
        #pragma DATA_SECTION(Poly_R,"CpuClaData")
        float Poly_R[SIZE_OF_R];
        
        #pragma DATA_SECTION(coef_s,"CpuClaData")
        const float coef_s[SIZE_OF_S] = {0.1058185f, -0.06386142f, -0.01921073f, -0.02274637f};
        
        #pragma DATA_SECTION(Poly_S,"CpuClaData")
        float Poly_S[SIZE_OF_S];
        
        #pragma DATA_SECTION(coef_t,"CpuClaData")
        const float coef_t[SIZE_OF_T] = {0.06682458f};
        
        #pragma DATA_SECTION(Poly_T,"CpuClaData")
        float Poly_T[SIZE_OF_T];
        
        #pragma DATA_SECTION(R,"Cla1ToCpuMsgRAM")
        float R;
        #pragma DATA_SECTION(S,"Cla1ToCpuMsgRAM")
        float S;
        #pragma DATA_SECTION(T,"Cla1ToCpuMsgRAM")
        float T;
        
    #endif

    CpuClaData = LS4RAM

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

    您好,

    问题是否也存在于孔阵列中,或者仅存在于 Poly_R,Poly_S, Poly_T 中?

    是否可以共享使用的链接程序命令文件?

    此致,

    维纳

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

    当我将 float const 表(如 coef)添加到监视窗口时,我可以看到内容,但 Poly_R S ant T 始终为空。

    代码必须移动 Poly_R S 和 T 中的输入值。当我手动将值添加到 Poly_R S 和 T 时,缓冲区不移动,看起来代码没有运行。  

    我有另一个内联函数读取 ADC,计算物理值并使输出饱和,这些函数在 CLA 中执行得很好,但该调节不起作用,而 poly R S 和 T 始终为空。

    [引用 userid="128297" url="~ë/support/intrles/c2000-icro-group/c2000 /f/c2000微控制器-forume/10717/tms320f28379d-calling-a-function-with man-argum-ine-CLA/3964215#3964215"]您是否可以共享所用的链接器命令文件?

    我希望我能做到这一点!

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

    在 const_CLA 部分,负载必须来自 FLASH2,

    选择基于什么?

    我不知道为什么我要放置 FLASH2或 FLASH3 ...

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

    您好,

    您可以根据需要更改内存区域。 但请注意,如果要将 CLA_CONst 放入 Flash,则需要使用 cmd 文件中的 memcpy 和 load_run 功能将其复制到 RAM 位置

    此致,

    维纳