求教关于RTC驱动的问题

leo_fly_pig 2010-02-25 10:52:38
小弟菜鸟刚刚接触这块,遇见个不解的问题希望老鸟们帮忙。
驱动相关代码:
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中唤醒了读线程中的等待。 但是我不明白该中断何时才能触发? 不可能用户读时钟的时候还的等中断吧每次。 所以我就不明白在读函数中为什么加入睡眠,他也不是个循环函数,请帮小弟分析一下 谢谢。
...全文
93 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rn708 2010-03-15
  • 打赏
  • 举报
回复
这是Linux典型的中断处理方式,RTC_interrupt()是中断的上半部,它完成flag的计数和唤醒中断的下半部RTC_read()后,就返回了。剩下就是RTC_read()处理了。


“当用户调用读函数读取时间时调用上面的函数,而上面的函数却调用了wait_event_interruptible函数,那么这个函数不就睡眠了吗?”
对的,用户调用RTC_read()就会进入休眠。

“也就是在RTC_interrupt中唤醒了读线程中的等待。 但是我不明白该中断何时才能触发? 不可能用户读时钟的时候还的等中断吧每次。 所以我就不明白在读函数中为什么加入睡眠,他也不是个循环函数,请帮小弟分析一下 谢谢。”
这个中断是由时钟中断触发的,每次用户读取时就是要等待时钟中断发生,来更新BCD寄存器的值。如果不休眠等待就不能保证每次读取的值是发生时钟中断后更新的值。RTC_read()本身不是一个循环函数,但调用它的函数应该是循环调用RTC_read()的。


codesnail 2010-02-25
  • 打赏
  • 举报
回复
麻烦,还不如自己写个驱动,简单的问题复杂化了。
leo_fly_pig 2010-02-25
  • 打赏
  • 举报
回复
我主要是想知道这么干的目的,说不定有好处那,这样才能进步吗

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