1

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

一点背景;我已经接管了内核驱动程序的开发,用于与 FPGA 的 Gumstix 接口。在这种情况下,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);
}

然后在另一个文件(primary.c - 处理特定接口)中,我们有这个:

struct fpga_primary {
    ....
    struct kfifo* fifo;
    spinlock_t* fifo_lock;
...
};

static struct fpga_primary primary;

int fpga_primary_init(void)
{
    info("Starting Primary\n");

    //Get our fifo and fifo lock
    get_fifo(1, primary.fifo, primary.lock_fifo);

    info("Got kfifo_addr=%x, lock_addr=%x\n", primary.fifo, primary.fifo_lock);
    ...
    info("Completed Primary\n");
}

现在,下面是来自 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(...) 的调用返回 NULL 指针。这真的不好,我似乎无法找出原因。

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

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

4

1 回答 1

2

我认为错误的结果是由于函数 void get_fifo(int dev, struct kfifo* fifo, spinlock_t* lock),在这个函数中,您将结果分配给局部变量:fifo 和 lock;当 get_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() 为:

    get_fifo(1, &(primary.fifo), &(primary.lock_fifo));

我认为它会解决你的问题。

于 2013-05-29T01:44:46.363 回答