2024-08-31 Linux bug调试记录,linux 驱动里面kthread_run 打开一个内核线程里面如果使用 mdelay 会导致系统崩溃,使用ssleep msleep代替

一、测试代码

二、系统崩溃,无法动弹

三、可能的原因分析

在Linux内核驱动中,使用mdelay在队列的while循环里可能会导致系统挂起,因为mdelay是一个忙等待(busy-wait)函数,它在延迟期间占用CPU资源,不进行任何实际工作,这会阻止其他任务的执行,特别是当它在队列处理循环中使用时。如果队列处理循环是一个高优先级的任务,它可能会阻止低优先级任务运行,从而导致系统整体响应变慢甚至挂起。

为了避免这种情况,你应该考虑使用不同的方法来实现延迟。以下是一些替代方案:

  1. 使用msleepmsleep_interruptible: 这些函数会使当前进程休眠,允许其他任务在延迟期间运行。例如,你可以使用msleep(10)来代替mdelay(10000),以实现10毫秒的延迟。

  2. 使用schedule_timeout: 如果你需要在延迟后继续执行,可以使用schedule_timeout函数。这允许进程休眠直到超时或被唤醒。

  3. 使用wait_eventwait_event_interruptible: 如果你在等待某个事件的发生,可以使用这些等待队列函数。它们允许进程休眠直到特定条件满足或超时。

  4. 重新设计延迟逻辑: 如果可能,重新设计你的驱动逻辑,以避免长时间延迟或忙等待。例如,如果延迟是为了等待硬件状态变化,考虑使用中断或轮询硬件状态,而不是使用延迟函数。

  5. 使用usleep_range: 对于非常短的延迟(微秒级),可以使用usleep_range,它基于高精度计时器(hrtimers)。

记住,选择正确的延迟函数对于保持系统的响应性和效率至关重要。在设计内核驱动时,应尽量避免使用忙等待,以免影响系统的整体性能。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值