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.

[参考译文] Starterware/TM4C129ENCPDT:为什么 TivaWare 将优化级别默认为 O2?

Guru**** 2439710 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/625684/starterware-tm4c129encpdt-why-the-tivaware-default-its-optimisation-level-to-o2

器件型号:TM4C129ENCPDT

工具/软件:Starterware

你(们)好

对于我自己的项目、我将优化级别更改为关闭、程序运行到故障 ISR 中、重新编译到优化级别2、运行良好。 有什么想法吗?

为什么默认为 O2、速度与尺寸之间的权衡设置如何?  我应设置什么编号?

此致!

Ping

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

    让我100%确定我正确理解了这一点。

    当优化被关闭时、代码不能正确运行。

    打开优化后、代码按预期运行。

    是这样吗?

    我提出的原因是、这与我可以想到的任何其他情况都是反向的。。。 通常情况下、打开优化是问题的原因、我可以回顾、切勿关闭优化。

    但是、鉴于此问题与故障 ISR 相关、我认为您应该调查您是否正在从以下帖子 中进入问题2:e2e.ti.com/.../374640
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Ralph Jacobi">我提出的问题是、这与我可以想到的任何其他情况都是向后的... 通常情况下、打开优化是问题的原因、切勿将其关闭、我可以回忆起。

    哦、我遇到了关闭优化会导致明显的错误行为的情况。 更改优化可以揭示错误(特别是 heisenbugs),而不管您是"增加"还是"降低"优化级别**

    在大多数情况下、这些是应用程序中的潜在错误(我在商业应用程序中看到过、可能是经过高度测试的应用程序)、只有少数情况下是编译器错误。

    因此、我认为您应该这样做

    • 发行优化之外,切勿在任何其他优化中测试*
    • 切勿逐个模块修改优化

    Robert

    并且很少进行调试。 如果无法在发布优化级别进行调试、则需要更改发布优化或学习更好的调试技术。

    **实际上,增加和减少是错误的术语

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

    幽默,很好知道! 我有许多实例、在这些实例中、"启动"优化会导致错误被显示、但尚未观察到相反的情况、结果为真! 感谢您提供的启发信息。 是的、故障几乎始终与应用相关... 可以证明。

    我100%同意应根据预期的发布优化级别进行测试。 在我职业生涯的早期发现这是一个艰难的道路。 虽然这种经验教训也有助于长期增长。

    实际上、该注释与 TivaWare 在该优化级别发布的原因主题是吻合的-坦率地说、我不知道为什么选择了该精确级别设置、因为我没有参与其中的任何开发。 如果这个问题的根源比我们的常见问题主题"问题2"中的问题更深、我可能需要了解更多有关选择的详细信息、以及更改所选级别是否有任何已知后果。 我想知道是否有其他优化级别进行了大量测试、这正是 Robert 列出的原因 (虽然我觉得我们可以辩论一下、对于一个驱动程序库、由于交付范围的性质、这种做法可能不如最终应用程序那样有效...)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ***类似***
    这些恼人的“heisenbugs”证明-通常-非常不确定... (仅文字就值得(不恰当地禁止))

    克鲁的工作人员(当然)会(现在)迅速声称,"海因虫"是他们的"海因人!"   (查看您的入门内容、Robert?)

    BTW -我的调查结果/信念与供应商 Ralph 的调查结果(很大)相同...

    海报必须意识到"现在发现问题(尤其是故障)-而不是以后发现问题"是"非常需要的"、应导致更清洁、更稳健的代码...

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

    [引用 user="Ralph Jacobi">我想知道、出于 Robert 列出的确切原因、其他优化级别是否进行了大量测试(如果有) (尽管我觉得我们可以辩论一下、对于驱动程序库、由于交付范围的性质、此做法可能不如最终应用程序那样有效。)。[/引述]

    我同意 Ralph、我认为您可以提出一个很好的论点、即库应该在多个优化设置下进行测试(也许可以指示测试的执行级别)。 我可以理解为什么这种情况不常见、变化的数量会很大。

    Robert

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

    谢谢、Ralph

    很高兴看到如此多的答复。 是的、您的理解是正确的。

    我将优化级别关闭的原因是在 O2、调试函数(步进、断点)的行为不是很好、请参阅此处的另一篇文章-

    这是我第一次注意到优化级别会改变代码行为、感谢您指出问题2、 但我认为这与此无关、应用程序通过启动阶段并运行正常、我仍在尝试找出导致故障 ISR 的代码位-这很难、似乎只有在运行某些函数时才会出现。

    有什么建议为什么这么做? 谢谢!

    Ping  

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

    [引用用户="Ping Wang "]我仍在尝试了解哪个代码位导致进入"fault ISR"-这很难、在某些函数期间似乎只有(发生)。[/quot]

    您已经观察到的情况。   该供应商提供了详细的应用手册、其中介绍了可让您深入了解 MCU 故障(实际)原因的方法。  (最近(声称)的论坛"升级?" 忽略了任何使"查找此类关键文档"舒适、方便(上帝禁止)"快速、方便"的尝试、以供" LIKEless "客户用户使用!   

    论坛页面顶部的红色条纹(风格指南)提供(备受欢迎)"博客、小组、TI 培训"-并且(令人惊讶/失望)不是指向此类重要技术文档的单一链接!   (已申请/LIKEless "升级吗?") 除了幻影之外、还能证明什么呢?

    缺勤供应商的重要应用手册-您可以系统地删除"可疑函数"(您认为导致进入"故障 ISR"的函数)、并尝试发现引起代码事件。   最常见的是 A、" MCU 堆栈太小"-您对论坛搜索框(在论坛页面顶部)的使用应揭示过去的文章、该模型是"如何增加堆栈..."

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试使用 TI 的 ARM 编译器和 GCC 进行编译。 使用 GCC 编译时、请使用-Wall。 您可能会看到新的或不同的警告。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="12ve12pm">尝试使用 TI 的 ARM 编译器和 GCC 进行编译。 使用 GCC 编译时、请使用-Wall。 您可能会看到新的或不同的警告。

    [/报价]

    或者更好的方法是使用适当的静态分析器、如 PC-Lint。

    更完整、更易于理解、更容易调整到正确的覆盖范围。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    PC-Lint 是一种用于发现难以发现的错误的绝佳工具。 我们使用它。 请注意、在尝试使用外设之前、它无法检测到诸如开启外设失败之类的错误。 这将使您进入故障 ISR。

    对代码进行的测试越多、越好。 这包括静态测试(PC-Lint、编译器警告)、动态测试(自动测试套件、模糊)、在多个编译器和硬件平台上以及在上和上运行。

    但是、如果这不可用、最简单、最快的方法是使用另一个编译器进行编译、并查看它输出的警告。

    关于故障 ISR 的另一个想法:优化级别可能与故障无关。 假设您运行了打开外设的固件。 假设您稍后进行了内核复位(而不是系统复位)、这会清除内核、但会使芯片的其余部分处于任何未知状态。 假设您稍后运行了-O2版本、该版本有效。 然后、假设您执行了系统重置或关闭并打开电源。 外设断电、直至显式打开。 最后、假设您运行软件的-O0版本、它会进入故障 ISR。 这只是一个示例序列、可以让您相信自己已经失去了主意。 切记始终执行系统复位、而不是内核复位。 我会重试-O2和-O0版本。

    另一个想法:在 Release 和 Debug 构建中、您可能使用不同的预定义符号集进行编译、或者与不同的库集进行链接。 我会检查项目配置并进行比较、以确保所有内容(优化级别和调试代码输出除外)相同、或者(更容易)创建新项目并将现有代码引入其中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="12ve12pm]PC-Lint 是一款用于发现难以发现的错误的绝佳工具。 [/报价]

    更好的方法是防止它们。

    这不应该是问题的解决之后、而是应该是提供其他遗漏的内容的持续补充。

    [引用 user="12ve12pm]\n 请注意,在尝试使用外设之前,它无法检测到错误,例如无法打开外设。 这将使您进入故障 ISR。[/报价]

    我认为这可能是图书馆建设方面的一些预先考虑。 不确定是否值得、但我必须考虑一下。 您最终可能会得到更好的代码。

    在这种情况下、我同意。 TDD 是更好的工具。

    lint 首先测试,然后为目标编译。 如果在您到达编译器时仍有合法的编译器警告、则可能会出现问题。

    [引用 user="12ve12pm"]但如果该选项不可用,

    如果不是、您应该真正提供它。 它是一个重要的工具。

    [引用 user="12ve12pm"]在发行版和调试版中,您可能使用不同的预定义符号集进行编译,或者与不同的库集进行链接[/quot]

    从未有调试构建。 始终构建到发布。

    Robert

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

    [引用用户="Robert Adsett72"]

    12时12分
    您可以在 Release 和 Debug 编译中使用不同的预定义符号集进行编译、也可以链接不同的库集

    [/报价]

    我想知道你对这个问题的技术原理是什么。 如果您始终构建到发布版本、那么您应该如何快速切换到包含调试信息的构建、以及在哪里可以实现源代码级单步执行? 或者、您是否非常好、以至于您永远不会使用调试器?

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

    [引用 user="12ve12pm "]

    Robert Adsett72.
    12时12分
    您可以在 Release 和 Debug 编译中使用不同的预定义符号集进行编译、也可以链接不同的库集

     想知道您对这个问题的技术原理是什么。 如果您始终构建到发布版本、那么您应该如何快速切换到包含调试信息的构建、以及在哪里可以实现源代码级单步执行?

    [/报价]

    这就是您不切换编译、调试生产版本的要点。 您可以具有包含调试信息的版本构建。 它们并不是相互排斥的。

    如有必要、您还可以单步执行代码(单步执行被高估)。

    [引用 user="12ve12pm"]或者您的状态是否良好、以至于您从未使用过调试器?

    如果先执行 lint 操作,则使用单元测试,然后进行编译。 在运行代码时、有许多调试技术不需要调试器。 一些具有更少入侵、另一些具有更强的入侵能力。

    您需要直接进入并观察代码行为的项目不会从单步执行中受益。

    是的、我有时会逐步浏览优化的代码、但这种情况很少见。 观察和检查通常比偷东西更有效率。

    当我开始时*,一个冰通常是5个或更多的数字(通货膨胀在这种情况下已经消失)。 即使适配器可能有四个图、它们也会焊接到电路板上、易碎且不可重复使用。 这不是一种可以轻易使用的资源。 因此、我可能已经学会了人们开始时不重视的技巧。 我还使用过您根本无法停止的系统**,尽管不像某些系统那样极端。

    对于某些(至少)现代工具、可以轻松获取大量信息、而无需单步执行代码甚至设置断点。

    Robert

    我上次单步执行嵌入式应用是几年前启动汇编代码。 您甚至不需要符号信息。 我有单步 PC 应用程序、主要是因为对象模型没有很好地记录或完整记录。 尽管对于其中的一些日志来说、这将是最强大的调查工具。

    **如果您停止代码,就会发生糟糕的情况

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我最近在平台上做的一些工作是、如果无法单步执行代码。 没有方法允许这样做。

    Robert