Linux mutex不能用在中断函数原因:Backtrace来看,应该是i2c_transfer中调用mutex_lock导致schedule调用。
pthread_mutex_lock(&qlock)表示尝试去把qlock上锁,它会先判断qlock是否已经上锁,如果已经上锁这个线程就会停在这一步直到其他线程把锁解开。它才继续运行。所以代码中要么是线程1先执行完后执行线程2,要么就是线程2先执行,再执行线程1.而线程3一开始就执行了。
中断函数防止方法:
要防止中断冲突,其实就是要知道什么设备容易产生中断冲突,只要知道了这点,在使用这些设备时稍微注意一下就可以了。下面我列出一些容易冲突的设备,希望对读者有用。
1、声卡:一些早期的ISA型声卡,系统很有可能不认,就需要用户手动设置(一般为5)。
2、内置调制解调器和鼠标:一般鼠标用COM1,内置调制解调器使用COM2的中断(一般为3),这时要注意此时COM2上不应有其它设备。
从 Backtrace 来看,应该是 i2c_transfer 中调用 mutex_lock 导致 schedule 调用而产生 进程调度,导致死机. 而在中断上下文,这种情况是绝对不允许发生的.换句话说是不允许睡眠的,不允许进程调度.
你可以 把 mutex_lock 注释掉再试试 .
最近我也遇到这个问题了,纠结了一天,在网友的支持下解决了,这个天嵌的版本中,i2c和他的摄像头驱动(OV9650驱动)相冲突,你在编译内核之前,将摄像头的驱动全部去掉,这样子重新编译之后,i2c就可以正常测试使用了。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)