我正在使用arm-none-eabi工具链和newlib来针对一个ARM Cortex-M0+的自定义板进行编程(特别是工具链的MCU-on-eclipse版本)。我使用
我正在使用chrono库和两个自定义时钟,now()函数获取RTC时间或我的systick计时器。这似乎反映了标准steady_clock和system_clock的目的,因此我想尝试使用它们。
为此,我必须实现gettimeofday系统调用,我已经完成了这个任务。
那么,我是否可以以某种方式重载标准chrono时钟的now()函数?或者用自己的duration和rep typedefs覆盖整个时钟实现,以更好地匹配硬件?我可以为嵌入式系统重载new和delete(也应该这样做),因此为chrono执行此操作也很好。
-nostartfiles
和--specs=nano.specs
进行编译/链接,并已将stdout和stderr重新定向到USB和串行端口。我已经为大多数C系统调用创建了实现。我正在使用chrono库和两个自定义时钟,now()函数获取RTC时间或我的systick计时器。这似乎反映了标准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()
和system_clock::now()
都调用了我的_gettimeofday()函数,并且最终得到了完全相同的时间点。
当然,如果我尝试执行以下操作,我会得到多个定义错误:
using SysClock = std::chrono::system_clock;
SysClock::time_point SysClock::now() noexcept {
return SysClock::time_point( SysClock::duration(1983) );
}
那么,我是否可以以某种方式重载标准chrono时钟的now()函数?或者用自己的duration和rep typedefs覆盖整个时钟实现,以更好地匹配硬件?我可以为嵌入式系统重载new和delete(也应该这样做),因此为chrono执行此操作也很好。
_GLIBCXX_USE_GETTIMEOFDAY
而不是_GLIBCXX_USE_CLOCK_REALTIME
编译的。reent结构没有任何关于所请求时钟类型的指示,因此我可能需要重新编译libstdc++才能使clock_gettime()工作。感谢提供代码链接。 - CrustyAuklet_GLIBCXX_USE_GETTIMEOFDAY
影响system_clock::now()
。因为arm-none-eabi-gcc
的libstdc++
是没有使用_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL
编译的,所以你需要提供extern "C" int clock_gettime(clockid_t clk_id, struct timespec *tp);
的定义。clk_id
正好用于指定时钟... - KamilCuk