gpt4 book ai didi

具有多个进程的 Linux i2c dev 接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:50 53 4
gpt4 key购买 nike

我已经编写了一个快速的用户空间程序来使用此处描述的 i2c 开发接口(interface)访问 i2c 设备:https://www.kernel.org/doc/Documentation/i2c/dev-interface

问题是我不确定如何使这种多进程和多线程安全,或者 Linux 是否已经处理了这种情况。

这是代码的准系统:

#include <linux/i2c-dev.h>

void read_from_device(void)
{
int result;

file_desc = open(/dev/i2c-2, O_RDWR);

/* Possible critical section #1 starting here? */
ioctl(file_desc, I2C_SLAVE, device_address);

/* Possible critical section #2 starting here
* This device requires writing to a page register first
* before accessing the wanted register */
i2c_smbus_write_byte_data(file_desc, DEVICE_PAGE_ADDRESS, page_number);

/* I don't want another process in come in between here and
* setting a different page address before accessing the register*/

result = i2c_smbus_read_byte_data(file_desc, device_register_address);

/* Critical section end for both possibilities */

close(file_desc);
}

所以 2 个可能的关键部分:

  1. Linux 的 i2c 开发接口(interface)是否处理设置 I2C_SLAVE 的多个进程?意思是:一旦我为这个适配器/dev/i2c-2 设置了 I2C_SLAVE,另一个进程是否可以进来并将它更改为总线上的另一个设备?
  2. 我不希望在设备上设置页面寄存器然后设置它自己的 page_number 后进入另一个进程,这样我的读取就会不正确。进程共享互斥体是否会如所述here合适吗?

其他人提出了类似的问题here结果是 Linux 可以很好地处理对同一适配器的多个进程访问。我想确认这意味着什么以及我需要从用户空间担心线程安全访问的哪些部分。

最佳答案

I2C_SLAVE ioctl() 设置的 I2C 从地址存储在每次分配的 i2c_client/dev/i2c-X被打开。因此,此信息对于/dev/i2c-X 的每个“打开”都是本地的。

关于在 I2C 设备中设置页面寄存器,只要没有其他进程与同一个 I2C 设备通信就可以了。

一般来说,如果您担心多个进程访问一个设备,您应该为该设备编写一个 Linux 内核驱动程序。

关于具有多个进程的 Linux i2c dev 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41172797/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com