Ваш первый вариант не идеален, так как части ожидания и счетчика будут отбрасывать цифры, и вы получите менее точную информацию о своих итерациях.
Второй вариант жизнеспособен в зависимости от того, как вы его реализуете. В mbed есть библиотека под названием «Timer.h», которая будет легким решением вашей проблемы. Функция таймера основана на прерывании (используя Timer3, если вы используете LPC1768), вы можете увидеть руководство здесь: mbed .org/handbook/Timer. ARM поддерживает 32-разрядные адреса как часть процессоров Cortex-M3, что означает, что таймеры являются 32-разрядными счетчиками с микросекундой. Что это означает для удобства использования, так это то, что эта библиотека может поддерживать время до 30 минут, поэтому они идеально подходят для времени между микросекундами и секундами (если требуется больше времени, чем тогда, вам понадобятся часы реального времени). Это зависит от вас, если вы хотите узнать счет в миллисекундах или микросекундах. Если вы хотите микро, вам нужно будет вызвать функцию read_us(), и если вы хотите милли, вы будете использовать read_ms(). Использование прерываний таймера повлияет на ваше время на 1-2 микросекунды, поэтому, если вы хотите отслеживать этот уровень, а не миллисекунды, вам придется помнить об этом.
Вот пример кода, для того, что вы пытаетесь достичь (на основе LPC1768 и написана с помощью онлайн-компилятор):
#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;
}
Другой вариант вы можете использовать являются функции таймера SysTick, которые могут быть реализованы аналогично функциям, описанным выше, и это сделает ваш код более переносимым для любого устройства ARM с Cortex-Mx, поскольку он основан на системном таймере микропроцессора (подробнее здесь: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Babieigh.html). Это действительно зависит от того, насколько точны и переносимы вы хотите, чтобы ваш проект был!
Оригинальный источник: http://community.arm.com/groups/embedded/blog/2014/09/05/intern-inquiry-95