2014-06-28 3 views
0

Я использую платформу mbed для программирования контроллера движения на ARM MCU. Мне нужно определить время на каждой итерации цикла while, но я стараюсь думать о том, как это сделать.Сохранение времени с помощью Mbed

У меня есть два возможных метода:

1) Определить, сколько итераций может быть сделано на второй и использовать «ждать», поэтому каждая итерация происходит после того, как через регулярные промежутки времени. Затем я могу увеличить счетчик, чтобы определить время.

2) Захват системного времени перед тем, как идти в цикл, а затем непрерывно контур, вычитая текущее системное время от исходного системного времени, чтобы определить время.

Я думаю по правильным дорожкам, или я полностью пропустил это?

ответ

2

Ваш первый вариант не идеален, так как части ожидания и счетчика будут отбрасывать цифры, и вы получите менее точную информацию о своих итерациях.

Второй вариант жизнеспособен в зависимости от того, как вы его реализуете. В 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