2016-10-01 2 views
-1

그의 질문에 이미 어떤 질문이 있으면 유감입니다.타이머 스태킹을 피하는 방법

나는 현재 리눅스 커널의 진동 드라이버를 다시 쓰고 있어요. 내가 바꾼 이유는 진동 모터의 특정 속도를 얻음으로써 발생하는 지나친 강한 진동 때문이었습니다. 이를 해결하기 위해, 최대 가속에 도달하기 전에 특정 시간에 모터를 멈추게하는 컨트롤러와 같은 PWM을 구현했습니다. 마침내이 동작을 계속 반복합니다.

키보드를 사용할 때 주로 눈에 띄는 하나의 큰 문제가 있습니다. 바이브레이터가 매우 짧은 시간에 너무 자주 토글되면 타이머가 쌓이는 경향이있어 지연과 진동 지연이 발생합니다. 이 결함은 한 번에 여러 개의 키를 입력 할 때 쉽게 얻을 수 있습니다.

이 이벤트를 시각적으로 설명하기 위해 작은 그래프를 만들었습니다.

Timer Graph

빨간색 영역 타이머 오버랩을 나타낸다. 진동 1과 진동 2 사이의 겹침은 제 2 진동에 대한 지연을 야기하여 제 위치에서 이동시킵니다. 이 문제를 방지하기 위해

내 주요 아이디어는 이전의 진동이 아직 완료되지 않은 경우 하나에 진동을 병합하는 것입니다. 예를 진동 2의 경우 단순히 또 다른 방법은 단순히 스택 진동에 대한 하나의 진동을 사용하는 것입니다 1.

진동에 가입 것, 예를 들어, 진동이 단순히 진동 1의 마지막 남은 비트를 사용할 수있는 이유는이 작품이 것? 왜냐하면 내가 구현 한 진동 컨트롤러는 100ms 미만의 시간에만 적용되기 때문에 한 번에 키 입력에 스팸을 보내는 경우 진동 시간 차이가 눈에 띄지 않을 것입니다. 대신 키 스트로크가 형성되어 단일 진동을 공유해야합니다. 나는 기능 자체를 확인 할 수있는 방법을 내 질문에 마지막으로

, 그것은 다시 호출되는의 IT. 또는 적어도 키 입력이 짧은 시간에 여러 번 스팸되고 있는지 확인하는 기능을 추가하십시오. 하나의 문제에서 파생 된 하나의 질문에

+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