【问题标题】:Lock/unlock mutex under timer interrupt在定时器中断下锁定/解锁互斥锁
【发布时间】:2018-09-20 10:20:22
【问题描述】:

在计时器处理程序(内核空间)中锁定互斥锁是否安全? 我有两个内核模块可以读取/写入同一个 I2C 设备: - 第一个模块:加载时启动计时器。每 20 ms 在定时器处理程序下读取 I2C 寄存器 - 第二个模块:读/写同一个I2C寄存器

我见过很多内核崩溃(CPU 1 被冻结) --> 我怀疑当尝试在计时器处理程序下解锁互斥锁时,内核冻结你能确认一下吗?

【问题讨论】:

  • 您不能在 atomic 或 irq 上下文中使用休眠原语。请改用 spin_lock。

标签: linux-kernel kernel linux-device-driver


【解决方案1】:

中断处理程序不应使用互斥锁进行锁定。这是因为如果 ISR 之外的任何代码尝试保持互斥体,但在完成该操作之前,ISR 会执行然后尝试保持 ISR,它可能会崩溃,因为 互斥体将处于不确定的形式.

如果我只从 ISR 而不是从外部锁定,为什么不能使用互斥锁?

互斥锁是为线程应用程序设计的,一个线程可以被阻塞,直到另一个线程处于临界区。由于您的 ISR 不可阻止,即您不能暂停它,因为 ISR 本身必须在 IRET 之前及时返回。

我应该在 ISR 中使用什么锁定机制?

自旋锁在 ISR 中通常更安全。但是,在锁定和解锁时,您必须确保使用原子原语,这样 ISR 就不会介于两者之间,并在它被其他东西锁定时尝试获取锁。

您也可以在读者可以同时进入的地方使用简单的 RW 锁。当一个 writer 进入时,它会等待所有的 reader 退出,并且会通过不松开锁来阻塞任何进入的 reader。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2012-12-25
    • 2018-05-23
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多