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.

[参考译文] CCS:CLA 编译错误 CodeComposer v 7.3

Guru**** 2041660 points
Other Parts Discussed in Thread: TMS320F28035, CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/761729/ccs-cla-compiling-error-codecomposer-v-7-3

主题中讨论的其他器件:TMS320F28035controlSUITE

工具/软件:Code Composer Studio v 7.3 TMS320F28035项目

Code Composer Studio v 7.3、 TMS320F28035项目

您好!  我使用混合 CLA 汇编器和 CLA C 文件制作了项目。 结果、如果 CLA C 代码大小大于550个命令(在"汇编器"视图中)、则会在 MVECT 和 程序空间中给出错误的位置。 如果 CLA C 代码的大小低于550条命令、则编译良好。

也就是说,  我在编译相同的代码后收到的代码,只有在错误的代码中,我添加了许多 MNOP 命令以克服550的大小

Cla1Task3是 C 函数 ,两个变体(好的和坏的)的稳定 MVECT 都是指示性的:

  EALLOW;
  Cla1Regs.MVECT1 =(uint16)(&Cla1Task1 -&Cla1Prog_Start)* sizeof (uint32);
  Cla1Regs.MVECT2=(uint16)(&Cla1Task2 -&Cla1Prog_Start)* sizeof (uint32);
  Cla1Regs.MVECT3 =((UINT16)(Cla1Task3)-(UINT16)&Cla1Prog_Start);   //这是 C 函数


  Cla1Regs.MVECT4 =(uint16)(&Cla1Task4 -&Cla1Prog_Start)* sizeof (uint32);
  Cla1Regs.MVECT5 =(uint16)(&Cla1Task5 -&Cla1Prog_Start)* sizeof (uint32);
  Cla1Regs.MVECT6 =(uint16)(&Cla1Task6 -&Cla1Prog_Start)* sizeof (uint32);
     Cla1Regs.MVECT7 =((UINT16) Cla1Task7 -(UINT16)&Cla1Prog_Start); //这是 C 函数
  Cla1Regs.MVECT8 =(uint16)(&Cla1Task8 -&Cla1Prog_Start)* sizeof (uint32);

  //将 CLA 程序代码从其加载地址复制到 CLA 程序存储器
  //完成后、将程序存储器分配给 CLA
  //
  //确保分配之间至少有两个 SYSCLKOUT 周期
  // CLA 的存储器以及中断进入的时间
  //即使加载和运行地址相同,也调用此函数!
  Memcopy (&Cla1funcsLoadStart、&Cla1funcsLoadEnd、&Cla1funcsRunStart);

这是 MNOPS 的代码,编译不当,无法正常工作:

中断空 Cla1Task3 (空)

   _mdebugstop();

//===========  下面填充 DCAC 和 PFC 的 ADC 变量


   dwInv_Voltage=(AdcResult.ADCRESULT11 - AdcResult.ADCRESULT10)<< 12; // A0-B0通道10 usin out
   dwInv_Current_1=(AdcResult.ADCRESULT7 - AdcResult.ADCRESULT6)<< 12;// A2-B2 通道 6 isin out
   VBUS=AdcResult.ADCRESULT14 <<12;// Vbus A15通道14
   SubA1B1=(AdcResult.ADCRESULT4 -AdcResult.ADCRESULT5)<<13; //使用中的不同
   VL_fb=AdcResult.ADCRESULT4 << 13; // Vsin 实数
   SubA3B3=(AdcResult.ADCRESULT8 -AdcResult.ADCRESULT9)<<13; //以不同的方式显示

//  这是 MATH_EMAVG_CLA.h 中 用于定义 VbusFloat 和 Vbus 平均值的数据
//m.out =(((m.in - m.out)* m.M.Multiplier)+ m.out)
   VbusFloat=(float)(AdcResult.ADCRESULT14);
   VbusFloat=VbusFloat* 0.000244140625   ;//I2 乘以1/(2^12)将其转换为标么浮点
   VbusAvgFloat =(((VbusFloat - VbusAvgFloat)* VbusAvgMultiplier)+ VbusAvgFloat);
   VbusAvg=(无符号长整型)(VbusAvgFloat * 16777216);




