11

我正在嵌入式 Linux 中编写一个多线程 C 程序,该程序从用户空间访问多个 I2C 设备(从属设备)。另外,我从多个线程访问同一个 I2C 设备。我正在使用 SMBUS 函数(i2c_smbus_write_byte_data、i2c_smbus_read_byte_data、i2c_smbus_read_i2c_block_data、...)。

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

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

4

2 回答 2

14

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

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

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

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

(链接适用于 Linux 内核 5.13)

于 2015-11-18T23:19:26.303 回答
-1

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

于 2013-05-10T07:03:54.747 回答