2017-10-13 43 views
2

可以将计时器用作裸机微控制器中的定时器/计数器(例如,运行RTOS的MSP432)? high_resolution_clock(和chrono中的其他API)的配置是否可以根据给定的微控制器的实际计时器滴答/寄存器来递增?在裸机微控制器中使用<chrono>作为定时器?

Real-Time C++书(第16.5节)似乎暗示这是可能的,但我还没有找到任何应​​用的例子,特别是在裸机微控制器中。

这怎么能实现?这甚至会被推荐?如果没有,那么chrono可以在基于RTOS的嵌入式软件中获得什么帮助?

+0

什么RTOS还不包括计时器服务! ?无论如何,什么是“Chrono”?它可以涉及许多事情。如果你指的是C++ 11 ,那么你可以标记这个C++并且是明确的。另外,时间和定时器服务是硬件依赖性,所以如果你的嵌入式库支持它,你仍然需要在底层硬件和RTOS上实现系统调用 - 它不会起作用! – Clifford

回答

2

我会创造现在从您的定时器寄存器读取实现时钟:

#include <chrono> 
#include <cstdint> 

struct clock 
{ 
    using rep  = std::int64_t; 
    using period  = std::milli; 
    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() noexcept 
    { 
     return time_point{duration{"asm to read timer register"}}; 
    } 
}; 

调整期间任何速度的处理器在蜱(但它必须是一个编译时间常数)。上面我已经设置为1滴答/毫秒。下面是它应该如何读1点== 2ns的:

using period = std::ratio<1, 500'000'000>; 

现在你可以说喜欢的东西:

auto t = clock::now(); // a chrono::time_point 

auto d = clock::now() - t; // a chrono::duration 
+0

不应该1 tick = 2ns读取std ::比率<1,500'000'000>? –

+0

@Jörgen:是的,谢谢。愚蠢的思考 - 我的角色。纠正。 –