簡體   English   中英

Linux的i2c開發人員界面具有多個進程

[英]Linux's i2c dev interface with multiple processes

我編寫了一個快速的用戶空間程序,使用此處描述的i2c開發人員界面訪問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);
}

因此,有兩個可能的關鍵部分:

  1. Linux的i2c開發人員接口是否可以處理設置I2C_SLAVE的多個進程? 含義:一旦為該適配器/ dev / i2c-2設置了I2C_SLAVE,是否可以進入另一個進程並將其更改為總線上的另一個設備?
  2. 在設備上設置頁面寄存器然后設置它自己的page_number后,我不希望另一個進程進入,那么我的讀取將不正確。 此處描述的進程共享互斥體是否合適?

有人在這里提出了類似的問題並且響應是Linux很好地處理了對同一適配器的多進程訪問。 我想確認這意味着什么以及需要從用戶空間擔心的線程安全訪問的哪些部分。

I2C_SLAVE ioctl()設置的I2C從地址存儲在每次打開/dev/i2c-X分配的i2c_client中。 因此,此信息對於/ dev / i2c-X的每個“開口”都是本地的。

關於在I2C設備中設置頁面寄存器,只要沒有其他進程與同一I2C設備通信就可以。

一般而言,如果您擔心多個進程訪問一個設備,則應該為該設備編寫Linux內核驅動程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM