【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

发现问题的契机:
学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁
结果:LED好像也同时被按键控制了

最后调试结果发现:
应用层的sleep被驱动层的kill_fasync打断,所以sleep没有执行完就重新进入下一次循环了
【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)_第1张图片
修改代码后解决该问题
解决逻辑就是:既然休眠函数会被打断,则让每次休眠的时间短一点
【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)_第2张图片
解释:
sleep函数是可以被中断的,也就是说当进程在睡眠的过程中,如果被中断,那么当中断结束回来再执行该进程的时候,该进程会从sleep函数的下一条语句执行。
说明kill_fasync这个函数中有中断发生。

PS:
为什么sleep被中断后会直接执行下一句呢?(感谢网友的提问 @dhy9974)

查看sleep的man手册

man 3 sleep

发现sleep函数有返回值

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

NAME
       sleep - sleep for a specified number of seconds

SYNOPSIS
       #include 

       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.

返回值:
如果请求的时间已过,则返回零,
如果调用被信号处理程序中断,则返回剩余的睡眠秒数。

如果想做到真正的睡眠,sleep被中断了也没问题的话,可以这么写

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

你可能感兴趣的:(IMX6ULL,驱动开发,学习,IMX6ULL,fasync)