Retargeting newlib for c++ chrono
Retargeting newlib for c++ chrono
我正在使用带有newlib的arm-none-eabi工具链来定位带有ARM Cortex-M0+的自定义板(特别是工具链的MCU-on-eclipse版本)。我正在编译/链接-nostartfiles
和--specs=nano.specs
,并分别将标准输出和标准输出重新定位到 USB 和串行端口。我已经为大多数 C 系统调用创建了实现。
我正在使用带有两个自定义时钟的计时库,now() 函数获取 RTC 时间或我的系统计时器。这似乎反映了标准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: %lldn Time 2: %lldn", 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()功能吗? 或者也许整个时钟实现与我自己的持续时间和代表类型定义更匹配硬件?我可以为我的嵌入式系统重载 new 和删除(并且应该),所以为 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
中传递 newlibstruct reent
的功能一样。如果你想在newlib中处理多线程,最好编写你自己的类似包装器来处理_reent->errno
值。但赌注是超载_gettimeofday_r
功能,因为你只针对 newlib。
与其尝试更改system_clock
和steady_clock
的行为,我建议只编写自己的自定义时钟并使用它们。 这样,您就可以更好地根据您的硬件和需求定制它们。 如果您有某种方法可以获取当前时间,则创建自定义chrono
时钟来包装该功能非常容易。
class SysClock
{
public:
// 500MHz, or whatever you need
using period = std::ratio<1, 500'000'000>;
using rep = long long;
using duration = std::chrono::duration<rep, period>;
using time_point = std::chrono::time_point<SysClcok>;
static constexpr bool is_steady = true;
static time_point now() noexcept
{
return time_point{duration{
/*turn SysTick_getValue() into the number of ticks since epoch*/}};
}
};
现在在代码中使用SysClock::now()
而不是system_clock::now()
。 这为您提供了SysClock::time_point
,并且chrono::durations
减去两个SysClock::time_point
的结果。
如果你能把你的低级"现在"变成针对某个纪元的刻度计数,并且你可以用period
将这些刻度描述为编译时几分之一秒,那么你就可以开始了。
- 从持续时间构造std::chrono::system_clock::time_point
- 如何在c++迭代器类型中包装std::chrono
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用 memcpy() 复制到 std::chrono::milliseconds 会给出错误 -Werror=clas
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 如何在C++中将 chrono::秒转换为 HH:MM:SS 格式的字符串?
- C++ Chrono 确定一天是否是周末?
- std::adjacent_difference with std::chrono time_point
- VSCode 说 std::chrono 是模棱两可的,如果运算符<<重载
- 是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- chrono::month 和 chrono::month 有什么区别
- 比较两个 std::chrono::time_point 实例时出错
- 来自 std::chrono 的编译器警告,但未被使用
- 从编译时已知的日历日期创建"std::chrono::time_point"
- std::chrono::time_point from std::string
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 如何在不使用 std::tm 和 mktime() 的情况下为给定日历日期创建 chrono::time_point 对
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?