本文主要介绍在使用自旋锁(spin_lock_irqsave)的过程中,中断被打开,要锁定“打开中断的代码”的调试过程。
首先介绍spin_lock_irqsave的定义:
函数声明:
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);
函数功能:
1. 保存本地中断状态
2. 关闭本地中断
3. 获取自旋锁
参数说明:
lock:被定义且初始化过的锁;
flags:保存本地中断状态;
调试方法是根据spin_lock_irqsave传回的参数“flags”进行的。
调试方法的依据:
- 在调用spin_lock_irqsave时首先会保存当前的中断状态到“flags”,其次再关闭中断,因此保存的中断状态是关闭中断之前的中断状态。
- 本地测试的结果是“在中断未关闭的情况下上锁返回的flags值为1,在中断关闭后再次上锁返回的flags值为0”
调试方法:
定义多个自旋锁,在上锁与解锁过程中使用二分法多次进行上锁操作,打印flags值。如果flags的值由0变为1就说明在这两次上锁的过程中中断被打开了。
下面就是进行上锁的代码:
static DEFINE_SPINLOCK(lock_t1);
spin_lock_init(&lock_t1);
unsigned long flags_t1;
spin_lock_irqsave(&lock_t1, flags_t1);
printk(KERN_EMERG " spin_unlock flags print:----------> file: %s , func: %s , line: %d , flags: %x .\n" , __FILE__ , __FUNCTION__ , __LINE__ , flags_t1);
注意:
在调试中频繁调用printk会阻塞程序运行。