Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
Linux上的I2C并发访问,互斥_Linux_Concurrency_Mutex_Embedded Linux_I2c - Fatal编程技术网

Linux上的I2C并发访问,互斥

Linux上的I2C并发访问,互斥,linux,concurrency,mutex,embedded-linux,i2c,Linux,Concurrency,Mutex,Embedded Linux,I2c,我正在嵌入式Linux中编写一个多线程C程序,可以从用户空间访问许多I2C设备(从设备)。另外,我从多个线程访问同一个I2C设备。我使用的是SMBUS函数(i2c\U SMBUS\U写字节数据、i2c\U SMBUS\U读字节数据、i2c\U SMBUS\U读i2c\U块数据等等) 是否有任何内置的并发访问保护,或者我是否需要自己添加互斥锁 例如:我有一个读取功能,可以通过I2C从一个传感器读取数据。但同样的函数也可以从另一个线程调用,从而导致可能的并发访问。我必须在该函数中使用一些静态互斥还是

我正在嵌入式Linux中编写一个多线程C程序,可以从用户空间访问许多I2C设备(从设备)。另外,我从多个线程访问同一个I2C设备。我使用的是SMBUS函数(i2c\U SMBUS\U写字节数据、i2c\U SMBUS\U读字节数据、i2c\U SMBUS\U读i2c\U块数据等等)

是否有任何内置的并发访问保护,或者我是否需要自己添加互斥锁


例如:我有一个读取功能,可以通过I2C从一个传感器读取数据。但同样的函数也可以从另一个线程调用,从而导致可能的并发访问。我必须在该函数中使用一些静态互斥还是已经在I2C访问函数中使用?

在程序中使用互斥。驱动程序无法知道每个线程将要执行的操作。

I2C是一个具有多个设备的共享总线,可以从多个进程和线程访问。因此,Linux I2C驱动程序代码使用互斥来管理对每个I2C总线的访问

有关SMBus函数,请参见
i2c core SMBus.c
中的Linux内核函数。它在开始传输之前获得I2C适配器的锁(查看源代码,并查看对
I2C\u lock\u adapter()
)的调用)。所有SMBus事务都基于该功能

有关I2C函数,请参阅
I2C core base.c
中的Linux内核函数。它在开始传输之前获得I2C适配器的锁。所有I2C事务都基于该功能


是的,内置了防止并发访问的保护。

没错,但I2C驱动程序对于I2C设备上的每个操作都是相同的,因此它可以知道何时使用它,而无需添加互斥。从内存来看,I2C驱动程序可以防止并发访问,但我建议查看内核源代码以确定。当然,只有当您对设备的访问保持仲裁或没有多事务状态时,这一点才成立。如果您遵循
i2c\u smbus\u xfer
路径,那么最终的结果似乎是将锁定机制的实现细节留给
i2c\u适配器
。。。您所指的互斥锁在哪里?正如我所说的,请参阅调用
i2c\u lock\u适配器(adapter)
。。。依次调用
rt\u mutex\u lock(&adapter->bus\u lock)
。您能否具体说明您所指的内核版本,并包括文件和行号?查看最新版本(撰写本文时为5.7.1),据我所知,在调用
i2c\u lock\u操作中指定的
struct之后,锁定逻辑变得依赖于实现,通过我可以看到
struct rt\u mutex bus\u lock
结构i2c_适配器的成员,但include/linux/i2c.h中没有任何内容涉及它。。。