【问题标题】:Can ETL be used with Atmel Studio?ETL 可以与 Atmel Studio 一起使用吗?
【发布时间】:2020-10-13 04:46:03
【问题描述】:

Embedded Template Library提供了STL的数据结构,不使用动态分配,用于嵌入式开发。

我正在 Atmel Studio 中试验 ATSAMD21,但无法使用动态分配。因此我尝试了 ETL,但它给了我在尝试使用 STL 时遇到的相同错误:

Error       ld returned 1 exit status
Error       undefined reference to `_exit'
Error       undefined reference to `_close'
Error       undefined reference to `_fstat'
Error       undefined reference to `_isatty'
Error       undefined reference to `_lseek'
Error       undefined reference to `_read'
Error       undefined reference to `_sbrk'
Error       undefined reference to `_kill'
Error       undefined reference to `_getpid'
Error       undefined reference to `_write'

据我所知,这些错误意味着为编译器选择了错误的目标架构。但是,情况并非如此,因为在我定义单个 ETL 结构之前,我的程序运行良好。此外,ETL 仅由一堆头文件组成。

我的猜测是 ETL 使用来自 STL 的代码,而 Atmel Studio 中包含的 gnu 编译器无法处理它。 (但如果 STL 完全不可用,他们为什么还要包含它?)

不过,ETL 据说可以使用even without STL

所以我在我的项目中定义了#define ETL_NO_STL,但我仍然遇到同样的错误。

在“发布”模式下似乎可以正常工作,这些错误只出现在“调试”中。

debug 和 release 之间的差异并不表明我在其中一个中使用了 STL,而在另一个中:

调试:

"C:\Program 文件 (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-g++.exe" -mthumb -D__SAMD21J18A__ -DDEBUG -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD21_DFP\1.2.276\samd21a\include" -I“C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\4.2.0\CMSIS\Include”-O1 -ffunction-sections -fno-rtti -fno-exceptions -mlong-calls -g3 -Wall -mcpu=cortex-m0plus -c -MD -MP -MF "main.d" -MT"main.d" -MT"main .o" -o "main.o" ".././main.cpp"

发布:

"C:\Program 文件 (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-g++.exe" -mthumb -D__SAMD21J18A__ -DNDEBUG -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD21_DFP\1.2.276\samd21a\include" -I“C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\4.2.0\CMSIS\Include”-O1 -ffunction-sections -fno-rtti -fno-exceptions -mlong-calls -Wall -mcpu=cortex-m0plus -c -MD -MP -MF "main.d" -MT"main.d" -MT"main.o " -o "main.o" ".././main.cpp"

唯一的另一个区别是调试版本有一个额外的行: 使用程序集“C:\Program Files (x86)\Atmel\Studio\7.0\Extensions\Application\AvrGCC.dll”中的“RunCompilerTask”任务。

调试级别不是原因。将其设置为 g3、g2、g1 或将其关闭不会改变任何内容。区别在于命令中是否有 NDEBUG。也许没有它,会执行一些不必要的 POSIX 一致性检查?

【问题讨论】:

  • 所有这些缺失的函数都是 POSIX 系统调用。在不了解 ETL 的情况下,您是否正确配置了它?也许它不能在没有实现某些基本 POSIX 功能的系统上使用?文件怎么说?您的配置看起来如何(阅读创建etl_profile.h 文件所需的文档,请包含它)?
  • @Someprogrammerdude :是的,我确实创建了配置文件头,并在其中添加了 ETL_TARGET_DEVICE_ARM。
  • 您的 Cortex M0 似乎没有 Linux。它似乎是一个微控制器,而不是 PC。从而避免以下事情:动态分配、C++、POSIX、STL、PC 编程。
  • 另外,我强烈建议不要在 C++ 以下编译 Atmel bloatware ASF,因为这会破坏整个事情。它一开始就很糟糕,即使编译为 C。是否可以在没有 bloatware 库的情况下使用 Atmel Studio?
  • @Lundin 我没有使用 ASF,也没有使用动态分配。而且我没有使用 POSIX,至少在不知情的情况下。我已经为这个平台编写了 C++ 应用程序,它们运行良好。现在我需要一些树,手动实现会很麻烦。我之所以选择 ETL,是因为它不使用动态分配,而且 ETL 的多映射似乎非常适合这项工作。我使用了 arduino 配置文件,它应该支持最简单的微控制器,但仍然出现上述错误。

标签: c++ stl arm embedded atmelstudio


【解决方案1】:

ETL 是在 STL 之后设计的,这是真的。但是 STL 作为一个库早已不复存在,因为它的内容已合并到 C++ 标准库中,所以已经过时了。

所引用的符号来自 C 标准库,这是另一个已成为 C++ 标准库一部分的库。

【讨论】:

    【解决方案2】:

    折衷的解决方案是在调试模式下添加 NDEBUG 参数,同时仍指定调试级别(如 -g2 或 -g3)

    这允许在调试会话中使用断点并观察变量的值,唯一的缺点似乎是断言语句不起作用,与其他平台相比,该功能在嵌入式开发中使用的频率要低得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2021-02-02
      • 2016-01-27
      • 2012-11-05
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多