2017-10-13 1 views
2

Kann Chrono als Timer/Zähler in einem Bare-Metal-Mikrocontroller (z. B. MSP432 mit einem RTOS) verwendet werden? Kann die high_resolution_clock (und andere APIs in chrono) so konfiguriert werden, dass sie basierend auf dem tatsächlichen Timer-Tick/Register des gegebenen Mikrocontrollers inkrementiert wird?Verwendung von <chrono> als Timer in Bare-Metal-Mikrocontroller?

Das Echtzeit-C++ Buch (Abschnitt 16.5) scheint darauf hinzudeuten, dass dies möglich ist, aber ich habe keine Beispiele dafür gefunden, insbesondere in Bare-Metal-Mikrocontrollern.

Wie könnte dies implementiert werden? Würde das überhaupt empfohlen? Wenn nicht, wo kann chrono in RTOS-basierter eingebetteter Software helfen?

+0

Was RTOS nicht bereits Timer Dienstleistungen umfassen! ? Was ist "Chrono" auf jeden Fall? Es könnte sich auf eine Reihe von Dingen beziehen. Wenn Sie auf die C++ 11 verweisen, dann können Sie dieses C++ markieren und explizit sein. Darüber hinaus sind Zeit- und Zeitgeberdienste eine Hardwareabhängigkeit. Wenn Ihre eingebettete Bibliothek dies unterstützt, müssen Sie den Syscall-Leim dennoch für die zugrunde liegende Hardware und das RTOS implementieren - das wird nicht durch Magie funktionieren! – Clifford

Antwort

2

Ich würde eine Uhr schaffen, die jetzt implementiert durch aus dem Timer-Register zu lesen:

#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"}}; 
    } 
}; 

einstellen Zeit, was auch immer Geschwindigkeit Ihres Prozessors Zecken an (es gibt aber eine Kompilierung-Konstante sein). Oben habe ich es für 1 Tick/ms eingestellt. Hier ist, wie es für 1 tick == 2 ns sollte lauten:

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

Jetzt können Sie sagen Dinge wie:

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

und

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

Sollte nicht 1 Tick == 2ns lesen std :: ratio <1, 500'000'000>? –

+0

@ Jörgen: Ja, danke. Dummes Denken von mir. Korrigiert. –

Verwandte Themen