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/EK-TM4C123GXL:在运行 GCC 编译时直接转至 FaultISR (不使用 TI 编译)?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/601899/ccs-ek-tm4c123gxl-goes-directly-to-faultisr-when-running-gcc-compilation-fine-w-ti-compilation

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123GH6PMSEGGER

工具/软件:Code Composer Studio

我有一个简单的程序、它使用 UART0与连接 TM4C Tiva LaunchPad 的 Windows 计算机上运行的终端程序(Putty)进行通信。  程序通过终端提示用户按"r"、"g"或"b"键、接收到按键时、TM4C 上相应的 LED 会亮起。

在 Code Composer Studio 中使用 TI 编译器进行编译时、此程序工作正常。  我可以在调试模式下运行程序、它在 main 处中断、我可以顺利执行-一切都正常。

但是、当我在 Code Composer Studio (GCC 6.3.1和 CCS 7.2)中使用 GCC 进行编译时、程序编译良好、 但是、当在调试器中启动时、它甚至会在到达 main 之前直接进入 FaultISR 函数-或者至少在我启动时、它不会在 main 中断、当我按下"pause"时 、它位于 FaultISR 函数中。

有什么想法吗?  或者关于如何从一开始单步执行汇编以查看其如何在 FaultISR 中最终实现的任何建议?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是一个海报、"Chester"类型的问题-我的小组避开了 CCS 和 GCC。 (而是在 IAR 下运行)
    通过将代码简化为最简单、最短的格式、可能会获得一些见解吗?

    目的是了解(任何)指令或指令组是否会执行。 此类发现应有助于您的诊断...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Terence D">但是、当我在 Code Composer Studio (GCC 6.3.1和 CCS 7.2)中使用 GCC 进行编译时、程序编译良好、 但是、当在调试器中启动时、它甚至会在进入 main 之前直接进入 FaultISR 函数-或者至少在我启动时、它不会在 main 处中断并且当我按下"pause"时 、它位于 FaultISR 函数中。 在使用 CCS 6.1/Linaro 时、尝试在已知问题中建议的解决方法 GCC 4.8.4.

    [引用 user="Terence D">或有关如何从一开始单步执行汇编以查看其如何在 FaultISR 中结束的任何建议?您可以取消勾选 自动运行和启动选项中的自动运行至 main 选项。 取消勾选运行到 main 的选项时、下载程序后 CCS 调试器会在复位矢量处停止、您可以单步执行启动代码。

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

    大家好、感谢大家的回答。  在经历了更多的迷惑不解之后,我*想*我现在已经有了它,但我仍然对正在发生的事情感到困惑。  我将解释:

    我想我可能刚刚更改了导致问题的一些特殊的 gcc 编译或链接设置、我从头开始了一个新项目、复制到代码中、完成 了 CCS 6.1/Linaro GCC 页面中提到的调整 (抱歉、应该在我最初的帖子中提到我、并仔细检查了这些说明)。  这样做后、一切看起来都正常。  所以、我用粉笔将其推至我身上、然后调整了一些特别的 gcc 设置并继续进行。

    然后,在做了一些更远的开发之后,它又发生了!!!  我看不到模式为什么、它是在对代码进行一些添加之后开始的。  尝试各种事情、但没有成功、然后我将"-e _start"设置(显然是有效的)更改为"-e ResetISR"、它开始再次工作。  令人困惑-我不知道为什么会这样。  在重新尝试调试之间、我很小心地一次更改一个设置。

    Chester -感谢您提供指向自动运行和启动选项的链接。  我不知道这一点。  如果这种情况再次发生、我将使用它来获得一些见解。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    赞扬您的系统和深思熟虑的方法-这是好的。
    你(是)"从(通常/成功)群体中筛选自己"-你是否能描述你的这种"分离"的动机? (并增加了漏洞)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="CB1_MOBILE "]赞扬您的系统且深思熟虑的方法-好的。
    你(是)"从(通常/成功)群体中筛选自己"-你是否能描述你的这种"分离"的动机? (并增加了漏洞)

    [/报价]

    :) CB1_MOBILE,我在软件开发方面拥有20多年的专业经验(但我对使用 MCU 有些陌生)。  在这20年里、我们已经成熟了、知道无论您的技能如何、还有更多需要学习的东西、而这种混淆只会阻碍进步并浪费能源。  (不用说、这在技能和经验都远远不够的领域更适用-就像我在 MCU 方面的经验一样)。

    我只是这个软件开发专业的谦逊的仆人、站在巨人的肩上、并且总是希望获得更深远的启发。

    此外,如果我不提及我对这个论坛的感谢,我也会想念我,那些帮助我的专家(如你)非常热情和非正式地给予了他们的知识、时间和努力。  非常非常有帮助。  主席先生,我感谢你。

    Terence

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

    我的朋友——这么好的话语——我是否可以表示深切和感激的感谢?     然而,从另一个观点来看,如此"远",他们一直拒绝指导,并且操纵他的"自己的失败路线!"  (尽管风暴云变暗-潮汐上升-明显地在地平线上...)

    我试图理解 GCC 对您的吸引力(或"抽取")-在这里、它在很大程度上是"少数群体使用"-并且在类似的 ARM MCU 论坛中也是如此。   直接结果、 "从畜群中筛选自己"可用于指导/帮助您的数量更少-因此、您使用 GCC 必须有(部分)理由-希望"最慢的 GCC 用户"能够"超越最快的狮子!"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊:)-是的,当然-我在软件开发方面的大部分专业生涯都涉及 C 和 C++-最近的更新版本 C++(C++11、C++14)。 GCC 在满足这些标准方面做得很好。 我发现自己在没有他们的情况下会受到一些限制。 我完全有可能不给 TI 编译器提供公平的机会、尽管多年来我一直倾向于使用(并且对) GCC。

    所有这些都说过、如前所述、我对 MCU 开发非常陌生、但是、我很享受它、并尝试尽可能多地吸收信息。 根据您刚才的陈述以及您之前提到的仅使用 IAR、我认为 GCC 不是 MCU 器件的编译器选择? 是这样吗? 我知道 IAR 是一种常见的 IDE/编译器选择、Keil 也是如此。 两者之间是否存在"行业标准"?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Terence D">我在软件开发方面的大部分专业职业生涯都涉及 C 和 C++-最近更现代的 C++(C++11、C++14)。 GCC 在保持这些标准方面做得很好。[/QUERT]C/C++运行时库的哪些部分会导致您的程序使用有问题?

    即使在 CCS 7.2版本中、默认 的 tm4c123ghp6.lds 和 tm4c123ghp6m_startup_ccs_gcc.c 也不会将 GCC 运行时库配置为支持所有功能。 例如:

    不显式设置堆大小

    -调用 main()而不是 GCC 运行时库启动函数_start、这意味着不调用 C++全局构造函数。

    CCS GNU C 编译器和链接器设置 包含一些建议对 Tiva GCC 链接器脚本和启动代码进行的更改、以解决这些问题、 但老实说、有些混乱、因为它们会在问题发生时解决问题、而不是获得一整套添加到 CCS 中的有效 GCC 链接器脚本和启动代码。

    TI ARM 编译器在这方面做得更好、因为编译器运行时库中的启动代码处理细节、而不必像 GCC ARM 编译器那样在特定于器件的文件中实现。

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

    我们的客户"要求"我的小型技术公司"始终"从众多 ARM MCU 中进行全面的最佳实践选择。   因此、必须拒绝选择任何"供应商锁定"的 IDE 或开发帮助(即 RTOS)。

    "一家也只有一家供应商的 MCU -将"永远"-与客户的功能矩阵最匹配-这一信念显然是短视和错误的!"    然而、有些人"应该更好地了解"会让自己陷入自我、因此"错过"更广泛的 ARM 选择-其中包括 M0、M0+、M3 (一次-遗憾的是不再如此) M4和 M7  (M7已存在(已经存在)几年!)

    供应商有限的 IDE -即使是"免费"提供的 IDE -根据"每次使用"提取持续费用-并且在(另一个)高级 MCU 最符合客户需求时无效。   与之形成鲜明对比的 Pro IDE (Keil 和 IAR)-支持从 ARM 供应商到供应商的免费、快速、轻松的迁移-因此用户可以从(另一个)学习曲线中节省下来!    非常重要!   这两种 IDE 均以"代码大小受限"格式免费提供、以便您能够建立熟悉的知识和技能。

    我的公司发现 IAR 的性能远远超过"供应商限制"版本-这是我们所期望的-因为 IAR 具有长期存在的单一供应商产品-具有更大的开发和支持人员-以及更大的安装用户群。   (尽管它不是免费的-并且支持多个供应商器件!)

    供应商 ICDI 并不是特别著名、也不是"稳健"。    SEGGER J-Link -可打折-被许多人认为是极好的-同样已经有了更长的时间-体积要高得多-并且更经常地进行改进和更新。    (即使您不是"被迫"要求"教育工作者身份、也可以作为"教育"折扣购买!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如 CB1所建议的、您应该检查商业编译器以查看它们是否满足您的需求。 我将把 Rowley 列入这个名单。 它们提供了特定于 Arm 的 GCC 以及 IDE 和嵌入式库。

    我不会选择 CCS、因为它只关注供应商、而且 IDE 很繁琐。

    我也很好奇、您认为您会错过哪些功能。 嵌入式社区对更新到最新版本一直保持保守。 有时这是有充分理由的、有时这只是一个资源问题。

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

    哇,很多信息,谢谢你们!

    [引用 user="Chester Gillon"]您的有问题的程序使用 C/C++运行时库的哪些部分?

    这并不是什么问题、更重要的是我对模板元编程、移动语义、lambdas、auto 等功能感兴趣。  更不用说能够创建具有封装的类、而不仅仅是一个结构。

    CB1_MOBILE、Robert -感谢大家对开发工具的看法。  很好的一点是、使用非供应商特定工具不是很容易移植到不同的硬件。  我应该更早地考虑这一点。  一旦我的第一个(下一个)非 TI 开发板项目出现、很明显、CCS 将不会是理想的 IDE (甚至可能使用?) 使用此非 TI 开发板...  好的、现在请查看 IAR。  希望它至少支持常用的 C++11功能:)  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    任何版本的 C++都提供了良好的类、因此这不会是问题。 您可能还需要查看 Rowley、因为它是 GCC。

    不过、请注意您所需的功能集。 许多人对使用模板、RTTI 和类似功能非常谨慎、因为它们会在微控制器上施加负载。 特别是堆和堆栈的大量使用。 请记住、这些微控制器的易失性内存比使用30年的 DOS 计算机要少、并且由于系统必须在没有复位的情况下运行数天甚至数年、即使是微小的泄漏或碎片也是致命的。 这就是创建称为嵌入式 C++的特定子集的原因。

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

    [引用 user="Terence D">随着我的第一个(下一个)非 TI 开发板项目的推出、很明显 CCS 不会是理想的 IDE (甚至可能使用?) [/报价]

    不是“证明是理想的”,太慷慨了!    如何完全局限于供应商产品(如此之少)-为(他人的) ARM MCU 提供不/零便利- 从而迫使您/他人进入一个添加的 IDE 学习曲线。    必须后退一步-并询问"如何以及为什么"如此有限"的"价值主张"会被(曾经)接受?"

    而且、 "更长的现有 IDE "的开发团队的更大存在-用户群数量-和(扩展的)规模/技能是否可以提供实质性的"性能、易用性和稳健性优势?"   (每个/每个-通过我们的调查结果确认...)

    事实上、您在任何"供应商限制"发布中的"犹豫不决"都可能会证明您的 ARM MCU 努力是一个"意外结果"。   

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

    [引用 user="Robert Adsett72">有关所需功能集的注意事项。 许多人对使用模板、RTTI 和类似功能非常谨慎、因为它们会在微控制器上施加负载。 特别是堆和堆栈的大量使用。  请记住、这些微控制器的易失性存储器比使用30年的 DOS 计算机少、并且由于系统必须在没有复位的情况下运行数天甚至数年、即使是微小的泄漏或碎片也是致命的。[/引述]

    是的、绝对同意并欣赏建议。  我的一般经验法则是查看装配体、以查看实际运行的量。  BTW、我一直在做的另一件事就是使用 SysTick 计数器查看代码行之间发生的节拍数-有效地分析代码。  有时我还使用逻辑分析仪来计时代码的各个部分。  同意/不同意此方法?  (我知道我正在讨论原始主题、如果有人希望我、我很乐意开始新主题)。

    [引用 user="Robert Adsett72">这就是创建名为嵌入式 C++的特定子集的原因。 [/报价]

    有趣!  我根本不知道这一点。  我刚才进行了更改并读了一位。  我必须更深入地研究这个问题。  感谢您提供的信息!

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

    [引用 USER="CB1_MOBILE "]

    Terence D
    随着我的第一个(下一个)非 TI 开发板项目的推出、很明显、CCS 不会成为理想的 IDE (甚至可能使用?)

    不是“证明是理想的”,太慷慨了!    如何完全局限于供应商产品(如此之少)-为(他人的) ARM MCU 提供不/零便利- 从而迫使您/他人进入一个添加的 IDE 学习曲线。    [/报价]

    (笑) 好吧,我不会过早地悲观:) 点被采纳了。  我很感激这些建议-这可能是我学到的一个教训。  我很可能很快就会迁移到新的 IDE。

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

    [引用 user="Terence D"] 我的一般经验法则是查看程序集以查看实际运行的代码量。

    我将此文件归档到"过早优化"下、但不要这样做。 它会导致人们对诸如选择 while 循环之类的内容而不是执行循环的内容产生痴迷。  完成其他优化后、清理、算法更改等... 然后、仍然存在性能差距、我们来看看生成的代码、而不是胡乱摆弄代码排列上的微小差异、而是应该去考虑改用汇编语言。

    此外、对于现代微控制器、例如 ARM 处理器、仅仅查看装配体并不一定是性能的好指南。 您必须考虑高速缓存、指令依赖项等...

    有报告说、代码的这种微优化除了使代码更难以维护之外、还会干扰编译器优化、实际上使代码的性能变差。

    [引用 user="Terence D">我一直在做的另一件事就是使用 SysTick 计数器查看代码行之间发生的节拍数-有效地分析代码。  有时我还使用逻辑分析仪来计时代码段。[/quot]

    我不为此使用时钟。 我确实使用逻辑分析仪。 DSO 上观察到的引脚切换比时钟测量中的信息要多得多。 CB1提到 Segger。 如果您正在查看它们、请查看它们的实用程序。 您可能会发现 systemview (如果我正确调用了该名称)很有趣。

    [引用 user="Terence D">有趣!  我根本不知道这一点。  我刚才进行了更改并读了一位。  我必须更深入地研究这个问题。

    如果您还没有 MISRA-C++、则也可以签出。

    Robert

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

    [引用用户="Robert Adsett"]

    Terence D
     我的一般经验法则是查看装配体、以查看实际运行的量。

    我将此文件归档到"过早优化"下、但不要这样做。 [/报价]

    嗯...  真的吗?  我非常了解"过早优化"、并且非常喜欢在猜测时进行测量、但在考虑通过两种方式之一执行某种操作时、我认为查看每个指令生成的汇编指令长度至少可以获得提示并不是件坏事。  示例:执行特定计算的查找表反转。  如果查找只需要几条指令、实际计算需要50条指令、只要查找表不是非常大、我可能会实现查找表。

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

    [引用 user="Terence D">一旦我的第一个(下一个)非 TI 开发板项目出现、很明显、CCS 将不会是理想的 IDE (甚至可能使用?) 使用此非 TI 开发板时、无需支付任何费用即可为 TI 器件开发软件、并且许可条款不允许使用 CCS 为非 TI 器件进行开发。

    而 IAR 可用于为多个供应商的器件开发软件、但您必须为任何重要程序(即大于免费代码大小限制许可证的程序)支付 IAR 许可证。

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

    [引用 user="Chester Gillon"]您必须为任何严重程序(大于免费代码大小限制许可证的程序)支付 IAR 许可证费用。

    目前、IAR 的"代码大小限制"为32KB、并且至少在过去几年里是如此。

    虽然我的公司有"多个席位"的"付费 IAR"、 但"任何严肃的程序必须超过32KB 大小"这一说法显然会引起争议。   在财务方面-我的公司在几个场合实现了超过250K (美元)的代码、符合32KB 限制。   此外、除了此处提供的(非常)窄范围产品之外、许多 ARM MCU (仅限)可达到32KB 容量、而且还有更多的 MCU 可享受巨大的销量!

    总之-规模(单独)不是"严肃的计划"!    相反,"功能、资源、有效解决问题和创造持续利润流",是 "严肃"的更好的衡量标准。    您可以将其转至银行...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、真的。 现在、我听到的唯一一种情况是、有人建议检查编码的差异、例如操作顺序、"做时"与"做时"等。。。。 这是我第一次听说有人建议选择算法是有道理的。

    通常、您甚至无需编写算法即可了解其相对性能。 快速草图将让您了解需要多少操作以及需要哪些操作。 您提供的示例肯定应该是这样的。 这假设您已经检查了精度和精度等其他必需属性。 这种情况的下降是、如果您需要对 sqrt、sin、erf 和 cos 等更复杂函数的库支持。 此时您确实需要进行测量、查看装配体列表在任何情况下都不会有所帮助。 鉴于您不需要依赖库支持、因此、如果此时它们太近而无法决定、则只需选择一个即可。 在大多数情况下、您不需要最快或最小的版本、而只需要一个有效的版本、尤其是在开始时。 对于子集的其余子集、您实际上需要进行测量、查看汇编列表是一个淡色的替代项。

    Robert

    注意:达到此比较级别时、编译器版本会有所不同。