请教: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的发送,然后查询标志或者用回调函数来结束
任何同步的函数都可以用多开几个线程的办法变成异步回调效果。你这才3个,又不多,只管开线程呗 楼上说的对,开多条线程 如果用多线程,比较麻烦,发数据中间还要去操作IO,还要同步。框架是epoll做的,单线程,不需要考虑竞态,非阻塞是最简单的方式。多线程改动就比较大了,实在不想加班。 本帖最后由 redroof 于 2023-12-15 23:15 编辑
liuqian 发表于 2023-12-15 20:22
如果用多线程,比较麻烦,发数据中间还要去操作IO,还要同步。框架是epoll做的,单线程,不需要考虑竞态, ...
(引用自4楼)
别处继续用异步框架也没问题啊。
异步框架除了可以等待io,也可以等待信号量啊,那个信号量由操作spi的线程发岀。
C语言的异步框架并不会做成强制传染的。没法异步完成的东西肯定允许你另开一个线程单独执行啊。只要能通知主程序的异步框架就行。信号量就是设计成给不同线程之间发通知用的。 参考https://juejin.cn/post/7153440681615163423
对于spidev,使用read、write函数时,只能读、写,这是半双工方式。使用ioctl可以达到全双工的读写。
但是spidev有2个缺点:
1:不支持中断;
2:只支持同步操作,不支持异步操作:就是read/write/ioctl这些函数只能执行完毕才可返回 thepresent 发表于 2023-12-16 10:11
参考https://juejin.cn/post/7153440681615163423
对于spidev,使用read、write函数时,只能读、写,这是 ...
(引用自6楼)
反正这种东西在一个系统里面也就只能存在几个,又不是成百上千。自己开多线程,封装一下就能得到异步通知的效果了{:titter:}
页:
[1]