c - 似乎 disable_irq 不能真正屏蔽中断
问题描述
在我的代码中似乎 disable_irq 不能真正禁用 irq,我有以下代码
rc = devm_request_threaded_irq(&client->dev, irq, NULL,
name_for_ask_question_irq_handler,
IRQF_ONESHOT | IRQF_TRIGGER_FALLING, client->name, data);
if (rc < 0) {
dev_err(&client->dev, "request irq failed \n");
return rc;
}
/* IRQ handler threadeded, this can (and will) sleep */
static irqreturn_t name_for_ask_question_irq_handler(int irq, void *dev)
{
struct touch_point_data *pdata = dev;
dev_err(&pdata->client->dev, "%s:%d irq handler \n", __func__, __LINE__);
return IRQ_HANDLED;
}
static ssize_t wakeup_i2c_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t size)
{
struct touch_point_data *pdata = dev_get_drvdata(dev);
if (buf[0] == '1') {
disable_irq(pdata->client->irq);
gpiod_direction_output(pdata->gpiod_irq, 0);
udelay(100);
gpiod_direction_output(pdata->gpiod_irq, 1);
udelay(100);
gpiod_direction_output(pdata->gpiod_irq, 0);
udelay(100);
gpiod_direction_output(pdata->gpiod_irq, 1);
udelay(100);
gpiod_direction_input(pdata->gpiod_irq);
dev_err(&pdata->client->dev, "%s:%d disable irq \n", __func__, __LINE__);
} else if (buf[0] == '2') {
enable_irq(pdata->client->irq);
dev_err(&pdata->client->dev, "%s:%d enable irq \n", __func__, __LINE__);
}
return size;
}
我很困惑,为什么 disable_irq 不能真正屏蔽中断,似乎这个函数只是延迟了 IRQ,并且在 enable_irq 之后仍然会调用 irq_handler。有没有人知道发生了什么?
解决方案
延迟处理中断直到重新启用,这正是“屏蔽”中断的含义。这正是disable_irq()
/enable_irq()
应该如何工作。
如果您想忽略某些中断,只需将该逻辑放入您的中断处理程序中。
推荐阅读
- wpf - 使用 Prism 7 和 WPF 使用单个视图加载多个视图模型
- python-3.x - SetWithCopyWarning 异常
- c - 这个程序中返回的值是。. . .酷儿至少可以说
- r - R中的棘手for循环/添加到数据框
- ruby - Grape API - 使用带有数据选项的 curl 发出发布请求的问题
- error-handling - SAS 回归图错误
- java - OpenGL 函数给出 FunctionNotSupported 错误
- javascript - 如何从 Ionic 将图像上传到 Firebase 存储?
- c - 为什么在函数结束时出现分段错误 (C)?
- javascript - Angular 6 - 在不同的选项卡和浏览器之间共享对象实例