【IMX6ULLドライバーの開発と学習】 17. カーネルタイマー(キーデバウンス)

1. カーネルタイマーの初期化

setup_timer(struct timer_list *timer, void (*function)(unsigned long), unsigned long data);

timer:タイマー構造体struct timer_list
function:タイマー処理関数
data:パラメータ

2. タイマーのタイムアウト時間を設定する

timer.expires = 0;

3. カーネル タイマーを登録し、そのタイマーをカーネル動的タイマーのリンク リストに追加します。

add_timer(struct timer_list *timer);

4. タイマーを削除する

del_timer(struct timer_list *timer);

5. タイマーのタイムアウト時間を変更するためのボタン割り込み (デバウンス、グリッチ解消レベル)

static irqreturn_t key_irq_handler(int irq, void *dev)
{
    
    
	/* 产生中断时修改定时器计时停止时间 */
	mod_timer(timer, jiffies + HZ/50);
	return IRQ_HANDLED;	 
}

6. タイマー処理機能は、APP プログラムに SIGIO 信号を送信します。

これは非同期通知メカニズムと組み合わせて使用​​する必要があります。非同期通知メカニズムを理解している人は、このブログを読んでください。スリープ機構_ポーリング機構_fasync 非同期通知 (ボタン制御 LED)

static void key_expire_timeout(unsigned long arg)
{
    
    
	......
	......
	
	kill_fasync(&button_fasync, SIGIO, POLL_IN);
	
	......
	......
}

7. ランニングエフェクト (ボタン割り込みは短期間に複数回トリガーされる可能性がありますが、最後のタイマーは 1 回だけタイムアウトします)

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/HuangChen666/article/details/131676029