嵌入式Linux定时器问题

开发平台:Debain

目标板:HI3518E

最近在HI3518E上编写应用程序时需要用到定时器来实现每隔一定的时间往串口发送数据,可是在实现定时器上出现了问题,具体表现为定时不准,于是乎编写了一段代码在Debain主机上进行测试,效果也正常,代码如下,定时35ms

/*************************************************************************
	> 文件名: timer.c
	> 作者: 
	> 邮箱: 
	> 简介: 
	> 创建时间: Tue 19 May 2015 03:53:58 PM CST
 ************************************************************************/
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <sys/time.h>
#include <unistd.h>

struct timeval tpstart,tpend;
void stop_timer(void);
void start_timer(void);
void timer_deal(int timer)
{
    unsigned long timeused;
	
	if(timer != SIGALRM)
		return;
	gettimeofday(&tpend,0);
	timeused=(tpend.tv_sec-tpstart.tv_sec)*1000000+tpend.tv_usec-tpstart.tv_usec;
	printf("used time:%lu\n",timeused);
	tpstart = tpend;
	
	
	signal(SIGALRM,timer_deal);
	
	return;
}

void stop_timer(void) 
{ 
	struct itimerval value; 
	value.it_value.tv_sec = 0; 
	value.it_value.tv_usec = 0; 
	value.it_interval = value.it_value; 
	setitimer(ITIMER_REAL, &value, NULL); 
}

void start_timer(void) 
{ 
	struct itimerval value; 
	value.it_value.tv_sec = 0; 
	value.it_value.tv_usec = 10; 
	value.it_interval.tv_sec = 0;
	value.it_interval.tv_usec = 35000;
	setitimer(ITIMER_REAL, &value, NULL); 
}

int main(void)
{

	signal(SIGALRM,timer_deal);
	start_timer();//定时35ms
	gettimeofday(&tpstart,0);
	while (1)
	{
		sleep(2);
	}
	return 0;
}

运行的效果如下:

嵌入式Linux定时器问题_第1张图片

每次进入定时器处理函数的时间间隔基本上是固定35ms的,交叉编译后下载目标板上,运行,效果如下

嵌入式Linux定时器问题_第2张图片

进入定时器处理函数的时间间隔并不是固定的35ms,在29ms-40ms之间跳动,真的很费解,linux中内核在调度的时间是10ms,但是在PC主机上却是可以实现比系统时钟短的延时,在ARM板上却不得行。而后将定时时间改为40ms即10ms的整数倍,再次进行测试,在目标板上得到的结果如下

嵌入式Linux定时器问题_第3张图片

可以看到结果基本上是正确的,陷入了深深的思考中,希望有大牛可以指导一哈,在arm板上如何实现毫秒级定时,或者还是因为我板子上哪里配置有问题,不胜感激

你可能感兴趣的:(嵌入式Linux定时器问题)