2016-12-15 77 views
1

我寫了一個快速的用戶空間程序使用此處描述的I2C接口開發訪問I2C器件:https://www.kernel.org/doc/Documentation/i2c/dev-interface的Linux的多個進程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); 
} 

所以2個可能的關鍵部分:

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

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

回答

2

I2C_SLAVE ioctl()設置的I2C從地址存儲在每次打開/dev/i2c-X時分配的i2c_client中。所以這些信息對於/ dev/i2c-X的每個「開放」都是本地的。

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

一般來說,如果您擔心多進程訪問一臺設備,您應該爲該設備編寫一個Linux內核驅動程序。

+0

謝謝托馬斯。自由電子有一些很好的資源,感謝您在網上發佈所有內容。所以是後續問題。我想最終我需要編寫一個設備驅動程序,但現在試圖暫緩。想知道是否可以使用I2C_RDWR ioctl(),它允許您一次完成多個讀取/寫入操作?我認爲這將實現與設備(頁面+讀/寫)相同的「原子」訪問,而不使用進程共享互斥體。你怎麼看? – Splaty