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個可能的關鍵部分:
- 確實的Linux的I2C接口開發處理多個進程設置I2C_SLAVE?含義:一旦我爲這個適配器/ dev/i2c-2設置了I2C_SLAVE,另一個進程是否可以進入並將其更改爲總線上的另一個設備?
- 我不希望在設備上設置頁面寄存器並設置它自己的page_number之後再進入另一個進程,那麼我的讀取將不正確。描述爲here的進程共享互斥體是否合適?
其他人提出了類似的問題here和響應是,Linux可以很好地處理對同一個適配器的多進程訪問。我想確認這意味着什麼,以及我需要從用戶空間擔心的線程安全訪問的哪些部分。
謝謝托馬斯。自由電子有一些很好的資源,感謝您在網上發佈所有內容。所以是後續問題。我想最終我需要編寫一個設備驅動程序,但現在試圖暫緩。想知道是否可以使用I2C_RDWR ioctl(),它允許您一次完成多個讀取/寫入操作?我認爲這將實現與設備(頁面+讀/寫)相同的「原子」訪問,而不使用進程共享互斥體。你怎麼看? – Splaty