Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel Linux内核驱动程序:返回指向kfifo的指针将导致空指针_Linux Kernel_Linux Device Driver - Fatal编程技术网

Linux kernel Linux内核驱动程序:返回指向kfifo的指针将导致空指针

Linux kernel Linux内核驱动程序:返回指向kfifo的指针将导致空指针,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我遇到了一个问题,将指针传递给kfifo,我似乎无法解决这个问题 一点背景;我已经接管了Gumstix接口的内核驱动程序的开发,该接口带有FPGA。此场景中的FPGA基本上是获取多个串行流,对数据进行一些处理,然后通过GPIO将其提供给Gumstix。由于这实际上是一个相当复杂的项目,我将省去细节——因为它将变成一个相当长的帖子,包含大部分不相关的信息。我有用于各个串行接口的工作原型驱动程序-这个驱动程序就是所有这些组合的驱动程序 在该驱动程序的第一个/主文件(gpio.c)中,许多kfifo被

我遇到了一个问题,将指针传递给kfifo,我似乎无法解决这个问题

一点背景;我已经接管了Gumstix接口的内核驱动程序的开发,该接口带有FPGA。此场景中的FPGA基本上是获取多个串行流,对数据进行一些处理,然后通过GPIO将其提供给Gumstix。由于这实际上是一个相当复杂的项目,我将省去细节——因为它将变成一个相当长的帖子,包含大部分不相关的信息。我有用于各个串行接口的工作原型驱动程序-这个驱动程序就是所有这些组合的驱动程序

在该驱动程序的第一个/主文件(gpio.c)中,许多kfifo被初始化并存储在一个数组中,存储在一个结构中:

#define NUM_DEVICES 31
#define DEVICE_FIFO_SIZE 65536

struct fpga_interface {
    ...
    struct kfifo fifos[NUM_DEVICES];
    spinlock_t fifo_locks[NUM_DEVICES];
    ...
};

static struct fpga_interface fpga;

int __init fpga_init_interface(void)
{
    int i;

    info("Initialising\n");

    // KFifo initialisation
    for(i=0; i<NUM_DEVICES; i++)
    {
        if(kfifo_alloc(&(fpga.fifos[i]), DEVICE_FIFO_SIZE, GFP_KERNEL)) {
            printk(KERN_ERR, "Error allocating the KFIFOs\n");
            return 1;
        }

        spin_lock_init(&fpga.fifo_locks[i]);

        info("Initialised KFIFO %d with addr=%x\n", i, &(fpga.fifos[i]));
    }
    ...
    info("Initialised\n");
}

void get_fifo(int dev, struct kfifo* fifo, spinlock_t* lock)
{
    fifo = &(fpga.fifos[dev]);
    lock = &(fpga.fifo_locks[dev]);

    info("Returning the KFIFO for devid=%d, fifo=%x, lock=%x", dev, fifo, lock);
}
下面是gumstix的内核日志:

Nov 30 02:28:14 overo [17837.989776] GPIO: Initialising
Nov 30 02:28:14 overo [17837.997497] Initialised KFIFO 0 with addr=bf062bb4
Nov 30 02:28:14 overo [17838.005249] Initialised KFIFO 1 with addr=bf062bc8
Nov 30 02:28:14 overo [17838.012847] Initialised KFIFO 2 with addr=bf062bdc
...
Nov 30 02:28:14 overo [17838.233947] GPIO: Initialised
...
Nov 30 02:28:14 overo [17838.264984] PRIMARY: Starting Primary
Nov 30 02:28:14 overo [17838.272979] GPIO: Returning the KFIFO for devid=1, fifo=bf062bc8, lock=bf062e20
Nov 30 02:28:14 overo [17838.281280] PRIMARY: Got kfifo_addr=0, lock_addr=0
Nov 30 02:28:14 overo [17838.296203] PRIMARY: Completed Primary 
您会注意到,get_fifo(…)调用返回空指针。这真的不好,我似乎不知道为什么

我使用的是OpenEmbedded/BitBake标准环境,内核版本为3.2.0,Angstrom 2011.03工具链。我正在构建Ubuntu 10.04


有什么想法吗?我一直在想,由于某种原因,我被阻止传递一个指向kfifo的指针……但是我还没有找到任何关于为什么我不能/不应该这样做的文档,考虑到我们将指向kfifo的指针传递给kifo_函数。

我认为错误的结果是由于函数void get_fifo造成的(int dev,struct kfifo*fifo,spinlock\u t*lock),在此函数中,您将结果分配给局部变量:fifo和lock;当get\u fifo()返回时,局部变量将无效

因此,我的建议是:将get_fifo()函数声明为:

    void get_fifo(int dev, struct kfifo** fifo, spinlock_t** lock)
    {
        *fifo = &(fpga.fifos[dev]);
        *lock = &(fpga.fifo_locks[dev]);

        info("Returning the KFIFO for devid=%d, fifo=%x, lock=%x", dev, *fifo, *lock);
    }
在函数int fpga_primary_init(void)中,调用get_fifo()作为:

我想它会解决您的问题。

如何
获取fifo()
返回值?它需要一个双指针来写回值。
    void get_fifo(int dev, struct kfifo** fifo, spinlock_t** lock)
    {
        *fifo = &(fpga.fifos[dev]);
        *lock = &(fpga.fifo_locks[dev]);

        info("Returning the KFIFO for devid=%d, fifo=%x, lock=%x", dev, *fifo, *lock);
    }
    get_fifo(1, &(primary.fifo), &(primary.lock_fifo));