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 回だけタイムアウトします)