Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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_Multithreading_Embedded Linux_I2c - Fatal编程技术网

Linux';具有多进程的i2c开发接口

Linux';具有多进程的i2c开发接口,linux,multithreading,embedded-linux,i2c,Linux,Multithreading,Embedded Linux,I2c,我已经编写了一个快速用户空间程序,使用此处描述的i2c开发接口访问i2c设备: 问题是,我不确定如何使这个多进程和多线程安全,或者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 st

我已经编写了一个快速用户空间程序,使用此处描述的i2c开发接口访问i2c设备:

问题是,我不确定如何使这个多进程和多线程安全,或者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);
}
#包括
从\u设备读取\u无效(void)
{
int结果;
文件描述=打开(/dev/i2c-2,O_RDWR);
/*可能的临界截面#1从这里开始*/
ioctl(文件描述、I2C从机、设备地址);
/*可能的临界截面#2从这里开始
*此设备需要先写入页寄存器
*在进入通缉登记册之前*/
i2c\u smbus\u写入字节数据(文件描述、设备页面地址、页面编号);
/*我不想在这里和这里之间有另一个过程
*在访问寄存器之前设置不同的页面地址*/
结果=i2c_smbus_读取_字节_数据(文件描述、设备寄存器地址);
/*两种可能性的临界截面结束*/
关闭(文件描述);
}
因此,两个可能的关键部分:

  • Linux的i2c开发接口是否可以处理设置i2c_从机的多个进程?意思:一旦我为这个适配器/dev/I2C-2设置了I2C_从机,是否可以进入另一个进程并将其更改为总线上的另一个设备
  • 我不想在设置设备上的页面寄存器,然后设置它自己的页面号之后进入另一个进程,那么我的读取将不正确。所描述的进程共享互斥是否合适
    其他人提出了一个类似的问题,结果是Linux很好地处理了对同一适配器的多进程访问。我想确认这意味着什么,以及我需要从用户空间担心线程安全访问的哪些部分。

    I2C_从机设置的I2C从机地址存储在每次打开
    /dev/I2C-X
    时分配的
    I2C_客户机中。因此,这些信息对于/dev/i2c-X的每个“开口”都是本地的

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


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

    谢谢您。免费电子有一些很好的资源,谢谢你在网上发布这些。这是一个后续问题。我想最终我会需要编写一个设备驱动程序,但我会暂时搁置。想知道是否有一种替代方法是使用I2C_RDWR ioctl(),它允许您一次完成多个读/写操作?我认为这将实现对设备的相同“原子”访问(页面+读/写),而无需使用进程共享互斥。你怎么认为?