[英]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;
}
其中tr
是struct 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 有时无法正常工作,因为完全相同的执行可能会产生不同的结果:
有关如何处理此问题的任何提示?
如果您需要有关该问题的更多信息,请毫不犹豫地询问。
谢谢!
我已经通过这种方式解决了这个问题:
而不是使用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.