当前位置: 技术问答>linux和unix
[求助] 驱动程序中的定时中断不准
来源: 互联网 发布时间:2017-05-30
本文导语: Hi 调试了好几天,网上也找了好多资料,还是没有解决掉,只好来求助大牛们了 我用dm365开发板,从官网下下来的嵌入式linux源码,运行一切OK。 然后我写了一个16K的定时中断(用的Timer1)驱动程序,驱动加载后就...
Hi 调试了好几天,网上也找了好多资料,还是没有解决掉,只好来求助大牛们了
我用dm365开发板,从官网下下来的嵌入式linux源码,运行一切OK。
然后我写了一个16K的定时中断(用的Timer1)驱动程序,驱动加载后就开始跑16K定时器,定时器里的工作很简单如下:
gpio_set_value(gpio_test, 1);
udelay(20);
gpio_set_value(gpio_test, 0);
然而16K的定时中断不稳定,偶尔会出现16k滞后一点的波形,如下图所示
如果再跑其他应用程序,比如下列main函数
int main(){
while(1)
{
usleep(1000);
}
return 0;
}
则16K的定时中断每隔大约1ms就会出现一次滞后不稳(感觉是usleep之后进程唤醒导致占用了系统资源)
我一直理解定时中断应该是硬件中断,不受内核进程调度的影响,但是执行下来确实会不稳。
不知道大牛们有没有什么办法,可以使得16k定时器中断很稳定,谢啦
我用dm365开发板,从官网下下来的嵌入式linux源码,运行一切OK。
然后我写了一个16K的定时中断(用的Timer1)驱动程序,驱动加载后就开始跑16K定时器,定时器里的工作很简单如下:
gpio_set_value(gpio_test, 1);
udelay(20);
gpio_set_value(gpio_test, 0);
然而16K的定时中断不稳定,偶尔会出现16k滞后一点的波形,如下图所示
如果再跑其他应用程序,比如下列main函数
int main(){
while(1)
{
usleep(1000);
}
return 0;
}
则16K的定时中断每隔大约1ms就会出现一次滞后不稳(感觉是usleep之后进程唤醒导致占用了系统资源)
我一直理解定时中断应该是硬件中断,不受内核进程调度的影响,但是执行下来确实会不稳。
不知道大牛们有没有什么办法,可以使得16k定时器中断很稳定,谢啦
|
20微秒!!!虽然我没搞过这方面,但是对时钟有过一些探索,我的印象中,没办法做到这么精确的吧。不知道你是什么样的需求,需要做到这么高的精确度?
|
这方面我真不在行,可能有什么时钟控制操作,可以咨询一些硬件方面的行家吧。
我之前在windows底下控制Sleep,毫秒级的,都没办法很准确,这种东西抖动效应很大。我想,你是不是该选用其它方法来做控制?
我之前在windows底下控制Sleep,毫秒级的,都没办法很准确,这种东西抖动效应很大。我想,你是不是该选用其它方法来做控制?
|
我有试过用工作队列来实现定时延时功能,不过我只是将时钟节拍改到1ms的精度。至于20微秒到没有试过
|
一般都是硬件终端触发后 交给队列软中断处理 这样才能减少中断的占用时间