这是Linux典型的中断处理方式,RTC_interrupt()是中断的上半部,它完成flag的计数和唤醒中断的下半部RTC_read()后,就返回了。剩下就是RTC_read()处理了。
“当用户调用读函数读取时间时调用上面的函数,而上面的函数却调用了wait_event_interruptible函数,那么这个函数不就睡眠了吗?”
对的,用户调用RTC_read()就会进入休眠。
“也就是在RTC_interrupt中唤醒了读线程中的等待。 但是我不明白该中断何时才能触发? 不可能用户读时钟的时候还的等中断吧每次。 所以我就不明白在读函数中为什么加入睡眠,他也不是个循环函数,请帮小弟分析一下 谢谢。”
这个中断是由时钟中断触发的,每次用户读取时就是要等待时钟中断发生,来更新BCD寄存器的值。如果不休眠等待就不能保证每次读取的值是发生时钟中断后更新的值。RTC_read()本身不是一个循环函数,但调用它的函数应该是循环调用RTC_read()的。