2012-09-22 7 views
8

के लिए मैं gpio interrupts के साथ काम कर रहा हूं। मेरे पास "/ sys/class/gpio/gpio38/value" में एक फ़ाइल है। जब भी मान में कोई परिवर्तन होता है तो मुझे एक अधिसूचना चाहिए। तो मैं इसे उपयोगकर्ता-स्थान में कैसे प्राप्त कर सकता हूं। जैसा कि मैंने पहले ही जानकारी एकत्र की है, मैं चुनिंदा(), मतदान() या एपोल() का उपयोग कर सकता हूं। तो इस एप्लिकेशन के लिए कौन सा सही है? या कृपया मुझे सुझाव दें कि क्या मैं/proc/irq या कुछ उपयोग कर सकता हूं। धन्यवाद :)चयन(), मतदान() या epoll()? sysfs विशेषता

उत्तर

2

मैं कुछ here कि मदद की हो सकती है पाया है:

GPIO सिग्नल जैसे/sys/कक्षा/GPIO/gpio42/(GPIO # के लिए 42) पथ है और निम्नलिखित पढ़ा है/लिखने के गुण:

"मूल्य" ... 0 (कम) या 1 (उच्च) के रूप में पढ़ता है। यदि GPIO आउटपुट के रूप में कॉन्फ़िगर किया गया है, तो यह मान लिखा जा सकता है; किसी भी nonzero मूल्य को उच्च के रूप में माना जाता है।

पिन बाधा व्यवधान पैदा करने के रूप में विन्यस्त किया जा सकता है और अगर यह बीच में आता है उत्पन्न करने के लिए कॉन्फ़िगर किया गया है ("बढ़त" की विवरण देखें), आप मतदान कर सकते हैं (2) है कि फाइल और सर्वेक्षण (2 पर) जब भी बाधा उत्पन्न हो जाती है तब वापस आ जाएगी। यदि आप मतदान (2) का उपयोग करते हैं, तो ईवेंट POLLPRI और POLLERR सेट करें। यदि आप का चयन करें (2) का चयन करें, तो फाइल डिस्क्रिप्टर को छोड़कर। मतदान (2) रिटर्न के बाद, या तो lseek (2) sysfs फ़ाइल की शुरुआत में और नया मान पढ़ें या फ़ाइल बंद करें और मान पढ़ने के लिए इसे फिर से खोलें।

हालांकि यह कहता है कि यह "gpio42" के लिए है, मुझे लगता है कि यह आपके मामले पर लागू हो सकता है। यदि ऐसा नहीं होता है, तो मेरे उत्तर में एक टिप्पणी करें।

+0

धन्यवाद @ टोनी-शेर, इसका मतलब है कि मैं किनारे फ़ाइल या मूल्य फ़ाइल –

1

आप इनमें से किसी का भी उपयोग कर सकते हैं। यहां मुद्दा यह है कि आप GPIO लाइन के मूल्य के लिए sysfs फाइल को खोलने है (उदाहरण के /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

ध्यान रखें कि सभी GPIOs बीच में सक्षम रहे हैं के लिए मतदान करने के लिए है GPIO हैं?। आप काम कर रहे हैं इंटरप्ट्स का समर्थन नहीं करता है (और यह आपके द्वारा उपयोग किए जा रहे सटीक सीपीयू/एसओसी पर निर्भर करेगा), आपको इसे आवधिक पढ़ने की आवश्यकता होगी y। – duskwuff

+0

इसमें कोई संदेह नहीं है कि यह सच है - खासकर जब GPIO लाइन को I2C परिधीय या ऑडियो कोडेक के साथ कार्यान्वित किया जाता है। हालांकि, उस स्थिति में, आप कभी भी 'select() '' pselect() ',' poll()' या 'epoll()' पर कॉल नहीं करेंगे। ['मतदान()' और उसके भाइयों, वास्तव में वास्तव में मतदान नहीं करते] – marko

+0

हैलो @ मार्को उत्तर के लिए बहुत बहुत धन्यवाद। क्या आप कृपया ऊपर बताए गए चयन के लिए मुझे एक नमूना कोड दे सकते हैं? वास्तव में मैं कैसे कर रहा हूं जब मैं echo 1> file_name करता हूं, तो अधिसूचना मुद्रित करनी चाहिए। यह बहुत उपयोगी होगा। –

संबंधित मुद्दे