我正在使用mbed平台对ARM MCU上的运动控制器进行编程。 我需要确定while循环的每次迭代的时间,但我很难想到最好的方法。
我有两种可能的方法:
1)定义每秒可以完成多少次迭代并使用“等待”,以便每次迭代在定期间隔之后发生。然后我可以增加一个计数器来确定时间。
2)在进入循环之前捕获系统时间然后连续循环,从原始系统时间减去当前系统时间以确定时间。
我是在考虑正确的轨道还是完全错过了它?
答案 0 :(得分:2)
您的第一个选项并不理想,因为等待和计数器部分会丢弃数字,您最终会得到关于迭代的准确度较低的信息。
第二种选择是可行的,具体取决于您如何实施它。 mbed有一个名为“Timer.h”的库,可以很容易地解决您的问题。定时器功能是基于中断的(如果您使用LPC1768,则使用Timer3),您可以在此处查看手册:mbed .org / handbook / Timer。 ARM支持32位地址作为Cortex-M3处理器的一部分,这意味着定时器是32位的int微秒计数器。这对您的可用性意味着这个库可以保持最多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;
}
您可以使用的另一个选项是SysTick定时器功能,可以实现类似于上面看到的功能,它可以使您的代码更容易移植到任何带有Cortex-Mx的ARM设备,因为它基于微处理器的系统定时器(在此处阅读更多内容: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