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