//从 PFC_BL_ICMD_CLA_C.h
   /**
   *使用 PFC 升压开关感应为 PFC 级执行电流命令计算。  这个宏
   *需要使用 PFC_BL_ICMD_CLA_C 结构。  应初始化结构
   *使用 PFC_BL_ICMD_CLA_C_init 宏。  宏使用计算值的倒数
   *_meinvf32 CLA C 内在函数。  所述内在函数牺牲了中的一些浮点精度
   *减少时钟周期。  如果需要更高的精度或泛化、请更改
   *常规除法运算符的内在函数。
   *
   
//   v.out = v.Vpfc * v.VoutMaxOverVinMax * v.Duty;
//   v.out =(v.out > limit_pFC_BL_ICMD)? V.out:limit_PFC_BL_ICMD;
//   v.out =(v.VacRect * v.VinSqr * v.Vcmd * v.VmaxOverVmin)*__meminf32 (v.out)   *((v5.Vpfc * v.VoutMaxOverVinMax)- v.VacRect);
   DutyFloat=((float)(DutyA))*0.000000059604644775390625;
   VrectFloat=((float)(Vrect))*0.000000059604644775390625;
   VbusVcmdFloat=(float)(VbusVcmd)*0.000000059604644775390625;

   PFCcmdFloat = VbusFloat * VoutMaxOverVinMax * DutyFloat;
   PFCcmdFloat =(PFCcmdFloat > limit_PFC_BL_ICMD)? PFCcmdFloat:limit_PFC_BL_ICMD;
   PFCcmdFloat =(VrectFloat * VinvSqr_c * VbusVcmdFloat * VmaxOverVmin)*_meinvf32 (PFCcmdFloat)   *(((VbusFloat * VoutMaxOverVinMax)- VrectFloat);
   PFCCMD=(无符号长整型)(PFCCMDFloat * 16777216);
   //sine_analyzer.Vin=0;
//========================================  正弦振幅器仅在非2P2Z 2时工作(电压控制请查看 blpfc_isr_cla.asm====
//===========  从 c:\ti\controlSUITE\libs\app_libs\solar\v1.2\cla\include\SINEAALYZER_DIFF_wPWR_CLA.h==

   if (VloopCtrla == VoltCurrent LoopExecRatio){

      if (sine_analyzer.Vin > sine_analyzer.Threshold)
      {
         Sine 分析器.CURR_VIN_NORM = Sine 分析器.Vin;
         Sine 分析器.CURR_iin_norm = Sine 分析器.Iin;
         Sine 分析器.CURR_SIGN = 1;
      }
      其他
      {
         Sine 分析器.CURR_VIN_NORM =晶圆(sine_analyzer.Vin);
         Sine 分析器.CURR_iin_norm =晶圆(sine_analyzer.Iin);
         Sine 分析器.CURR_SIGN = 0;
      }


   }否则
//================================================================  vinvSqr ========================================
   /**计算缩放输入信号的回波平方。
    从 BLPFC_invrmssqr_cla_c.h @返回 structure out 参数。    *
//===========   使用2P2Z 2 (电压控制)进行 Sine _ANALOR 作业后的下一个 tact 上的 VinVsqr 计算

   {

   VrectRmsFloat=(float)(VrectRMS);
   VrectRmsFloing=VrectRmsFloing*0.000000059604644775390625;
   VinSqr_c =(PFC_InvRmsSqr_Vmin1_CLA > VrectRmsFloat)? PFC_InvRmsSqr_Vmin1_CLA:VrectRmsFloat;
   vinvSqr_c =__meinvf32 (vinvSqr_c)* pFC_InvRmsSqr_VminOverVmax1_CLA;
   vinvSqr_c = vinvSqr_c * vinvSqr_c;
   vinvSqr_c =((vinvSqr_c < limit_PFC_INVRMSSQR)? vinvSqr_c:limit_pFC_INVRMSSQR);
   vinvSqr=(unsigned long)(vinvSqr_c * 16777216);
   }
   _mnop ();   __mnop ();   __mnop ();   __mnop ();__mnop ();   __mnop ();    _mnop ();   __mnop ();   __mnop ();   __mnop ();__mnop ();   __mnop ();
   _mnop ();   __mnop ();   __mnop ();   __mnop ();__mnop ();   __mnop ();    __mnop();   __mnop();   __mnop();
   



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

    已指派工程师、并将很快作出响应。

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

    你好。 我在.cmd 文件中进行了细微更改 、此修复情况:

    _Cla1Prog_Start =_Cla1funcsRunStart;
    --undef_sym=__cla_scratchpad_end
    --undef_sym=__cla_scratchpad_start

    存储器

    之后 、在 0x9000上设置了 Cla1Prog_Start、并且其他 CLA 函数均已编解码且正确排列。 程序工作正常。  这样我就解决了我的问题、但问题可能还没有解决、为什么编译器在一种情况下更改了 Cla1Prog_Start 地址而不在 cmd 中添加该地址、并将其正确地放置在另一种情况下。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    除非在链接器命令文件中进行了修改、否则该符号地址不应更改。

    我不知道为什么你看到你做了什么。 只要代码适合链接器部分、就可以正常运行。

    为了提供更好的答案、我认为我需要更多有关您所看到内容的信息。

    很高兴您能正常工作。
    SAL