首页 > 解决方案 > Linux内核模块:我的变量在线程函数中使用时丢失了它的值

问题描述

我正在开发一个 Linux 内核模块,它读取我的嵌入式板按钮代码并使用它来打开/关闭板 LED。

当我按下按钮时,模块会正确地将按钮代码(260)发送到用户空间。

现在,从用户空间,我使用 write 函数来重新发送这个代码内核模块:

write(fd, buf_wr, strlen(buf_wr));

其中fd是我的模块的文件描述符,而buf_wr是将写入文件的缓冲区。

在内核空间中,我write_pid以这种方式使用该函数:

static ssize_t write_pid(struct file *pfile, const char __user *buffer,
                                size_t length, loff_t *offset)
{
    char cod_buf[12];

    printk("WE ARE IN WRITE_PID FUNCTION\n");
    copy_from_user(cod_buf, buffer, length);
    sscanf(cod_buf, "%i", &lcode);
    printk("lcode = %i\n", lcode);

    return 0;
}

lcode在我的内核模块中定义为一个全局变量:

int lcode = 0;

我可以看到它正在接收正确的按钮代码,即 260。

现在,我在模块中创建了一个线程,我希望这个线程根据按钮代码运行一些指令:

int write_in_thread(void *data) {

    printk("Under write_in_thread, lcode = %i\n", lcode);

    switch (lcode) {
        case 260:
        //instructions....
        //instructions....
        //instructions....
        break;

        default :
        //instructions....
        break;
    }

    return 0;
}

这里的问题,我可以看到,Under write_in_thread, lcode = 0。这不是260。所以 case 语句正在运行我在这里不需要的默认语句。

如何修复lcode变量以将其值保留在线程函数中?

谢谢!

标签: cmultithreadinglinux-kernellinux-device-driver

解决方案


推荐阅读