我正在使用mbed平臺在ARM MCU上編程運動控制器。 我需要確定while循環的每次迭代的時間,但我正在努力想辦法做到這一點。用Mbed跟蹤時間
我有兩個可能的方法:
1)定義多少次迭代每秒可以完成,用「等待」,所以每次迭代有規律的間隔之後發生。然後,我可以增加一個計數器來確定時間。
2)在進入循環前捕獲系統時間,然後連續循環,從原始系統時間減去當前系統時間以確定時間。
我是沿着正確的軌道思考還是我完全錯過了?
我正在使用mbed平臺在ARM MCU上編程運動控制器。 我需要確定while循環的每次迭代的時間,但我正在努力想辦法做到這一點。用Mbed跟蹤時間
我有兩個可能的方法:
1)定義多少次迭代每秒可以完成,用「等待」,所以每次迭代有規律的間隔之後發生。然後,我可以增加一個計數器來確定時間。
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設備。這真的取決於你想要項目的精確性和便攜性!
原始來源: