关于armLinux的实时性之usleep的分析
分析使用基于arm的linux的平台下采集数据,计划在20ms内采集128个点,由于Linux实时性的限制,其软件中断不可取,计划使用while循环方式。
如果20ms内采集128个点,那么如果usleep精确的话,usleep是一个微妙级的延时,
则可以按下的方式实现
int i;
while(i++ < 128)//128*157us = 20096us 即20ms
{
adcv=adcget();//get data
usleep(157);//delay 156us
}
由于对Linux下的usleep的不可信,所以进行测试,查看误差。
编写一下代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
int main(int argc, char *argv[])
{
printf("Hello, world!\n");
struct timeval tvafter,tvpre;
struct timezone tz;
int sum = 0;
int i=0;
gettimeofday (&tvpre , NULL);
printf("start:%d.%d us,\n",tvpre.tv_sec,tvpre.tv_usec);
//for(i = 0; i < 10; i++)
//{
// sum += i;
// usleep(5);
//}
gettimeofday (&tvafter , NULL);
printf("end: %d.%d us;\n",tvafter.tv_sec,tvafter.tv_usec);
printf("时间差: %d us;\n",tvafter.tv_usec-tvpre.tv_usec);
return EXIT_SUCCESS;
}
在没有使用usleep 时 由于每条程序都会有时钟周期,先测出这些浪费的时间,测出10次如下
取平均值 560us,
将 usleep(1)打开 ,
取平均值905us
Usleep(1) 的时间实际为 905us-560us = 345us 。
误差还是挺大的。