Linux上的I2C并发访问,互斥

时间:2013-05-09 17:36:12

标签: linux concurrency mutex embedded-linux i2c

我在嵌入式Linux中编写多线程C程序,从用户空间访问许多I2C设备(从设备)。此外,我从多个线程访问相同的I2C设备。我使用的是SMBUS函数(i2c_smbus_write_byte_data,i2c_smbus_read_byte_data,i2c_smbus_read_i2c_block_data,...)。

是否有内置并发访问的保护或我是否需要自己添加互斥?

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

2 个答案:

答案 0 :(得分:7)

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

对于SMBus函数,请参阅i2c-core-smbus.c中的Linux内核函数i2c_smbus_xfer()。在开始传输之前,它会锁定I 2 C适配器(查看源代码,并查看对i2c_lock_adapter()的调用)。所有SMBus事务都基于该功能。

对于I 2 C函数,请参阅i2c-core-base.c中的Linux内核函数i2c_transfer()。在开始传输之前,它会锁定I 2 C适配器。所有I 2 C交易都基于该功能。

所以是的,内置并发访问的保护。

答案 1 :(得分:-1)

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