【IMX6ULLドライバ開発学習】 15. IMX6ULLドライバ開発問題記録(kill_fasyncによりスリープが中断される)

問題発見のきっかけ:
非同期通知を学習する際に、自分で機能を実装: ボタンを押してブザーを制御し、同時に LED ライトが点滅する
結果: LED はボタンによって同時に制御されているようです時間

最後に、デバッグの結果、
アプリケーション層のスリープがドライバー層のkill_fasyncによって中断されたため、次のループに再度入る前にスリープの実行が終了しなかったことがわかりました。
ここに画像の説明を挿入
コードを修正した後、問題は解決されました
。解決策のロジック:スリープ機能が中断されるため、2 回目のスリープ時間を短くする
ここに画像の説明を挿入
説明:
スリープ機能は中断できます。つまり、プロセスがスリープ中に中断された場合、その後、割り込みが終了して再度処理が実行されると、スリープ関数から処理が開始され、次のステートメントが実行されます。
これは、kill_fasync 関数に割り込みがあることを示しています。

PS:
なぜスリープは中断された直後に次の文を実行するのでしょうか? (ご質問ありがとうございます @dhy9974)

睡眠に関するマニュアルを見る

man 3 sleep

sleep関数に戻り値があることが判明

SLEEP(3)                               Linux Programmer's Manual                               SLEEP(3)

NAME
       sleep - sleep for a specified number of seconds

SYNOPSIS
       #include <unistd.h>

       unsigned int sleep(unsigned int seconds);

DESCRIPTION
       sleep()  causes  the calling thread to sleep either until the number of real-time seconds speci‐
       fied in seconds have elapsed or until a signal arrives which is not ignored.

RETURN VALUE
       Zero if the requested time has elapsed, or the number of seconds left to sleep, if
        the call  was interrupted by a signal handler.

戻り値:
要求された時間が経過した場合は 0 を返し、
コールがシグナル ハンドラーによって中断された場合はスリープまでの残りの秒数を返します。

本当の睡眠を実現したい場合は、睡眠が中断されても大丈夫です、次のように書くことができます

int time;
while(time > 0){
    
    
    time = sleep(time);
}

おすすめ

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