我能否重新定向chrono类以使用微控制器作为tick生成器?

3

我希望使用微控制器中的定时器作为chrono类的计时器。假设我有一个函数可以从MCU的定时器寄存器获取tick,我称之为get_tick(),这个寄存器是32位无符号整数,每1微秒递增一次。现在为了在chrono中使用它,我创建了一个类,如下所示:

class clock
{
public:
  static std::chrono::time_point<clock, std::chrono::duration<std::uint32_t, std::ratio<1, 1000000> now() {
    return std::chrono::time_point<clock, std::chrono::duration<std::uint32_t, std::ratio<1, 1000000> {std::chrono::duration<uint32_t, std::ratio<1, 1000000>> { get_tick() }};
}
};

但它不起作用!


2
请详细说明“不起作用!”您遇到了某种问题,请告诉我们具体是什么问题。 - Drew Dormann
1个回答

4

无法运行是因为chrono库检测到子优化代码格式。:-)

开个玩笑。

clock缺少一些嵌套类型,客户端代码可能希望这些类型存在。您还可以使用std::micro代替std::ratio<1, 1000000>。您的选择并没有错,这只是一个样式建议。

#include <chrono>

class clock
{
public:
    using rep        = std::uint32_t;
    using period     = std::micro;
    using duration   = std::chrono::duration<rep, period>;
    using time_point = std::chrono::time_point<clock>;
    static constexpr bool is_steady = true;

    static time_point now() {
        return time_point{duration { get_tick() }};
    }
};

以下是官方的要求:http://eel.is/c++draft/time.clock.req

请注意,您的时钟将每小时和11分钟左右翻转一次。


哦,好多了。谢谢。我读了官方要求并注意到如果始终t1 <= t2,则is_steady为true。但在我的情况下不是这样,正如你所提到的,它将翻转(在1.2小时后)。因此,在我的情况下,is_steady应该为false。至于翻转,我知道如何解决这个问题;我应该检查t1<t2,如果不是,则使用0xFFFFFFFF - (t1 - t2)作为时间差。 - siii fsxa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接