2014-06-28 1 views
0

J'utilise la plate-forme mbed pour programmer un contrôleur de mouvement sur un MCU ARM. J'ai besoin de déterminer l'heure à chaque itération d'une boucle while, mais j'ai du mal à trouver le meilleur moyen de le faire.Garder la trace du temps avec Mbed

J'ai deux méthodes possibles:

1) Définir le nombre d'itérations peut être fait par seconde et l'utilisation « wait » de sorte que chaque itération se produit après un intervalle régulier. Je peux ensuite incrémenter un compteur pour déterminer l'heure.

2) Capturer l'heure du système avant d'entrer dans la boucle, puis effectuer une boucle continue, en soustrayant l'heure système actuelle de l'heure système d'origine pour déterminer l'heure. Est-ce que je pense aux bonnes pistes ou est-ce que je l'ai complètement raté?

Répondre

2

Votre première option n'est pas idéale car les parties d'attente et de comptage vont jeter les numéros et vous obtiendrez des informations moins précises sur vos itérations.

La deuxième option est viable en fonction de la façon dont vous l'implémentez. mbed a une bibliothèque appelée "Timer.h" qui serait une solution facile à votre problème. La fonction de minuterie est basée sur l'interruption (en utilisant Timer3 si vous utilisez un LPC1768), vous pouvez voir le manuel ici: mbed .org/handbook/Timer. ARM prend en charge les adresses 32 bits dans le cadre des processeurs Cortex-M3, ce qui signifie que les temporisateurs sont des compteurs de 32 bits int microseconde. Ce que cela signifie pour votre facilité d'utilisation, c'est que cette librairie peut durer jusqu'à 30 minutes maximum, donc idéal pour les temps entre microsecondes et secondes (si vous avez besoin de plus de temps, vous aurez besoin d'une horloge en temps réel). C'est à vous de décider si vous voulez connaître le nombre de millisecondes ou de microsecondes. Si vous voulez micro, vous devrez appeler la fonction read_us() et si vous voulez milli, vous utiliserez read_ms(). L'utilisation des interruptions de minuterie affectera votre temps de 1-2 microsecondes, donc si vous souhaitez garder la trace à ce niveau au lieu de millisecondes, vous devrez garder cela à l'esprit.

Voici un exemple de code pour ce que vous essayez d'accomplir (à partir d'une LPC1768 et écrit en utilisant le compilateur en ligne):

#include "mbed.h" 
#include "Timer.h" 
Timer timer; 

Serial device (p9,p10); 



int main() { 
    device.baud(19200); //setting baud rate 
    int my_num=10; //number of loops in while 
    int i=0; 
    float sum=0; 
    float dev=0; 
    float num[my_num]; 
    float my_time[my_num]; //initial values of array set to zero 
    for(int i=0; i<my_num; i++) 
    { 
     my_time[i]=0; //initialize array to 0 
    } 

timer.start(); //start timer 
while (i < my_num) //collect information on timing 
{ 
    printf("Hello World\n"); 
    i++; 
    my_time[i-1]=timer.read_ms(); //needs to be the last command before loop restarts to be more accurate 
} 
timer.stop(); //stop timer 
sum=my_time[0]; //set initial value of sum to first time input 

for(i=1; i < my_num; i++) 
{ 
    my_time[i]=my_time[i]-my_time[i-1]; //making the array hold each loop time 
    sum=sum+my_time[i]; //sum of times for mean and standard deviation 
} 
sum = sum/my_num; //sum of times is now the mean so as to not waste memory 

device.printf("Here are the times for each loop: \n"); 
for(i=0; i<my_num; i++) 
{ 
    device.printf("Loop %d: %.3f\n", i+1, my_time[i]); 
} 

device.printf("Your average loop time is %.3f ms\n", sum); 
    for(int i=0; i<my_num; i++) 
    { 
     num[i]= my_time[i]-sum; 
     dev = dev +(num[i])*(num[i]); 
    } 
    dev = sqrt(dev/(my_num-1)); //dev is now the value of the standard deviation 
    device.printf("The standard deviation of your loops is %.3f ms\n", dev); 

    return 0; 
} 

Une autre option, vous pouvez utiliser sont les fonctions de minuterie sysTick qui peut être mis en œuvre similaire aux fonctions vues ci-dessus et il rendrait votre code plus portable à tout appareil ARM avec un Cortex-Mx, car il est basé sur la minuterie du système du microprocesseur (lire plus ici: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Babieigh.html). Cela dépend vraiment de la précision et de la portabilité de votre projet!

Source d'origine: http://community.arm.com/groups/embedded/blog/2014/09/05/intern-inquiry-95

Questions connexes