红联Linux门户
Linux帮助

嵌入式Linux定时器问题

发布时间:2016-09-23 09:32:31来源:linux网站作者:anobodykey
开发平台:Debain
目标板:HI3518E
 
最近在HI3518E上编写应用程序时需要用到定时器来实现每隔一定的时间往串口发送数据,可是在实现定时器上出现了问题,具体表现为定时不准,于是乎编写了一段代码在Debain主机上进行测试,效果也正常,代码如下,定时35ms。
 
/************************************************** 
> 文件名: timer.c 
> 作者:  
> 邮箱:  
> 简介:  
> 创建时间: Tue 19 May 2016 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定时器问题
 
每次进入定时器处理函数的时间间隔基本上是固定35ms的,交叉编译后下载目标板上,运行,效果如下:
嵌入式Linux定时器问题
 
进入定时器处理函数的时间间隔并不是固定的35ms,在29ms-40ms之间跳动,真的很费解,linux中内核在调度的时间是10ms,但是在PC主机上却是可以实现比系统时钟短的延时,在ARM板上却不得行。而后将定时时间改为40ms即10ms的整数倍,再次进行测试,在目标板上得到的结果如下:
嵌入式Linux定时器问题
可以看到结果基本上是正确的。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24392.html