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.

[参考译文] TDA4VH-Q1:TI Arm Clang 编译器工具 C++异常支持问题

Guru**** 2539500 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1290958/tda4vh-q1-ti-arm-clang-compiler-tools-c-exceptions-support-problem

器件型号:TDA4VH-Q1
主题中讨论的其他器件:TDA4VH

您好、TI 专家!

客户正在使用 TDA4VH SDK9.0

他们应用的工具链为 ti-cgt-armllvm_3.0.STS

根据以下链接、从 tiarmclang 编译器工具的版本3.0.STS 开始、可以在调用编译器以支持 C++异常时指定-fexceptions 编译器选项。

https://software-dl.ti.com/codegen/esd/cgt_public_sw/ARM_LLVM/3.0.0.STS/README.html

客户正在尝试验证上述链接中所示的示例。

客户已遵循上述链接示例中显示的源代码、并使用 Makefile 来链接 -fexceptions。 可以在下面下载源代码和 makefile。

e2e.ti.com/.../678873F4BDEE00A7CE7811AED7D295A9.zip

编译上述代码后、客户还在下面提供了一个可执行文件。 可以直接运行我们的 EVM 板。

e2e.ti.com/.../E93AF3D3A49760B26981775C3C15A750.zip

运行可执行文件后、输出如下所示。

根据结果、我们可以看到、如果输入年龄等于或大于18、则输出正常。

然而,当输入年龄小于18时,它将会抛出并捕获,在这种情况下,当它到达代码行 std :: COUT 在捕获内,它将突然退出。

小于18岁的输出结果与上面链接的示例不同。

总之、 在 3.0.STS 上编译 C++异常是可以的、但运行可执行文件时、该文件将在 throw & catch 分支中描述了该问题。

我是否可以知道、如果我们的 ti-cgt-armllvm_3.0.STS 在使用 C++异常(如-fexceptions )方面仍然存在一定的限制?

非常感谢!

