一、测试代码
二、系统崩溃,无法动弹
三、可能的原因分析
在Linux内核驱动中,使用mdelay
在队列的while
循环里可能会导致系统挂起,因为mdelay
是一个忙等待(busy-wait)函数,它在延迟期间占用CPU资源,不进行任何实际工作,这会阻止其他任务的执行,特别是当它在队列处理循环中使用时。如果队列处理循环是一个高优先级的任务,它可能会阻止低优先级任务运行,从而导致系统整体响应变慢甚至挂起。
为了避免这种情况,你应该考虑使用不同的方法来实现延迟。以下是一些替代方案:
-
使用
msleep
或msleep_interruptible
: 这些函数会使当前进程休眠,允许其他任务在延迟期间运行。例如,你可以使用msleep(10)
来代替mdelay(10000)
,以实现10毫秒的延迟。 -
使用
schedule_timeout
: 如果你需要在延迟后继续执行,可以使用schedule_timeout
函数。这允许进程休眠直到超时或被唤醒。 -
使用
wait_event
或wait_event_interruptible
: 如果你在等待某个事件的发生,可以使用这些等待队列函数。它们允许进程休眠直到特定条件满足或超时。 -
重新设计延迟逻辑: 如果可能,重新设计你的驱动逻辑,以避免长时间延迟或忙等待。例如,如果延迟是为了等待硬件状态变化,考虑使用中断或轮询硬件状态,而不是使用延迟函数。
-
使用
usleep_range
: 对于非常短的延迟(微秒级),可以使用usleep_range
,它基于高精度计时器(hrtimers)。
记住,选择正确的延迟函数对于保持系统的响应性和效率至关重要。在设计内核驱动时,应尽量避免使用忙等待,以免影响系统的整体性能。