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.

[参考译文] TMS320F28035:CLA 任务矢量地址在 C 语言和汇编语言中是不同的

Guru**** 2609955 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/688043/tms320f28035-cla-task-vector-address-are-different-in-c-and-assembly-language

器件型号:TMS320F28035
Thread 中讨论的其他器件:controlSUITE

尊敬的 C2000专家:

下图显示了设置为 MVECTx 寄存器的 CLA 矢量地址、我发现这两个设置之间存在一些差异、左侧是以汇编语言编写的 CLA 任务具有乘法 sizeof (UINT32)、而右侧是以 C 编写的 CLA 任务没有 sizeof (UINT32)。

您可以就此发表评论吗?

这两个设置都来自 controlSUITE、路径如下。

C:\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5\CLA_ADC
C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensorless_CLA_F2803x

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

    这两个代码段都不是以汇编语言编写的。 这两个都用 C 代码编写。

    这两个都设置了每个 CLA 任务的起始地址。 在此器件上、CLA 任务程序地址从地址0x0000开始、但在 C28x 存储器映射中它不是0x0000。 因此、该代码从任务的起始地址中减去 CLA 程序存储器的起始地址。

    我相信右边没有* sizeof (uint32)的那个是正确的。

    您能否确认这两个器件是否都正常工作。

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

    是的、两个项目都运行良好。 我不确定发生了什么。

    请注意、左侧的 CLA 任务代码是以汇编语言编写的。 您可以从 controlSUITE 中获取这2个项目、如我的第一篇文章中所示。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以下是任务2的源代码:

    Cla1Task2:
    如果 CLA_DEBUG = 1
    MDEBUGSTOP
    .endif
    ================================================================================================
    ;此任务记录最后一个 NUM_DATA_POINGS
    ;数组 VoltageCLA 中的 ADCRESULT1值

    ;数组中最后一个元素的时间
    ;已填充,任务将返回
    ;第一个元素。

    ;在开始 ADC 转换之前,强制
    ;任务8将 ConversionCount 初始化为零

    ================================================================================================
    MMOVZ16 MR0、@μ_ConversionCount ;1当前转换
    MMOV16 Mar1、MR0、#_VoltageCLA ;2点到 VoltageCLA[转换计数]
    MUI16TOF32 MR0、MR0 ;3将计数转换为 float32
    MADDF32 MR0、MR0、#1.0 ;4向转换计数添加1
    MCMPF32 MR0、#NUM_DATA_POINS.0 ;5将计数与最大值进行比较
    MF32TOUI16 MR0、MR0 ;6将计数转换为 UINT16
    MNOP ;7等待 I8读取结果
    MMOVZ16 MR2、@μ_AdcResult.ADCRESULT1;8读取 ADCRESULT1
    MMOV16 *MAR1,MR2. ;存储 ADCRESULT1
    MBCNDD _RestorartCount、GEQ ;如果 count >= NUM_DATA_POINS
    MMOVIZ MR1、#0.0 ;始终执行:将 MR1加载为0
    MNOP
    MNOP
    MMOV16 @转换计数、MR0 ;如果未进行分支,则存储当前计数
    MSTOP
    _RestorartCount
    MMOV16 @转换计数、MR1 ;如果分支被采用,则重新开始计数
    MSTOP
    MNOP
    MNOP
    MNOP
    Cla1T2End:
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否尝试删除* sizeof (uint32)并查看其是否正常工作。 我认为这是不正确的。

    此致、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它在注释掉* sizeof (uint32)后起作用。

    Cla1Regs.MVECT2 =(uint16)(&Cla1Task2 -&Cla1Prog_Start);//*sizeof (uint32);
    Cla1Regs.MVECT8 =(uint16)(&Cla1Task8 -&Cla1Prog_Start);//*sizeof (uint32);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    MVECTx 寄存器中的值与这2个代码不同。

    这两个器件都能正常工作、这是很奇怪的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是代码中的错误。 它不应具有* sizeof (uint32)。 我将提交一个错误以进行更正。

    我认为它正在处理错误、因为任务8只是初始化转换计数、并且它可能已经初始化为0。 任务1工作正常、因为 Cla1Task1地址和 Cla1Program_Start 地址之间的差异为0。 因此、将其乘以2仍然是0。

    感谢您观看本演示。 我希望解释清楚。

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

    您好 Sal、

    您是否尝试了一边的操作?

    我觉得解释不对。 请参阅上述帖子中的屏幕图片、MVECT2和 MVECT8在有/没有*大小 of (uint32)时是不同的、并且它是非零值。

    在 映射文件中浏览 Cla1Taskx 符号后、我发现* sizeof (uint32)应该与任务的代码相关  

    以下是 CLA 任务代码以汇编语言编写的演示项目、您可以看到、使用* sizeof (uint32)、   映射文件中(Cla1Taskx - Cla1Prog_Start)的值与 MVECTx 寄存器的值相同、这应该符合我们的理解。

    如果任务的代码是用 C 语言编写的、没有* sizeof (UINT32)、     则映射文件中(Cla1Taskx - Cla1Prog_Start)的值与 MVECTx 寄存器的值相同

    在我看来、任务用 C 语言或汇编语言编写的代码会影响这一点、但我不知道原因。

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

    在进一步测试后、我相信您是正确的。 现在、它似乎是由 CLA 代码是在汇编语言还是 C 语言中确定的。这对我来说很奇怪。

    让我向编译器团队提出这个问题、然后返回到这里。

    此致、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在进一步调试之后、我发现了这一点。
    这将得出正确的结果。 它只是一个简单的减法。

    Cla1Regs.MVECT2 =(uint16)((uint32)&Cla1Task2 -(uint32)&Cla1Prog_Start);

    MOVL XAR5、#_Cla1Task2 ;[CPU_U]|112|
    MOVL XAR4、#_Cla1Prog_Start;[CPU]|112|
    MOV AL、AR5 ;[CPU_]|112|
    子部分 AL、AR4 ;[CPU_]|112|
    MOV @ć_Cla1Regs+1、Al ;[CPU_]|112|

    2.这将产生正确的结果。 编译器正在执行减法并向右移动1位、但由于乘法而向左移动1位。

    Cla1Regs.MVECT2=(uint16)(&Cla1Task2 -&Cla1Prog_Start)* sizeof (uint32);

    MOVL XAR4、#_Cla1Task2 ;[CPU_U]|111|
    SETC SXM ;[cpu_]
    MOVL XAR5、#_Cla1Prog_Start;[CPU]|111|
    MOVW DP、#_Cla1Regs+1 ;[cpu_u]
    MOVL ACC、XAR4 ;[CPU_]|111|
    SUBL ACC、XAR5 ;[CPU_]|111|
    SFR ACC、1 ;[CPU_]|111|
    MOV ACC、AL <<#1 ;[CPU_]|111|
    MOV @ć_Cla1Regs+1、Al ;[CPU_]|111|

    这会产生不正确的结果。 编译器正在执行减法、然后向右移动1位。

    Cla1Regs.MVECT2 =(uint16)(&Cla1Task2 -&Cla1Prog_Start);

    MOVL XAR4、#_Cla1Task2 ;[CPU_U]|113|
    MOVL XAR5、#_Cla1Prog_Start;[CPU]|113|
    MOVL ACC、XAR4 ;[CPU_]|113|
    SUBL ACC、XAR5 ;[CPU_]|113|
    SFR ACC、1 ;[CPU_]|113|
    MOV @ć_Cla1Regs+1、Al ;[CPU_]|113|

    不幸的是,这种差异的确切原因现在对我来说并不明显。 一旦确定了这一点、我将发布。

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

    您好 Sal、

    感谢你的帮助。 等待您的反馈。  

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

    这似乎是编译器错误。 这与链接器无关、也与 CLA 代码是用汇编语言还是用 C 语言编写无关。我认为这是执行指针算术时编译器中的错误。 这已报告给代码生成团队。

    我的建议是使用我在上一篇帖子中在#1场景中提供的代码。 这当前会产生正确的结果、并在错误修复后保持正确。

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

    听起来不错。 我将遵循您的#1方案、但请在新编译器发布后通知我。 谢谢。。。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sal、

    CCS/编译器团队是否提供任何解释/评论? 如果是、您是否愿意与我分享?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在唯一的反馈是它可能是编译器错误。

    如果您使用#1、您现在和未来都应该很好。 我将在示例上提交一个错误。

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

    感谢您的大力支持。