凯文

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

    您好、TI 专家!

    我不确定在使用3.0.STS 编译阶段的以下警告是否与上述问题相关。 在3.x 工具链之前、不会出现这些警告。

    此致、

    凯文

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

    请升级到最新的编译器版本3.2.0.LTS。

    将堆栈和堆大小更改为尽可能大。  只是为了确保它们不会成为问题。

    在调用链接器时,我看到这些库的规范从编译器...

    -l../ti-processor-sdk-rtos-j784s4-evm-09_00_01_01/ti-cgt-armllvm_3.0.0.STS/lib/armv7r-ti-none-eabihf/except/libc++.a
    -l../ti-processor-sdk-rtos-j784s4-evm-09_00_01_01/ti-cgt-armllvm_3.0.0.STS/lib/armv7r-ti-none-eabihf/except/libunwind.a
    -l../ti-processor-sdk-rtos-j784s4-evm-09_00_01_01/ti-cgt-armllvm_3.0.0.STS/lib/armv7r-ti-none-eabihf/except/libc++abi.a
    -l../ti-processor-sdk-rtos-j784s4-evm-09_00_01_01/ti-cgt-armllvm_3.0.0.STS/lib/armv7r-ti-none-eabihf/except/libc++experimental.a
    ../ti-processor-sdk-rtos-j784s4-evm-09_00_01_01/ti-cgt-armllvm_3.0.0.STS/lib/armv7r-ti-none-eabihf/except/libc++.a
    ../ti-processor-sdk-rtos-j784s4-evm-09_00_01_01/ti-cgt-armllvm_3.0.0.STS/lib/armv7r-ti-none-eabihf/except/libunwind.a
    ../ti-processor-sdk-rtos-j784s4-evm-09_00_01_01/ti-cgt-armllvm_3.0.0.STS/lib/armv7r-ti-none-eabihf/except/libc++abi.a
    ../ti-processor-sdk-rtos-j784s4-evm-09_00_01_01/ti-cgt-armllvm_3.0.0.STS/lib/armv7r-ti-none-eabihf/except/libc++experimental.a

    全部删除。  如 tiarmclang 在线手册的"编译和链接"部分所述、最好让编译器自动选择这些库。

    我不能保证这些更改可以解决问题。  但无论如何都需要进行这些更改。

    谢谢。此致、

    -乔治

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

    您好、George、

    感谢您的建议!

    我们已升级到3.2.0.LTS、并删除了 您在编译器中提到的那些库的规格、但结果仍然相同。

    我们现在正尝试按照您的建议增加堆栈和堆大小。

    我们已尝试对以下内容进行了修改 j784s4_linker_freertos.cmd 配置选项。

    原始默认设置为 STACK_SIZE = 0x8000 ,heap_size = 0x10000

    情形1:默认大小的2*倍、STACK_SIZE = 0x16000 ,heap_size = 0x20000

    情形2:4*默认大小、stack_size = 0x32000 ,heap_size = 0x40000

    对于上述两种情况、结果保持不变。

    我知道这是否是增加堆栈和堆大小的正确方法吗?

    非常感谢您提出任何建议!

    凯文

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

    我没有用于运行您构建的可执行文件的硬件。  但我确实构建了相同的示例、以在具有 Cortex-R4 CPU 的系统上运行。  对我来说很好。  因此、我的结论是、编译器工具链没有问题。

    尝试将代码更改为不使用 std::cout 或 std::cin。  相关的 RTS 函数很复杂、需要大量的存储空间。  您的最终应用程序不会使用它们。  因此、如果删除它们使示例正常工作、那么您知道问题、无论它是什么、都可以忽略。   

    谢谢。此致、

    -乔治

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

    您好、George、

    感谢您的建议!

    我们尝试了以下测试、将 std::cin 和 std::cout 更改为 printf。

    如果输入年龄大于18、结果正常、如下所示。

    然而,当输入年龄小于18时,没有信息打印出来,甚至"hello world"没有打印出来,这意味着达到"扔"程序后将直接退出,而不继续。

    我们不知道如何进一步调试该函数、我们只能获得如下所示的警告信息。

    在上述警告中重定位的地址0xa01623d0位于以下 DDR_MCU1_0范围内。

    该空间似乎足够了、因此我们不知道如何进一步调试。

    您还有其他想法可以建议我们一试吗?

    非常感谢!

    凯文

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

    关于...

    我们不知道如何进一步调试它,我们唯一的信息是下面显示的警告。

    很抱歉、我在之前的帖子中忽略了这些警告。  您不应该看到它们。  在链接器命令文件中,确保有类似于...的规范。

        .ARM.exidx > MEMORY_RANGE
        .ARM.extab > MEMORY_RANGE

    这些输出段包含与 C++异常相关的已初始化表。  它们是只读的。  它们不需要分配给快速存储器。  它们可能使用与以前相同的存储器范围、 .cinit 首选。

    更改标准:: cin & std :: cout to printf.

    遗憾的是       

    、 printf 也会占用大量内存。 让它变得更简单。 删除所有打印语句。 为其指定一个常量值 年龄 成正比。 在 捕捉 子句和程序末尾的另一个子句。 看看会发生什么情况。 谢谢。此致、 -乔治
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、George、

    感谢您的建议!

    最后、我们可以添加您建议的如下规范、使其正常工作。

    总之、每次我们使用  C++异常时、我们都必须确保有用于  .arm.exidx  .arm.extab 所有符号链接。 与我们的 SDK 中一样、默认情况下它可能没有这些设置、因为默认 SDK 可能不会考虑应用 C++异常。

    非常感谢!

    凯文

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

    我提交了 EXT_EP-11544 、请求更新编译器手册以将这些部分添加到编译器可能创建的部分列表中的文档。  我们欢迎您通过这个链接来了解这一点。

    谢谢。此致、

    -乔治