繁体   English   中英

ioctl 在不同的执行中给出错误

[英]ioctl giving error in different executions

对于下一个系统:VAR-DART-MX8M( https://variwiki.com/index.php?title=DART-MX8M )(它是一个基于 Z47F45E65244C17EC9FA87713AZE5C6 的系统)

Kernel 版本:Linux Debian 拉伸版本(内核 4.14.78)

我用Eclipse写代码然后交叉编译到指定系统。

我想在我的嵌入式系统中使用 SPI 总线与 FPGA 进行通信。 我已经读过强制转换指针会导致未定义的行为: Passing pointer of unsigned int to pointer of long int

问题是我必须转换一些参数才能满足spi_ioc_transfer 结构要求:

int transfer16(int fd, uint16_t *tx, uint16_t *rx, uint32_t len){

int ret;
errno=0;

tr.tx_buf = (unsigned long)tx;
tr.rx_buf = (unsigned long)rx;
tr.len = len;
tr.delay_usecs = 1;
tr.speed_hz = spi_speed;
tr.bits_per_word = 16;

ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
     if (errno != 0){
         printf("SPI IOCTL ret(%d), error(%d) %s\n", ret, errno, 
         strerror(errno));
     }
return ret;
}

其中trstruct spi_ioc_transfer spi_ioc_transfer(声明为全局变量)。

function transfer16 由以下 function 调用:

int send_command_readadc(int fd, int16_t *rx, uint16_t ndata_adc, uint8_t membank) {

int ret;

uint16_t tx[2];
uint16_t crc16_o, crc16_i;
uint8_t rcommand;
uint8_t ack;
uint32_t len = 2*(ndata_adc+NUMELS(tx)+2); // 2*sizeof(rx)
int i = 0;

tx[0] = (THE_READADC_COMMAND << 8) + membank;
tx[1] = crc16_uint16_false(tx,NUMELS(tx)-1);

ret = transfer16(fd, tx, rx, len);

if (ret==-1) {
    return -1;
}

我使用以下参数将此称为 function:

ret = send_command_readadc(fd_spi, (int16_t *)(data_adc+(ndata_adc+4)*i), ndata_adc, membank);

其中data_adc是指向 memory 的已分配部分的指针,我想在其中保存 ADC 读数:

data_adc = (int16_t *) calloc((ndata_adc+4)*M,sizeof(int16_t));

因此,例如,如果 M 为 3,我从寄存器data_adc开始保存(ndata_adc+4)的数量。 然后(ndata_adc+4)从寄存器data_adc+(ndata_adc+4)等开始。

function transfer16 有时无法正常工作,因为完全相同的执行可能会产生不同的结果:

相同的执行(./myspi.elf -a 234),第二个给出错误的地址错误

有关如何处理此问题的任何提示?

如果您需要有关该问题的更多信息,请毫不犹豫地询问。

谢谢!

我已经通过这种方式解决了这个问题:

而不是使用data_adc = (int16_t *) calloc((ndata_adc+4)*M,sizeof(int16_t)); ,我声明了一个数组int16_t data_adc_static[(ndata_adc+4)*M]; 我给下一个地址int16_t *address = &data_adc_static[(ndata_adc+4)*i]; send_command_readadc命令。

这样我就消失了的问题。

谢谢大家的回答

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM