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.

[参考译文] CLA 中的比较

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/967264/comparison-in-cla

器件型号:TMS320F28069F

工具/软件:Code Composer Studio

我在 CLA 协处理器中发现了一个非常奇怪的比较(我知道当操作数的差异溢出时、编译器会出现错误、我认为这不是这里的情况)。 我已经完成了一些测试、结果在注释中(CurrentLimit=-1、DACOffset[1][Phase]= 501):

       int16 test1 = 1-501?1:-501;                                                               // 1.
       int16 test2 =-1>-501?-1:-501;                                                             //-1
       Int16 test3 =-CurrentLimit>-DACOffset[1][Phase]?-CurrentLimit:-DACOffset[1][Phase];       //-501
       Int16 test4 =-CurrentLimit>-DACOffset[1][Phase];                                          // 0
       int16 test5 =(-CurrentLimit>(-DACOffset[1][Phase])?-CurrentLimit:-DACOffset[1][Phase];   //-501
       Int16 test6 =(-CurrentLimit>-DACOffset[1][Phase])?-CurrentLimit:-DACOffset[1][Phase];     //-501
       int16 test7 =-1;
       int16 test8 = 501;
       int16 test9 =(-test7)>-test8?(-test7):-test8;                                                 //-501
       int16 test10 =-test7;                                                                     // 1.
       int16 test11 = test10>-test8?test10:-test8;                                                // 1.

主 CPU 和"Expressions"窗口确实达到了正确的值、在 CLA 中出错。 有什么想法吗?

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

    约斯特

    感谢您的参与。 主题专家因美国假日和时间银行而不在办公室。 请在1月5日或6日之前回复。 对拖延答复表示真诚的道歉。

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

    约斯特

    新年快乐!  感谢您在假期期间的耐心等待。  我想看看您是否仍然遇到此问题?  如果是、请告诉我如何定义变量(CurrentLimitit 和 DACOffset)以及您使用的编译器的哪个版本。

    此致

    Lori

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

    您好 Lori、

    你也度过了一个美好的一年。 我解决了这个问题、这实际上导致了更高效的代码。 但为了避免未来出现这种错误、并避免好奇心、我希望看到它得到解决。 对于局部定义的变量、实际上也会发生这种情况:

    int16 test7 =-1;
    int16 test8 = 501;
    int16 test9 =(-test7)>-test8?(-test7):-test8; //-501
    

    也许我的大脑是短路的,但在我看来--(-1)= 1 >-(501)=-501,所以它应该评估为1而不是-501

    这些变量定义如下:

    #pragma DATA_SECTION (DACOffset、"CpuToCla1MsgRAM");
    Int16 DACOffset[2][3]={0、0、0}、{0、0、0、 0}};
    
    #pragma DATA_SECTION (CurrentLimit,"CpuToCla1MsgRAM");
    volatile long CurrentLimit=0;
    

    编译器的版本为:TI v20.2.0.LTS

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

    约斯特

    感谢您提供更多信息。  在这种情况下、比较的输入将会"短"。  如果告诉编译器这一点、则警告将消失、编译器将使用略有不同的指令来确定结果。   (请参阅 :http://software-dl.ti.com/ccs/esd/documents/cgt-cl2000-v18.12.x_cla-signed-integer-comparison-workaround.html )

    我使用您的代码尝试了以下操作:  

    int16_t CLAtest10 =(short)(-CLAtest7)>(short)(-CLAtest8)? (-CLAtest7):(-CLAtest8); 

    -洛里

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

    谢谢你。 这确实是正确的结果。 我找到了您提到的链接、但我不知道如果操作数不在有问题的范围内(即差异不会溢出)、结果也会受到影响。 作为额外的检查、我还使用了"安全"比较运算符、这也给出了不正确的结果。 代码:

    int16_t CLAtest7 =-1;
    int16_t CLAtest8 = 501;
    int16_t CLAtest10 =(short)(-CLAtest7)>(short)(-CLAtest8)? (-CLAtest7):(-CLAtest8);// 1,正确
    int16_t CLAtest11 =(-CLAtest7)>(-CLAtest8)? (-CLAtest7):(-CLAtest8); //-501,不正确
    int16_t CLAtest12 =__mgt ((-CLAtest7)、(-CLAtest8))? (-CLAtest7):(-CLAtest8); //-501,不正确
    

    很遗憾、我仍然不知道发生这种情况的确切原因和时间、但我想我会格外小心

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

    约斯特

    我一直在和编译器专家讨论这一点,看起来_mgt()不起作用 可能是 一个错误。  如果您希望/需要在将来的帖子中引用它、TT CodeGen-8490会对其进行跟踪。  

    我询问原始值是否适合较短的值、并被定义为 int16_t、 但却导致了这个问题。  这是因为-short 是 C 中的 int。 幸好、编译器通过提供警告来执行正确的操作。

    此致

    Lori

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

    您好 Lori、

    再次感谢。 当该警告弹出时、我将进行双重检查。

    此致、

    约斯特