gpt4 book ai didi

c++ - 为 C++ chrono 重定向 newlib

转载 作者:行者123 更新时间:2023-11-28 04:21:39 27 4
gpt4 key购买 nike

我将 arm-none-eabi 工具链与 newlib 结合使用,以使用 ARM Cortex-M0+(特别是工具链的 MCU-on-eclipse 版本)来定位自定义板。我正在使用 -nostartfiles--specs=nano.specs 进行编译/链接,并将 stdout 和 stderr 分别重新定位到 USB 和串行端口。我已经为大多数 C 系统调用创建了实现。

我正在使用带有两个 custom clock 的 chrono 库, now() 函数获取 RTC 时间或我的系统定时器。这似乎反射(reflect)了标准 steady_clock 和 system_clock 的目的,所以我可以尝试使用它们。

为此,我必须实现我所做的 gettimeofday 系统调用

// returning a set time of one second just for testing
int _gettimeofday(struct timeval* tv, void* tz) {
tv->tv_sec = 1;
tv->tv_usec = 255;
return 0;
}

我的主要代码如下:

int main(void)
{
HWInit();

static std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
static std::chrono::system_clock::time_point t2 = std::chrono::system_clock::now();
int64_t count1 = t1.time_since_epoch().count();
int64_t count2 = t2.time_since_epoch().count();

printf("Time 1: %lld\n Time 2: %lld\n", count1, count2);
for(;;){}
return 0;
}

使用调试器我可以看到 steady_clock::now()sysytem_clock::now() 都调用了我的 _gettimeofday() 函数并且都以完全相同的时间点。

当然,如果我尝试执行以下操作,我会遇到多个定义错误:

using SysClock = std::chrono::system_clock;

SysClock::time_point SysClock::now() noexcept {
return SysClock::time_point( SysClock::duration(1983) );
}

那么我能否以某种方式重载标准计时时钟的 now() 函数?或者也许整个时钟实现与我自己的持续时间和更匹配硬件的 rep typedef?我可以为我的嵌入式系统重载 new 和 delete(并且应该),所以为 chrono 这样做也很好。

最佳答案

来自 gccs libstdc++ chrono.cc :

  • system_clock::now() 使用 gettimeofday(&tv, 0);clock_gettime(CLOCK_REALTIME, &tp); 或系统调用。如果 gettimeofday 对你有效,那就意味着它使用了它。
  • steady_clock::now() 使用 clock_gettime(CLOCK_MONOTONIC, &tp);。所以你应该重载 clock_gettime 并处理 CLOCK_MONOTONIC 参数。
  • newlib 没有提供_clock_gettime_r 函数,_gettimeofday_t 中有一个。传递 newlib 的 struct reent 。如果您想在 newlib 中处理多线程,最好编写您自己的类似包装器来处理 _reent->errno 值。但赌注是重载 _gettimeofday_r 函数,因为您只针对 newlib。

关于c++ - 为 C++ chrono 重定向 newlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55320133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com