2689|3

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求教关于RTC驱动的问题 [复制链接]

小弟菜鸟刚刚接触这块,遇见个不解的问题希望老鸟们帮忙。
驱动相关代码:
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中唤醒了读线程中的等待。  但是我不明白该中断何时才能触发? 不可能用户读时钟的时候还的等中断吧每次。 所以我就不明白在读函数中为什么加入睡眠,他也不是个循环函数,请帮小弟分析一下 谢谢。

最新回复

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

回复
举报
啊时代华 该用户已被删除
沙发
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我主要是想知道这么干的目的,说不定有好处那,这样才能进步吗
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
这是Linux典型的中断处理方式,RTC_interrupt()是中断的上半部,它完成flag的计数和唤醒中断的下半部RTC_read()后,就返回了。剩下就是RTC_read()处理了。


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

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


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表