|
小弟菜鸟刚刚接触这块,遇见个不解的问题希望老鸟们帮忙。
驱动相关代码:
static int RTC_read(struct file *filp,char __user *buff,size_t count,loff_t *offp)
{
int hour,min,sec;
wait_event_interruptible(wq,flag); //在此处进入休眠,等待中断唤醒
hour=num_from_BCD(ioread32(rtchour)); //从BCD寄存器读取时间,并将BCD码转换为整型数据
min=num_from_BCD(ioread32(rtcmin));
sec=num_from_BCD(ioread32(rtcsec));
set_time(hour,min,sec);
copy_to_user(buff,time,sizeof(time)); //将时间数据复制到用户空间
flag=0;
return 0;
}
当用户调用读函数读取时间时调用上面的函数,而上面的函数却调用了wait_event_interruptible函数,那么这个函数不就睡眠了吗?
在static int RTC_open(struct inode *inode,struct file *filp)
{
int ret;
ret=request_irq(DEVICE_IRQ,&RTC_interrupt,SA_INTERRUPT,DEVICE_NAME,NULL);
if(ret<0){
printk("Request irq failed!\n");
return ret;
}
函数中确实调用了request_irq函数向系统中注册了一个中断函数RTC_interrupt。下面是RTC_interrupt代码
irqreturn_t RTC_interrupt(void)
{
flag++;
wake_up_interruptible(&wq); //在中断服务程序内唤醒等待队列的进程,这里是唤醒read进程
return IRQ_HANDLED;
}
也就是在RTC_interrupt中唤醒了读线程中的等待。 但是我不明白该中断何时才能触发? 不可能用户读时钟的时候还的等中断吧每次。 所以我就不明白在读函数中为什么加入睡眠,他也不是个循环函数,请帮小弟分析一下 谢谢。
|
|