2017-10-13 7 views
2

Le chrono peut-il être utilisé en tant que compteur/compteur dans un microcontrôleur (par exemple MSP432 exécutant un RTOS)? La high_resolution_clock (et d'autres API dans chrono) peut-elle être configurée de telle sorte qu'elle s'incrémente en fonction du tick/register du timer du microcontrôleur donné? Le livre en temps réel C++ (section 16.5) semble suggérer que cela est possible, mais je n'ai trouvé aucun exemple de cela appliqué, en particulier dans les microcontrôleurs bare-metal.L'utilisation de <chrono> en tant que minuterie dans un microcontrôleur bare-metal?

Comment cela pourrait-il être mis en œuvre? Serait-ce même recommandé? Sinon, où peut-on utiliser chrono dans un logiciel embarqué RTOS?

+0

Qu'est-ce que RTOS ne comprend pas déjà des services de minuterie! ? Qu'est-ce que "Chrono" dans tous les cas? Cela pourrait faire référence à un certain nombre de choses. Si vous faites référence à C++ 11 , vous pouvez marquer ce C++ et être explicite. De plus, les services de temps et de minuterie sont une dépendance matérielle, donc si votre bibliothèque intégrée le supporte, vous devrez toujours implémenter la colle syscall au matériel sous-jacent et au RTOS - cela ne fonctionnera pas par magie! – Clifford

Répondre

2

Je créerais une horloge qui implémente maintenant en lisant votre registre de minuterie:

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

Adjust période quelle que soit la vitesse de votre processeur tiques à (mais il ne faut être une constante de compilation). Ci-dessus, je l'ai mis pour 1 tick/ms. Voici comment il faut lire pour 1 tick == 2ns:

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

Maintenant vous pouvez dire des choses comme:

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

et

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

Ne pas 1 cocher == 2ns lire std :: ratio <1, 500'000'000>? –

+0

@ Jörgen: Oui, merci. Dumb pense-o de ma part. Corrigée. –