liuqian 发表于 2023-12-15 16:58:52

请教:Linux下的spidev可以用非阻塞方式发送吗

现在一个imx6ull的产品,有3路spi读写,每次发送数据160K
发送程序片段:

int fd; // 3个spi口的句柄

struct spi_ioc_transfer tr;

tr.tx_buf = (unsigned long)tx;
tr.rx_buf = (unsigned long)rx;
tr.bits_per_word = 16;
tr.len = len;
。。。。。。
for(int i=0;i<3;i++)
{
    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
}

这里ioctl虽然底层也是用DMA发送的,但是ioctl确是阻塞方式,只能等一路发完才能下一路

请教有没有非阻塞的方式,启动3个spi的发送,然后查询标志或者用回调函数来结束

redroof 发表于 2023-12-15 19:15:26

任何同步的函数都可以用多开几个线程的办法变成异步回调效果。你这才3个,又不多,只管开线程呗

dgtg 发表于 2023-12-15 19:42:57

楼上说的对,开多条线程

liuqian 发表于 2023-12-15 20:22:20

如果用多线程,比较麻烦,发数据中间还要去操作IO,还要同步。框架是epoll做的,单线程,不需要考虑竞态,非阻塞是最简单的方式。多线程改动就比较大了,实在不想加班。

redroof 发表于 2023-12-15 23:08:47

本帖最后由 redroof 于 2023-12-15 23:15 编辑

liuqian 发表于 2023-12-15 20:22
如果用多线程,比较麻烦,发数据中间还要去操作IO,还要同步。框架是epoll做的,单线程,不需要考虑竞态, ...
(引用自4楼)

别处继续用异步框架也没问题啊。
异步框架除了可以等待io,也可以等待信号量啊,那个信号量由操作spi的线程发岀。

C语言的异步框架并不会做成强制传染的。没法异步完成的东西肯定允许你另开一个线程单独执行啊。只要能通知主程序的异步框架就行。信号量就是设计成给不同线程之间发通知用的。

thepresent 发表于 2023-12-16 10:11:25

参考https://juejin.cn/post/7153440681615163423

对于spidev,使用read、write函数时,只能读、写,这是半双工方式。使用ioctl可以达到全双工的读写。
但是spidev有2个缺点:
    1:不支持中断;
    2:只支持同步操作,不支持异步操作:就是read/write/ioctl这些函数只能执行完毕才可返回

redroof 发表于 2023-12-16 11:13:01

thepresent 发表于 2023-12-16 10:11
参考https://juejin.cn/post/7153440681615163423

对于spidev,使用read、write函数时,只能读、写,这是 ...
(引用自6楼)

反正这种东西在一个系统里面也就只能存在几个,又不是成百上千。自己开多线程,封装一下就能得到异步通知的效果了{:titter:}
页: [1]
查看完整版本: 请教:Linux下的spidev可以用非阻塞方式发送吗