2016-10-01 82 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