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.8374万S:TMS320F2.8374万s编译器优化级别问题和TMS320F2.8066万不同编译器版本问题

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/606038/ccs-tms320f28374s-tms320f28374s-compiler-optimize-level-issue-and-tms320f28066-different-compiler-version-issue

部件号:TMS320F2.8374万S

工具/软件:Code Composer Studio

大家好,

 我的客户报告了编译器的问题:

 1)不同的优化级别导致不同的代码执行,这使得DCDC控制算法不稳定。

 2)不同的编译器版本导致相同源代码的结果不同。

能否通过e2e.ti.com/.../6646.Issues-with-compiler.docxkindly就项目1)和项目2)发表意见?  是否有优化级别配置指南?  详细说明可在以下附加文件中找到。

此致

本杰明

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

    1)不同的优化级别导致不同的代码执行,这使得DCDC控制算法不稳定。[/QUOT]

    我不确定是什么原因导致了这个问题。  请确保所有由中断修改的变量都标记 为volatile。  这通常是造成这种情况的原因。

    Benjamin Zhou 说:
     2)不同的编译器版本导致相同源代码的结果不同。[/QUOT]

    在详细说明这个问题的文档中,它指出这个问题在某种程度上与memcpy有关。  修复方法是从使用编译器RTS库中提供的memcpy例程更改为使用memcpy的自定义实现。  我的总结是否正确?  我怀疑这一变化是否能直接解决问题。  这种更改很可能只是掩盖了问题。  虽然我不能肯定,但这似乎是一个时间问题。  而计时问题通常是由于未能在需要的地方使用volatile关键字而引起的。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在使用memcpy()的过程中,区域是否重叠? 我很容易相信memcpy()在优化过程中会与重叠的区域发生中断,因为那是memcpy()的整个点。 请尝试使用memmove ()-它更安全。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    George,
    对于1)问题,第一个变量在结构中定义,同时问题仍然存在。对于"易失性"销目的,您是否意味着ISR中使用的每个变量都应使用易失性?
    对于2),客户也有相同的问题,即现场调试与此功能相同。 原型不是在ISR中使用,而是在其他地方使用。您对易失性使用有何建议?它是否应用于原型中的每个变量?

    此致
    本杰明
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    任何可以意外更改的变量都应标记为volatile。 "意外"这意味着该值可能会因ISR而发生变化。 因此,ISR中更改的所有全局变量都需要标记为易失性。

    例如,假设有一个while循环条件,该条件使用全局标志来表示循环结束。 如果未将其标记为volatile,编译器将假定此变量永远不会更改,并且永远不会在循环的顶部检查它。 如果它被标记为"volate",则编译器知道重新加载并在循环的每次迭代时检查该值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Keith
    对于"volate",是否意味着只有ISR中使用或定义的变量必须使用volatile?
    此外,您能否就原型定义/变量定义/原型调用的其他典型考虑因素发表评论?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此响应已从原始响应中进行了修改,以便更正错误。

    Benjamin Zhou 说:
    对于"volate",您的意思是仅ISR中使用或定义的变量必须使用volatile?[/QUOT]

    ISR读取或写入的任何变量。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ISR,DMA,协处理器等读取或写入的任何变量
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于“volatile”,似乎需要在不同位置定义的变量“volatile”,但在C/C++编译器用户指南中,它只提到了一点, 此外,它还会根据用户指南链接到优化级别。当优化器级别配置为“关闭”时,您对“volatile”用法有何评论?在ISR/DMA或其他应用中使用变量时,“volatile”是否仍需要?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不正确使用易失性可能会在任何优化级别上导致问题,甚至"关闭"。  也就是说,在更高级别的优化中,此类问题更有可能出现。

    谢谢,此致,

    -George