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.

[参考译文] 编译器/MSP430F5419A:使用较新的编译器从 CCSv4迁移到 CCSv8的异常行为

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/878321/compiler-msp430f5419a-abnormal-behaviors-moving-from-ccsv4-to-ccsv8-with-newer-compilers

器件型号:MSP430F5419A

工具/软件:TI C/C++编译器

大家好、

我遇到了一些与 CCSv6和更高版本相关联的奇怪问题、这些问题与 TI v19.6.0 STS 的所有编译器版本都相关。 当我尝试使用编译器 TI v3.3.3将我的项目从 CCSv4升级到使用最新编译器的较新 CCS 时、就会出现此问题。 我使用 CCSv8导入了项目并使用 TI v18.1.4 LTS 进行编译、我的代码表现出了一些异常行为、例如似乎跳过代码行或优化寄存器设置等 它看起来也不像<<>>运算符、如所示

参数<= 0x01;

我怀疑它与优化有关、但我尽力确保完全关闭它、就像在 CCSv4环境中一样(Settings/MSP430 Compiler/Optimization /Optimization level (-opt_level、-O):off)、没有结果。 是否有方法确保所有优化都已关闭。 或者、如果您对从 CCSv4转换到更新的 CCS 和编译器的缺陷有任何想法或了解、请告诉我。

提前感谢、

ED

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

    编译器选项设置--opt_level=off 会禁用大多数优化。  当使用优化使代码工作不正常时、一个典型的原因是未能使用 volatile 关键字。  优化级别越高、出现此类问题的可能性就越大。

    谢谢、此致、

    乔治

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

    感谢乔治的回答、但它没有太大帮助、因为我已经知道你所说的大部分内容。 这里的问题是、在 CCSv4中使用 TI v3.3.3编译器编译的完全代码没有问题。 只有当我使用较新的编译器将同一项目导入到 CCSv8时、我才会看到异常。 在这两种情况下、我都尽力关闭优化。 将-opt_level 设置为 off 时、"大多数优化"是什么意思? 我可能错过了哪些其他优化?

    感谢您的帮助!

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

    编译器*始终*执行了一些优化。 我不知道专门用于 TI 编译器、但例如、如果您具有:

    Omega = f * 2 * m_PI;

    编译器将在编译时计算2 * m_pi。

    此外、如果您创建如下循环:

    int i;

    (i=0;i<1000;i++);

    为了浪费时间、编译器可能会将其删除、因为它不起作用。

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

    此外、对于<<运算符、实际操作数是多少、您得到了什么、您期望得到了什么?

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

    感谢 Keith 的澄清。 我的意思是更明显的、可以在设置中打开/关闭。 我的问题同样更像是编译器3.3.3为什么不显示任何优化异常;仅使用新的 CCS 和编译器。

    关于值班操作员、我只是进行了一次有教育经验的猜测。 我有如下内容:

    如果(第>段)

    while (Para < 0x80000)

    参数<= 0x01;

    一旦进入 while 循环中的蓝色月亮 Para、就会莫名变为0、这会使代码卡在 while 循环中并导致 WD 复位。

    实际上、如果(Para = 0){break;}在 while 环路中、我必须设置防护、以防止 WD 复位。

    它可能来自移位器<<、也可能与我不知道的隐藏优化设置相关。 非常非常非常奇怪。 这种情况在具有3.3.3编译器的 CCSv4中不会发生(我们已经使用它多年了、没有任何问题)。

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

    [引用 user="snuk"]在 while 循环中的蓝色月亮 Para 中,会莫名变为0[/quot]

    如果这是间歇性发生的、那么这听起来就像是硬件中的问题。

    谢谢、此致、

    乔治

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

    绝对不是硬件问题、因为使用3.3.3编译器的 CCSv4中从未发生过这种情况。 此外、这只是其中一个异常。 另一个与 GPIO 引脚相关的问题是、始终没有像编码时那样"打开"、而不是间歇性的。  

    我们不想返回 CCSv4、因为我们需要在不久的将来支持 uint64_t 数据类型、但如果此问题仍然存在、我们似乎没有选择。

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

    尝试使用 gcc 编译器。

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

    也尝试了! 在为项目手动和费力地将设置转换为 GNU 环境后、我仍然遇到大量警告和错误。 我们的项目设置为使用 TI 编译器、切换到 GNU 将是一项工作(即不支持 pragma 等)。 这种努力带来的缺陷将使这种努力变得不值得。

    除非我当然遗漏了一些东西。

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

    关于这种情况...

    [引用 user="snuk"]

    我有如下内容:

    如果(第>段)

    while (Para < 0x80000)

    参数<= 0x01;

    进入 while 循环中的蓝色月亮 Para 后、函数莫名变为0

    [/报价]

    对于包含此代码 的源文件、请按照文章如何提交编译器测试用例中的说明进行操作。 我将生成汇编代码并查看是否可以发现问题。

    谢谢、此致、

    乔治

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

    再次感谢 George、如果时间允许、我将尝试。 我知道 TI 最近不支持像多年前那样的现场工程师、但是否可以获得某种现场帮助、因为我们的代码非常特定于硬件?

    在工作台级别更容易演示异常。

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

    [引用 user="snuk"]如果时间允许,我将尝试该操作。

    只需5-10分钟。

    [报价用户="snuk"]是否可以获得某种现场帮助[/quot]

    我不知道。  这不是我安排过的。  请先让我了解该测试用例。  每种情况都是不同的。  但您可能会对我们在这方面取得的进展感到惊讶。

    谢谢、此致、

    乔治

x 出现错误。请重试或与管理员联系。