2016-10-01 146 views
-1

如果他的问题已经以某种方式提出,我很抱歉。如何避免定时器堆叠

我目前正在重写在Linux内核中的振动驱动器。我改变它的原因是由于获得振动电机的特定速度而导致过度强烈的振动。为了解决这个问题,我实现了一个类似于PWM的控制器,它可以在达到最大加速度之前的某个特定时间停止电机,最后它会一直重复这个动作。

有一个很大的问题使用键盘时,主要是明显的。如果振动器在非常短的时间内过于频繁地切换,则计时器往往会叠加时间,导致滞后和振动延迟。一次键入多个键时可轻松实现此缺陷。

为了向您演示此事件,我创建了一个小图。

Timer Graph

红色区域指示定时器重叠。振动1和2之间的重叠导致第二次振动的延迟,将其移出原位。

我来防止这一问题的主要思想是,如果前面的震动尚未结束振动合并成一个。例如振动2将简单地加入振动1.

另一种方法是简单地使用堆叠震动单一的振动,例如,振动2可以简单地使用振动1.仅存的一点为什么将这项工作?那么,因为我实施的振动控制器仅适用于100ms以下的时间,这意味着如果一次发送垃圾邮件至击键,振动时间差别不会显而易见,相反,这两个击键应形成并共享单个振动。

最后我的问题,我怎么可能让一个函数检查它本身它被再次调用。或者至少增加一个时间让功能检查是否在短时间内多次发送垃圾信息?

+0

专注于从一个问题衍生的一个问题。不要给我们提供不必要的信息,不要试图回答你的问题,不要道歉这没有意义,明确你要问什么,修正错字,“几乎完美”没有意义,它是完美的或破碎的。很明显,它并不完美。 – Malina

回答

0
int foo() 
{ 
    static foo_counter; 

    if(foo_counter) 
    { 
     // If function has been called again 
    } 

    return(0); 
    foo_counter++; 
} 
+0

我已经知道下面的方法,这个问题是这个函数已经被执行了一次。我正在寻找的东西就像是一个循环,用于检查函数是否在接下来的10ms中被重新调用。例如:while(check!= timeout){检查新的函数调用}。也就是我想让它预测一个函数调用,但是如果它没有到达它继续做它应该做的事 – CTXz

+0

好吧,检查这个函数:http://man7.org/linux/man-pages/man2/timer_create。 2.html – Malina

+0

你不会“预测”你输入一个函数,并且在函数内部决定(检查)是强制返回还是执行它的操作。检查定时器功能它有例程被销毁 – Malina