2012-09-22 35 views
8

我正在使用gpio中斷。我在「/ sys/class/gpio/gpio38/value」中有一個文件。我希望在屬性發生更改時發出通知。那麼我怎麼才能在用戶空間實現這一點。由於我已經收集了信息,我可以使用select(),poll()或epoll()。那麼這個應用程序哪個是正確的?或者,如果我可以使用/ proc/irq或其他東西,請告訴我。謝謝:)select(),poll()或epoll()?爲sysfs屬性

回答

2

我發現一些here可能會有所幫助:

GPIO信號有一個像/ SYS /班/ GPIO/gpio42 /(GPIO引腳#42) 路徑並具有以下讀/寫屬性:

「值」...讀爲0(低)或1(高)。如果GPIO 被配置爲輸出,則可以寫入該值; 任何非零值都被視爲高。

如果引腳可以被配置爲生成中斷的中斷 ,如果它已經被配置爲產生中斷(見的「邊緣」的 描述),就可以輪詢(2)在該文件上和 輪詢(2 )只要中斷被觸發就會返回。如果您使用poll(2) ,請設置事件POLLPRI和POLLERR。如果您使用select(2) ,請在exceptfds中設置文件描述符。在 輪詢(2)返回後,將lseek(2)返回到sysfs 文件的開頭,並讀取新值或關閉文件並重新打開它以讀取值 。

儘管它表示它是用於「gpio42」,但我猜這可能適用於您的情況。如果沒有,請在我的回答中留言。

+0

感謝@託尼的獅子,這意味着我必須輪詢邊緣文件或值文件 –

1

你可以使用它們中的任何一個。這裏的關鍵是,你打開sysfs文件的GPIO線的值(例如/sys/class/gpio/gpio42/value,然後就可以阻止。

排隊狀態變化信號作爲例外情況,而不是寫(如可能是直覺)。

在選擇的情況下:

fd_set exceptfds; 
int res;  

FD_ZERO(&exceptfds); 
FD_SET(gpioFileDesc, &exceptfds); 

res = select(gpioFileDesc+1, 
      NULL,    // readfds - not needed 
      NULL,    // writefds - not needed 
      &exceptfds, 
      NULL);    // timeout (never) 

if (res > 0 && FD_ISSET(gpioFileDesc, &exceptfds)) 
{ 
    // GPIO line changed 
} 
+1

請注意,並非所有的GPIO可中斷的。如果GPIO?你正在使用不支持中斷(這將取決於你使用的確切的CPU/SoC),你需要閱讀它periodicall年。 – duskwuff

+0

毫無疑問,這是事實 - 尤其是當使用I2C外設或音頻編解碼器實現GPIO線時。然而,在這種情況下,你永遠不會對它們調用select()''pselect()','poll()'或'epoll()'。 ['民意調查())及其同胞,實際上根本不用投票] – marko

+0

你好@Marko非常感謝你的回覆。你可以給我一個示例代碼來選擇你在上面提到的嗎?實際上我在做的是當我做echo 1> file_name,那麼通知應該打印。這將是非常有益的。 –