关于armLinux的实时性之usleep的分析

分析使用基于armlinux的平台下采集数据,计划在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次如下

ewewwe.png

取平均值 560us,

 dre.png

usleep(1)打开 ,

取平均值905us

 

 

 

Usleep(1)  的时间实际为 905us-560us = 345us 

误差还是挺大的。

 

 

sitemap