2017-10-13 58 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:是的,謝謝。愚蠢的思考 - 我的角色。糾正。 –