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/TMS320F2.8335万:4.1 ™︎3编译器上的局部变量值错误,除了前面添加volatile

Guru**** 2553450 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/582523/ccs-tms320f28335-local-variable-value-is-wrong-on-4-1-3-compiler-except-add-volatile-in-front

部件号:TMS320F2.8335万

工具/软件:Code Composer Studio

你(们)好

CCS 3.3 .82.13

编译器4.1 ........  

对于以下局部变量 ALL和Half。

1.调试环境中的值只有在变量前面加上volatile或none optimize时才是正确的。

int64半全2quan (Int32靶,int64 NOW,UINT16轴)

易失性
 int64 all,half;
 int64 TMP;
// 长LSD;
// LSD=0x800万;
// min=(int64)LSD*POSITION数值器1/POSITION Divisor1;
// lsd=0x7fffffffffff;
// max=(Llong Long) LSD*POSIENT_Numerator1/POSIENT_Divisor1;
// half =(int64) 0x800万;
// half=(int64)Half*POSIENT_Numerator1/POSITION Divisor1;
 all=(int64)0x1亿;
 all=(int64)all*POSIENT_Numerator1/POSIENT_Divisor1;
 半=全部;
 half =半模>>1;//(int64)all>>1);
 tmp =(int64)target*POSITION _Numerator1/position Divisor1-now;

 IF (TMP>Half) TMP-=全部;
 否则,如果(TMP<-Half) TMP+=all;
 返回TMP;
}

2.如果将优化级别设置为3或删除易失性。 值错误。

能否告诉我这是由旧编译器引起的吗? 为什么我们必须为 局部变量添加volatile? 谢谢。

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

    [报价用户="Daniel Fang"]编译 器4.1 .................3[/ 报价]

    该编译器已使用了10年以上。  请升级。  我不能保证升级可以解决您的问题。  但我认为您的机会是好的。

    您可能会考虑将较新的编译器与旧的CCS 3.3 一起使用。  这种组合尚未经过测试。  它通常起作用。  但是CCS和编译器的发布时间间隔越长,就越有可能出现问题。

    要了解您的问题是如何发生的,我需要重现它。  我不需要运行代码。  我通常可以通过检查编译器生成的汇编代码来看到问题。  请使用以下步骤提交测试案例。

    1. 预处理 包含函数half2quan的源文件
    2. 将其附加到您的下一篇文章中
    3. 按照编译器看到的内容准确显示所有编译器选项

    谢谢,此致,

    -George

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

    您的意思是说您仍然不确定它是由CCS或编译器版本引起的吗? 以前是否对此进行过任何早期日志修复?

    为什么必须添加volatile才能避免它? 我们非常担心其他变数。

    您需要什么测试用例? 请您就此提供更多提示吗? 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的意思是您仍不确定它是由CCS或编译器版本引起的吗? 以前是否对此进行过任何早期日志修复?[/QUOT]

    我们不知道原因。  所以我不能说这是否是由已知的错误造成的。

    Daniel Fang 说:
    为什么必须添加volatile才能避免?[/QUOT]

    使用volatile会在编译器的多个级别中禁用许多优化。  生成的代码在许多方面都有很大不同。  这种易变的情况可以避免这种问题,而不管它是什么,这是不足为奇的。

    您需要什么测试案例? 您是否可以就此提供更多提示?[/QUOT]

    测试用例意味着我以与您相同的方式构建相同的源代码。  我无法运行它。  但我可以检查编译器生成的汇编代码。  这通常(但并非总是)足以发现问题。  我在上一篇文章中列出了提交测试用例所需的步骤。  但我可以补充更多细节。  首先,预处理文件。  请单击 此链接 以了解有关该过程的更多详细信息。  您最终使用名为homething.pp.的文件  添加文件扩展名.txt以形成文件名esomething.pp.txt。  将该文件附加到您的下一篇文章中。  单击"回复"后,单击右下角的"使用丰富格式"。  这将显示具有更多功能的消息撰写界面。  使用回形针图标附加文件。  要显示编译器生成选项,请从CCS的“控制台”视图中复制并粘贴这些选项。

    谢谢,此致,

    -George

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

    e2e.ti.com/.../2833x_5F00_SysCtrl.pp.txt

    您好,George,

    如附件所附。 谢谢。

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

    感谢您发送测试案例。  我可以确认版本4.1 Tm3编译器为函数 half2quan生成了不正确的代码。  当我使用16.9 .2.LTS版本编译器进行编译时,生成的代码是正确的,但我无法通过运行它来确认。

    不幸的是,4.1 Tm3编译器版本太旧了,我们支持它是不切实际的。  获取修复程序的唯一方法是升级编译器。  请考虑免费下载 最新版本的CCS。  

    谢谢,此致,

    -George

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

    您好,George,

    感谢您的回复。

    您是否可以向我发送一封电子邮件,说明不同版本的编译器生成的代码的比较情况? 我想利用它来消除客户的顾虑,即它是由非常旧的编译器引起的,即使我们不 知道原因是什么。 谢谢。  

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

    这是感兴趣的关键功能的C代码...

    外部long position _Numerator1,POSITION Divisor1;
    int64 half2quan (Int32 target,int64 now,UINT16 Axis){
    
    int64 all,half;
    int64 tmp;
    
    all =(int64)0x1亿;
    all =(int64)all * POSIENT_Numerator1/POSIT_Divisor1;
    Half = all;
    half = 1
    ;f_intor1
    
    (tmp > half) tmp-=all;
    否则,如果(TMP <-half) tmp+=all;
    返回tmp;
    }
    

    我使用了以下构建选项: -v28 -ml -mt -o3 --symdebug:none -s。

    选项--symdebug:none将禁用所有调试信息。  这几乎一直都是个坏主意,除了这种有限的情况。  在这种情况下,我们正在检查代码,而不是运行它。  避免调试信息可使您更容易理解程序集。

    选项-s使编译器向程序集添加注释,使其更易于理解。  这些评论有很大的不同,值得比较。

    以下是版本4.1 的注释.................3...

    ;** 6003--------------------------- 	U9美元 =(长)目标*(长) POSITION _Numerator1/(长) POSITION Divisor1-NOW;
    ;** 6003-------- 	返回U9美元-9223372036854775808LL; 

    它显然不会计算原始C源中存在的所有内容。  除其他外,它从不计算全部或一半的表达式。  

    这些是16.9 .2.LTS版本的注释...

    ;** 5998	------------------- C17美元=(长) POSITION Divisor1;;;**5998
    	-------------------------- 全部=((Long Long)POSIENT_Numerator1<32)/C17美元;
    ;** 6001---------------- 	TMP =(长) TARGET*(长长) POSIT_Numerator1/C17美元-现在;
    ;** 6003--------------- 	C16美元 =全部>1;;;**
    6003------------------ 	如果( TMP >C16美元)转到G4;;;**
    6004------------------ 	如果( TMP >=-C16美元)转到G5;;;**
    6004---------- 	tmp +=全部;
    ;***------------------ 	g4:
    ;** 6003-------- 	tmp-=全部;
    ;***	--------------------- G5:
    ;** 6005---------- 	返回TMP; 

    非常不同。  更接近原始C源的匹配。

    谢谢,此致,

    -George