2016-10-01 13 views
-1

Прошу прощения, если его вопрос уже задан каким-то образом.Как избежать укладки таймера

Я сейчас переписываю драйвер вибрации в ядре Linux. Причина, по которой я ее изменила, была связана с чрезмерно сильными вибрациями, вызванными увеличением удельной скорости вибрационного двигателя. Для работы над этим я реализовал контроллер PWM, который просто останавливает двигатель в определенное время, прежде чем достичь максимального ускорения, и, наконец, он повторяет это действие.

Существует одна большая проблема, которая в основном заметна при использовании клавиатуры. Если вибратор слишком часто переключается за очень короткое время, таймер имеет тенденцию наращивать время, вызывая задержки и задержки вибрации. Этот недостаток можно легко получить при наборе нескольких ключей одновременно.

Чтобы продемонстрировать это событие визуально, я создал небольшой график.

Timer Graph

Красная область указывает на перекрытие таймера. Наложение между вибрациями 1 и 2 вызывает задержку для второй вибрации, что приводит к ее неуместности.

Основная идея для предотвращения этой проблемы - объединить вибрации в одну, если предыдущая вибрация еще не закончена. Например, вибрация 2 просто присоединяется к вибрации 1.

Другим способом было бы просто использовать одиночную вибрацию для штабелированных вибраций, например, вибрация 2 могла просто использовать последний оставшийся бит вибрации 1. Почему это работает? Хорошо, потому что контроллер вибрации, который я реализовал, применяется только к временам менее 100 мс, что означает, что разницы во времени вибрации не будут заметны, если один из них должен был спамить нажатием клавиш одновременно, вместо этого оба нажатия клавиш должны формироваться и делиться одной вибрацией.

Наконец, на мой вопрос, как я могу выполнить функцию, проверьте, что она снова вызвана. Или, по крайней мере, добавить время для проверки функции, если несколько раз за короткое время несколько раз спамеруются клавиши?

+0

Фокус на один вопрос, полученный из одной проблемы. Не давайте нам лишнюю информацию, не пытайтесь ответить на ваши вопросы, не извиняйтесь. Это бессмысленно, ясно, что вы просите, исправьте опечатку, «почти идеально» не имеет смысла, что она либо совершенна, либо сломана. Очевидно, что это не идеально. – Malina

ответ

0
int foo() 
{ 
    static foo_counter; 

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

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

Я уже знаю следующий метод, проблема в том, что функция уже выполняется один раз. То, что я ищу, - это что-то вроде цикла, который проверяет, была ли функция повторно вызвана, скажем, через 10 мс. Пример: while (check! = Timeout) {проверить новый вызов функции}. Aka Я хочу, чтобы он предсказал вызов функции, но если он не прибыл, он продолжает делать то, что он должен делать – CTXz

+0

Ну, проверьте эту функцию: http://man7.org/linux/man-pages/man2/timer_create. 2.html – Malina

+0

Вы не «предсказываете», что вводите функцию, и внутри функции решают (проверяют), нужно ли принудительно возвращать или выполнять свою работу. Проверьте функцию таймера, у которой есть подпрограммы, подлежащие уничтожению. – Malina