免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5755 | 回复: 18
打印 上一主题 下一主题

linux驱动中断服务导致内核崩溃求教!新手注意!大虾赐教啊! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-05 13:36 |只看该作者 |倒序浏览
小弟最近刚开始学习驱动的开发,编写一个ADC的驱动,结果在中断时导致内核崩溃,调试的结果是寄存器操作函数ioread16()导致,readw()也不行。
请大虾赐教,在此先谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-11-05 13:46 |只看该作者
回复 1# gandeyao


    readw()/in16()试试

论坛徽章:
0
3 [报告]
发表于 2010-11-05 14:05 |只看该作者
还是不行,放在中断服务程序外就是好的,可以得到转化后的值。实在不明白是什么原因。

论坛徽章:
0
4 [报告]
发表于 2010-11-05 14:08 |只看该作者
arm-linux?

内核版本?

论坛徽章:
0
5 [报告]
发表于 2010-11-05 14:12 |只看该作者
arm-linux-gcc4.3.2
kernel:linux2.6.30.4

论坛徽章:
0
6 [报告]
发表于 2010-11-05 14:39 |只看该作者
有浮点数运算没?

论坛徽章:
0
7 [报告]
发表于 2010-11-05 14:46 |只看该作者
static irqreturn_t ad_irq(int irq, void *dev_id)
{
        if(MAJOR(((struct ad_dev *)dev_id)->cdev.dev)!=24
                return IRQ_NONE;
        if(!ad_wait_con)
        {
//                ad_data = ioread16(GADCDAT0);
                ad_wait_con = 1;
                wake_up_interruptible(&ad_cdev->ad_waitq);
        }

        return IRQ_HANDLED;
}
没有浮点运算,没有打印函数。如果把那行注释掉,放在其他地方就没事,而且可以运行起来。也能得到正确结果。

论坛徽章:
0
8 [报告]
发表于 2010-11-05 15:01 |只看该作者
回复 7# gandeyao


    寄存器地址需要ioremap()一下再用吧?

论坛徽章:
0
9 [报告]
发表于 2010-11-05 15:05 |只看该作者
已经ioremap()过了。  #define GADCDAT0 ioremap(0x5800000c, 2)

论坛徽章:
0
10 [报告]
发表于 2010-11-05 15:15 |只看该作者
回复 7# gandeyao


    把这段代码反汇编出来呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP