【问题标题】:How to import <chrono> to work with avr-gcc如何导入 <chrono> 以使用 avr-gcc
【发布时间】:2019-03-05 13:47:38
【问题描述】:

根据Using <chrono> as a timer in bare-metal microcontroller?,std::chrono 很容易与微控制器一起使用。

我的问题是 avr-gcc(用于 avr 微控制器的 gcc)禁用了 chrono(以及许多其他 c++ 功能)。如何将 chrono 与 avr-gcc 一起使用?

不同的选项:

1.- 为另一个版本的 gcc 复制 std::chrono。

2.- 编写我自己的 std::chrono 版本。

3.- 忘记 std::chrono 并以 C 方式读取时间。

4.- ...???

【问题讨论】:

  • 你的意思是不支持chrono而不是你说的禁用? avr-libc microchip.com/webdoc/AVRLibcReferenceManual/ch20.html 有一个支持的模块列表
  • 是的,它不被支持(对不起我的英语)。 avr-libc 不支持很多 C++ 特性(我觉得很正常,因为 avr-libc 是 C 库而不是 C++)。
  • 那么你应该实现你自己的库或使用其他可以适合你的问题。我建议您尽快提出问题,以包括有关您的设备的信息。
  • 也许有人写了你需要的东西:)

标签: c++ time timer chrono avr-gcc


【解决方案1】:
  1. 复制 std::chrono 以获得另一个 gcc 版本。

这对您没有帮助,因为存在一些™ 依赖项。在 x86_64 上:

echo '#include <chrono>' | g++ -fsyntax-only -xc++ - -H

将打印相当多的标题:

. /install/gcc-8-host/include/c++/8.0.1/chrono
.. /install/gcc-8-host/include/c++/8.0.1/ratio
... /install/gcc-8-host/include/c++/8.0.1/type_traits
.... /install/gcc-8-host/include/c++/8.0.1/x86_64-linux-gnu/bits/c++config.h
..... /install/gcc-8-host/include/c++/8.0.1/x86_64-linux-gnu/bits/os_defines.h
...... /usr/include/features.h
....... /usr/include/x86_64-linux-gnu/sys/cdefs.h
........ /usr/include/x86_64-linux-gnu/bits/wordsize.h
........ /usr/include/x86_64-linux-gnu/bits/long-double.h
....... /usr/include/x86_64-linux-gnu/gnu/stubs.h
........ /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
..... /install/gcc-8-host/include/c++/8.0.1/x86_64-linux-gnu/bits/cpu_defines.h
... /install/gcc-8-host/include/c++/8.0.1/cstdint
.... /install/gcc-8-host/lib/gcc/x86_64-linux-gnu/8.0.1/include/stdint.h
..... /usr/include/stdint.h
...... /usr/include/x86_64-linux-gnu/bits/libc-header-start.h
...... /usr/include/x86_64-linux-gnu/bits/types.h
....... /usr/include/x86_64-linux-gnu/bits/wordsize.h
....... /usr/include/x86_64-linux-gnu/bits/typesizes.h
...... /usr/include/x86_64-linux-gnu/bits/wchar.h
...... /usr/include/x86_64-linux-gnu/bits/wordsize.h
...... /usr/include/x86_64-linux-gnu/bits/stdint-intn.h
...... /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h
.. /install/gcc-8-host/include/c++/8.0.1/limits
.. /install/gcc-8-host/include/c++/8.0.1/ctime
... /usr/include/time.h
.... /install/gcc-8-host/lib/gcc/x86_64-linux-gnu/8.0.1/include/stddef.h
.... /usr/include/x86_64-linux-gnu/bits/time.h
..... /usr/include/x86_64-linux-gnu/bits/timex.h
...... /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h
.... /usr/include/x86_64-linux-gnu/bits/types/clock_t.h
.... /usr/include/x86_64-linux-gnu/bits/types/time_t.h
.... /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h
.... /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h
.... /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h
.... /usr/include/x86_64-linux-gnu/bits/types/timer_t.h
.... /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h
.... /usr/include/x86_64-linux-gnu/bits/types/locale_t.h
..... /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h
.. /install/gcc-8-host/include/c++/8.0.1/bits/parse_numbers.h

这些都不是随 avr-g++ 分发的,因为 libstdc++-v3 对 avr 禁用。

此外,根据您使用的功能,您将需要像 libstdc++-v3/src/c++11/chrono.cc 这样的模块,这些模块会拖累更多的依赖关系,特别是来自假设的底层操作系统,而 avr-g++(裸机)没有.

  1. 编写我自己的 std::chrono 版本。

这样做有什么好处?你认为你可以从某个主机复制粘贴代码,它应该可以毫无问题地工作?

  1. 忘记 std::chrono 并以 C 方式读取时间。

IMO,唯一合理的方法。您想控制系统资源。

【讨论】:

  • 我从头开始编写了自己的 std::chrono 版本,它运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多