首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >唤醒一个熟睡的卡特琳

唤醒一个熟睡的卡特琳
EN

Stack Overflow用户
提问于 2021-06-29 11:00:01
回答 1查看 576关注 0票数 1
代码语言:javascript
复制
static struct task_struct *control = NULL;
static long call_ioctl(struct file *filp, unsigned int iocmd, unsigned long arg) 
{
    switch (iocmd)
    {
        case SETMODE:
            /* get buffer data from userspace which is either 0 or 1 */
            /* 0: Manual 1: Automatic*/
            switch (buffer)
            {
            case MANUAL:
                if (control)
                {
                    kthread_stop(control);
                    control = NULL;
                    printk(KERN_ALERT "Switching to MANUAL disabling kernel thread for Automatic\n");
                }
                mode = MANUAL_MODE;
                printk(KERN_ALERT "IN MANUAL \n");
                break;

            case AUTOMATIC:
            if (automatic_fan_control() != 0)
            {
                printk(KERN_ALERT "Failed to set fan to  AUTOMATIC!!! \n");
                return -1;
            }
            break;

            default:
                printk(KERN_ALERT "Entered value is incorrect\n");
                return -EINVAL;
            }
        break;
    }
       
}

static inline int automatic_fan_control(void)
{
    control = kthread_run(sense_cpu_temperature, NULL, "Temperature Thread");
    if (control)
    {
        printk(KERN_ALERT "Kthread Created Successfully\n");
    }
    else
    {
        printk(KERN_ALERT "Failed to create kthread. \n");
        control = NULL;
        return -1;
    }
    return 0;
}

int temperature(void *arg)
{

    while (!kthread_should_stop())
    {
        mutex_lock(&mutex);
        get_temperature();
        mutex_unlock(&mutex);
        /* Process the temperature value */
        msleep_interruptible(polling_interval);
    }
    return 0;
}

这是我为驱动程序编写的上面的代码:

  • 当我切换到自动模式时,线程被创建来获取温度并对其进行处理,一旦它完成,它将休眠polling_interval时间,然后再次处理过一段时间。当我切换到手动模式时,
  • 必须停止该线程并进入非线程的手动模式。这里我面临的
  • 问题是,当切换到手动时,它将在线程的睡眠时间完成后响应。如果提供的睡眠时间间隔很大,则切换到手动模式需要很长时间,
  • 是否有任何方法可以在k线程中将其切换到手动模式。我是新手,如果你能帮忙的话,

就太棒了。

EN

回答 1

Stack Overflow用户

发布于 2021-06-29 12:14:39

让我们看看msleep_interruptible的来源

代码语言:javascript
复制
unsigned long msleep_interruptible(unsigned int msecs)
{
        unsigned long timeout = msecs_to_jiffies(msecs) + 1;

        while (timeout && !signal_pending(current))
                timeout = schedule_timeout_interruptible(timeout);
        return jiffies_to_msecs(timeout);
}

schedule_timeout_interruptible将休眠状态放置到超时结束,或者发送信号,或者显式唤醒信号。它返回在jiffies的剩余时间。如上文所示,如果msleep_interruptible早早醒来,没有信号等待,它就会重新入睡。

kthread_stop显式地唤醒线程任务,但不发送信号,因此msleep_interruptible将运行到完成,如果早起,线程任务就会重新进入休眠状态。

在本例中,一个简单的修复方法是在temperature中替换此调用。

代码语言:javascript
复制
        msleep_interruptible(polling_interval);

通过以下呼吁:

代码语言:javascript
复制
        schedule_timeout_uninterruptible(msecs_to_jiffies(polling_interval) + 1);

然后,如果早点醒来,它就不会再睡觉了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68177436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档