当前位置: 技术问答>linux和unix
ARM9+linux 2.6.20,中断问题请教!谢谢
来源: 互联网 发布时间:2016-02-10
本文导语: 写了个IO脚的字符设备驱动,驱动注册成功了,IO脚最快200ms会产生一次中断,在中断服务函数 irq_server(int irq, void * pdev) { printk("IO interrupted ...n"); down(&sem); //操作全局变量 代码 up(&s...
写了个IO脚的字符设备驱动,驱动注册成功了,IO脚最快200ms会产生一次中断,在中断服务函数
irq_server(int irq, void * pdev)
{
printk("IO interrupted ...n");
down(&sem);
//操作全局变量 代码
up(&sem);
return 0;
}
在read函数中
int gpio_read(struct inode * pnode,struct file * filp, char * buffer, ssize_t length )
{
printk("IO read ...n");
down(&sem);
//操作全局变量 代码
up(&sem);
return count;
}
中断一直是使能的,在超级终端上打印的信息如下,
IO interrupted ...
IO interrupted ...
IO interrupted ...
IO interrupted ...
IO interrupted ...
IO interrupted ...
IO read ...
IO interrupted ...
IO interrupted ...
IO interrupted ...
BUG: scheduling while atomic: gpio_test / 735
然后就再无信息输出,其实中断还在不断的产生,
#ps
进程gpio_test 在运行,此测试进程每2秒调用read函数,但是总是无法读取到驱动返回的结果。
如果禁止中断,使用查询方式,进程gpio_test 能都回正确结果。
怎么解决,谢谢
irq_server(int irq, void * pdev)
{
printk("IO interrupted ...n");
down(&sem);
//操作全局变量 代码
up(&sem);
return 0;
}
在read函数中
int gpio_read(struct inode * pnode,struct file * filp, char * buffer, ssize_t length )
{
printk("IO read ...n");
down(&sem);
//操作全局变量 代码
up(&sem);
return count;
}
中断一直是使能的,在超级终端上打印的信息如下,
IO interrupted ...
IO interrupted ...
IO interrupted ...
IO interrupted ...
IO interrupted ...
IO interrupted ...
IO read ...
IO interrupted ...
IO interrupted ...
IO interrupted ...
BUG: scheduling while atomic: gpio_test / 735
然后就再无信息输出,其实中断还在不断的产生,
#ps
进程gpio_test 在运行,此测试进程每2秒调用read函数,但是总是无法读取到驱动返回的结果。
如果禁止中断,使用查询方式,进程gpio_test 能都回正确结果。
怎么解决,谢谢
|
down(&sem);
//操作全局变量 代码
up(&sem);
=======================
中断里不能用信号量
改spin_lock试试看,还有要求你的中断代码中进入后要求把自己给关闭,退出前开启:)
//操作全局变量 代码
up(&sem);
=======================
中断里不能用信号量
改spin_lock试试看,还有要求你的中断代码中进入后要求把自己给关闭,退出前开启:)