6

如果代码如下

void test(void)
{
  spin_lock_irqsave(&lock1, flag);
  ...
  func1();
  ...
  spin_unlock_irqrestore(&lock1, flag);
}

void func1(void)
{
  spin_lock_irqsave(&lock2, flag);
  ...
  spin_unlock_irqrestore(&lock2, flag);
}

代码会有问题吗?当spin_unlock_irqrestore在 func1 中调用时,中断是否已经启用?我想要实现的是test()例程可以在没有调度程序或中断的任何中断的情况下执行。非常感谢

4

1 回答 1

6

据我在文档中找到的,并且我还没有完全用尽我的搜索,flag将保存设置不同标志的位的状态,然后关闭中断,然后在结束时恢复它。如果第一次调用已关闭中断test,然后您进行了另一次调用,我会假设(并且没有任何其他说明我发现)它将关闭中断,将它们存储flags并恢复到内部func(),然后恢复它们回到状态flag已经在test

test中断应该只在你的函数之后重新启用。

我会说你唯一的问题是你不能flag在两个函数中使用相同的变量,否则你会覆盖你的内部调用中的第一个,然后重置它,如果你的调用之间有任何标志发生变化,你可以重置外部一到错误的状态。

于 2012-09-25T15:41:00.383 回答