2014-06-28 133 views
0

我正在使用mbed平臺在ARM MCU上編程運動控制器。 我需要確定while循環的每次迭代的時間,但我正在努力想辦法做到這一點。用Mbed跟蹤時間

我有兩個可能的方法:

1)定義多少次迭代每秒可以完成,用「等待」,所以每次迭代有規律的間隔之後發生。然後,我可以增加一個計數器來確定時間。

2)在進入循環前捕獲系統時間,然後連續循環,從原始系統時間減去當前系統時間以確定時間。

我是沿着正確的軌道思考還是我完全錯過了?

回答

2

你的第一個選擇並不理想,因爲等待和計數器部分會拋出數字,最終得到的迭代信息不太準確。

第二個選項是可行的取決於你如何實現它。 mbed有一個名爲「Timer.h」的庫,它可以很容易地解決你的問題。定時器功能基於中斷(如果使用LPC1768,使用Timer3),您可以在這裏查看手冊:mbed .org/handbook/Timer。 ARM支持32位地址作爲Cortex-M3處理器的一部分,這意味着定時器是32位整數微秒計數器。這對你的可用性意味着這個庫可以保持最多30分鐘的時間,因此它們適用於微秒和秒之間的時間(如果需要更多時間,那麼你需要一個實時時鐘)。如果您想知道以毫秒或微秒爲單位的計數,則取決於您。如果你想要micro,你需要調用函數read_us(),如果你想要milli,你將使用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; 
} 

你可以使用另一種選擇是可實現的,系統定時器功能類似於上面看到的功能,因爲它基於微處理器的系統定時器(詳情請參閱:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Babieigh.html),它將使您的代碼更易於使用Cortex-Mx的任何ARM設備。這真的取決於你想要項目的精確性和便攜性!

原始來源:​​