2017-07-25 19 views
1

J'essaye de mesurer le temps pris par des processus dans le programme C++ avec linux et Vxworks. J'ai remarqué que clock_gettime (CLOCK_REALTIME, timespec) est assez précis (résolution d'environ 1 ns) pour faire le travail sur beaucoup d'Oses. Pour une question de portabilité, j'utilise cette fonction et l'exécute sur Vxworks 6.2 et Linux 3.7. J'ai essayé de mesurer le temps pris par une simple impression:comment exécuter Clock-gettime correctement dans Vxworks pour obtenir l'heure exacte

#define <timers.h< 
    #define <iostream> 
    #define BILLION 1000000000L 
    int main(){ 
     struct timespec start, end; uint32_t diff; 
     for(int i=0; i<1000; i++){ 
     clock_gettime(CLOCK_REALTME, &start); 
     std::cout<<"Do stuff"<<std::endl; 
     clock_gettime(CLOCK_REALTME, &end); 
     diff = BILLION*(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec); 
     std::cout<<diff<<std::endl; 
     } 
     return 0; 
    } 

Je compilé ceci sur Linux et VxWorks. Pour Linux, les résultats semblaient logiques (moyenne de 20 μs). Mais pour Vxworks, j'ai beaucoup de zéros, puis 5000000 ns, puis beaucoup de zéros ... PS, pour vxwroks, j'ai couru cette application sur ARM-cortex A8, et les résultats semblent aléatoires ont-ils vu la même chose bug avant,

+0

[Ce] (https://stackoverflow.com/questions/13474000/arm-performance-counters-vs-linux-clock-gettime) ressemble à moi, peut-être le problème est avec la plate-forme cible et non VxWorks. – Steeve

Répondre

-1

Je pense que dans vxworks par défaut, la résolution de l'horloge est 16.66ms que vous pouvez obtenir en appelant la fonction clock_getres(). Vous pouvez changer la résolution en appelant la fonction sysclkrateset() (la résolution maximum supportée est de 200us je devine en passant 5000 comme argument à la fonction sysclkrateset). Vous pouvez ensuite calculer la différence entre deux horodatages en utilisant la fonction difftime()

0

Dans vxworks, la résolution d'horloge est définie par la fréquence du planificateur du système. Par défaut, il s'agit généralement de 60 Hz, mais peut varier en fonction de BSP, de la configuration du noyau ou de la configuration d'exécution.

Les paramètres de configuration du noyau VxWorks SYS_CLK_RATE_MAX et SYS_CLK_RATE_MIN définir les valeurs maximales et minimales prises en charge, et SYS_CLK_RATE définit le taux de défaut, appliqué au démarrage.

La fréquence d'horloge réelle peut être modifiée à l'exécution à l'aide de sysClkRateSet, soit dans votre code, soit à partir du shell.

Vous pouvez vérifier le débit actuel en utilisant sysClkRateGet. Etant donné que vous voyez 0 ou 5000000ns - ce qui est 5ms, je suppose que votre fréquence d'horloge du système est ~ 200Hz.

Pour obtenir une meilleure résolution, vous pouvez augmenter la fréquence d'horloge du système. Cependant, cela peut avoir des effets secondaires indésirables, car cela augmentera la fréquence de certaines opérations du système.

Une meilleure méthode de code temporel peut être d'utiliser sysTimestamp qui est typiquement piloté par un temporisateur à haute fréquence, et peut être utilisé pour effectuer une temporisation à haute résolution d'activités de courte durée.