Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
C 结构分配大小中断spi\U同步\U传输_C_Linux Kernel_Linux Device Driver_Raspberry Pi3_Spi - Fatal编程技术网

C 结构分配大小中断spi\U同步\U传输

C 结构分配大小中断spi\U同步\U传输,c,linux-kernel,linux-device-driver,raspberry-pi3,spi,C,Linux Kernel,Linux Device Driver,Raspberry Pi3,Spi,我在玩覆盆子圆周率。使用逻辑分析仪,我可以观察总线上发生的情况。我的问题是,如果我更改为spi\u传输分配的内存大小struct: 总之,下面的代码可以很好地用于 kmalloc(sizeof(struct spi_transfer)*1,GFP_内核)但不使用kmalloc(sizeof(struct spi_transfer)*2,GFP_内核) 我用的是树莓皮3和树莓皮。我的内核版本是4.19.64 union command_u { uint8_t buf[4]; uin

我在玩覆盆子圆周率。使用逻辑分析仪,我可以观察总线上发生的情况。我的问题是,如果我更改为
spi\u传输分配的内存大小
struct:

总之,下面的代码可以很好地用于
kmalloc(sizeof(struct spi_transfer)*1,GFP_内核)但不使用
kmalloc(sizeof(struct spi_transfer)*2,GFP_内核)

我用的是树莓皮3和树莓皮。我的内核版本是4.19.64

union command_u
{
    uint8_t buf[4];
    uint32_t u32;
};
我假设内存分配没有失败,因为我看到Malloc工作:)当我执行
dmesg
时。 我也试过分配3*sizeof(spi_传输),但也没用

我试图分配2个spi_传输,并将
spi_sync_transfer
函数的spi_传输的参数号修改为2,但也不起作用

欢迎任何反馈或建议

编辑: 我还尝试分配和使用2
spi\u传输

union command_u
{
    uint8_t buf[4];
    uint32_t u32;
};
uint16_t ads8661_read(uint16_t address)
{
    address &= 0x01fc;
    uint32_t ret0;
    union command_u ret;
    union command_u payload = {.buf = {0xc8 | (address >> 8), address, 0x00, 0x00}};
    union command_u payload_nop = {.u32 = 0x00000000};

    struct spi_transfer * trans_array = kmalloc_array(2,sizeof(struct spi_transfer),GFP_KERNEL);

    if(trans_array){
        printk(KERN_NOTICE "Malloc Worked :)");

        trans_array[0].tx_buf = &payload;
        trans_array[0].rx_buf = &ret0;
        trans_array[0].len = sizeof(payload);

        trans_array[1].tx_buf = &payload_nop;
        trans_array[1].rx_buf = &ret;
        trans_array[1].len = sizeof(payload);

        spi_sync_transfer(ads8661_device.spi_dev,trans_array,2);
        kfree(trans_array);

    }else{
        printk(KERN_ALERT "Malloc Failed :/");
    }

    // Invert endianness
    return ((uint16_t)ret.buf[0] << 8) | ret.buf[1];
}
union命令
{
uint8_t buf[4];
uint32_t u32;
};
uint16\u t ads8661\u读取(uint16\u t地址)
{
地址&=0x01fc;
uint32_t ret0;
联合司令部;
union命令_payload={.buf={0xc8 |(地址>>8),地址0x00,0x00};
联合命令\u有效载荷\u nop={.u32=0x00000000};
struct spi_transfer*trans_array=kmalloc_数组(2,sizeof(struct spi_transfer),GFP_内核);
if(trans_数组){
printk(KERN_通知“Malloc工作:”);
trans_数组[0]。tx_buf=&有效负载;
trans_数组[0]。rx_buf=&ret0;
trans_数组[0]。len=sizeof(有效负载);
trans_数组[1]。tx_buf=&payload\u nop;
trans_数组[1]。rx_buf=&ret;
trans_数组[1]。len=sizeof(有效负载);
spi_同步_传输(ads8661_device.spi_dev,trans_array,2);
kfree(trans_数组);
}否则{
printk(KERN_警报“Malloc Failed:/”);
}
//反向端度

return((uint16_t)ret.buf[0]您必须更新
spi_sync_传输(spi_dev,trans_array,2);
(注意这里有2个)。但要做到这一点,自动为这两个使用临时变量。
unsigned int amount=2;…x=kcaloc(amount,…);spi sync_传输(…,amount);
。注意
kmalloc array()/kcaloc()
也是。是的,您必须填充所有传输。否则您将得到一些垃圾(特别是在使用非零分配时)。希望您也在填充
传输数组[1]
的成员。如何声明
有效负载
ret
以及
接收buf
设置(可能是
trans\u数组[1]
tx\u buf设置)与
trans\u数组[0]的设置不同
?我试着像@0andriy所说的那样分配和使用2
spi\u传输
,但它也不起作用。对于payload和ret,我编辑了原始帖子。我没有为
spi\u传输
设置任何参数。我只是将
spi\u设备的速度限制在1500 Hz,以便观察逻辑分析上的信号r、 您必须更新
spi_sync_transfer(spi_dev,trans_array,2);
(此处的注释2)。但要做到这一点,自动为两者使用临时变量。
unsigned int amount=2;…x=kcaloc(amount,…);spi_sync_transfer(…,amount);
。注意
kmalloc_array()/kcaloc()
也是。是的,您必须填充所有传输。否则您将得到一些垃圾(特别是在使用非零分配时)。希望您也在填充
传输数组[1]
的成员。如何声明
有效负载
ret
以及
接收buf
设置(可能是
trans\u数组[1]
tx\u buf设置)与
trans\u数组[0]的设置不同
?我试着像@0andriy所说的那样分配和使用2
spi\u传输
,但它也不起作用。对于payload和ret,我编辑了原始帖子。我没有为
spi\u传输
设置任何参数。我只是将
spi\u设备的速度限制在1500 Hz,以便观察逻辑分析上的信号R
union command_u
{
    uint8_t buf[4];
    uint32_t u32;
};
uint16_t ads8661_read(uint16_t address)
{
    address &= 0x01fc;
    uint32_t ret0;
    union command_u ret;
    union command_u payload = {.buf = {0xc8 | (address >> 8), address, 0x00, 0x00}};
    union command_u payload_nop = {.u32 = 0x00000000};

    struct spi_transfer * trans_array = kmalloc_array(2,sizeof(struct spi_transfer),GFP_KERNEL);

    if(trans_array){
        printk(KERN_NOTICE "Malloc Worked :)");

        trans_array[0].tx_buf = &payload;
        trans_array[0].rx_buf = &ret0;
        trans_array[0].len = sizeof(payload);

        trans_array[1].tx_buf = &payload_nop;
        trans_array[1].rx_buf = &ret;
        trans_array[1].len = sizeof(payload);

        spi_sync_transfer(ads8661_device.spi_dev,trans_array,2);
        kfree(trans_array);

    }else{
        printk(KERN_ALERT "Malloc Failed :/");
    }

    // Invert endianness
    return ((uint16_t)ret.buf[0] << 8) | ret.buf[1];
}