पर जीपीआईओ के पिन परिवर्तन का पता लगाने के लिए कैसे मैं एआरएम आधारित लिनक्स बोर्ड (आईएमएक्स 233 सीपीयू) पर 3.12 कर्नेल का उपयोग कर रहा हूं। मेरा उद्देश्य जीपीआईओ (1 से 0) के पिन परिवर्तन का पता लगाना है।लिनक्स बोर्ड
मैं लगातार नीचे समारोह (थोड़ी देर के (1) पाश में) कॉल पिन मूल्य
int GPIO_read_value(int pin){
int gpio_value = 0;
char path[35] = {'\0'};
FILE *fp;
sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
//error
}
fscanf(fp, "%d", &gpio_value);
fclose(fp);
return gpio_value;
}
पढ़ सकते हैं लेकिन यह सीपीयू के लिए बहुत अधिक भार का कारण बनता है। मैं usleep
या nanosleep
का उपयोग नहीं करता, क्योंकि पिन परिवर्तन एक बहुत ही कम समय के लिए होता है जो मुझे घटना को याद करने का कारण बनता है।
जहां तक मुझे पता चलता है, poll()
का उपयोग करना संभव नहीं है। क्या कोई poll()
फ़ंक्शन जैसा है जिसका उपयोग मैं जीपीआईओ के पिन परिवर्तन का पता लगाने के लिए कर सकता हूं?
संपादित करें: बस के मामले में, अगर मैं कुछ गलत कर रहा हूँ, यहाँ मेरी poll()
उपयोग कि पिन परिवर्तन
struct pollfd pollfds;
int fd;
int nread, result;
pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
int timeout = 20000; /* Timeout in msec. */
char buffer[128];
if(pollfds.fd < 0){
printf(" failed to open gpio \n");
exit (1);
}
pollfds.events = POLLIN;
printf("fd opens..\n");
while (1)
{
result = poll (&pollfds, 0, timeout);
switch (result)
{
case 0:
printf ("timeout\n");
break;
case -1:
printf ("poll error \n");
exit (1);
default:
printf("something is happening..\n");
if (pollfds.revents & POLLIN)
{
nread = read (pollfds.fd, buffer, 8);
if (nread == 0) {
printf ("result:%d\n", nread);
exit (0);
} else {
buffer[nread] = 0;
printf ("read %d from gpio: %s", nread, buffer);
}
}
}
}
close(fd);
EDIT2 पता नहीं लगा पाया है: https://developer.ridgerun.com/wiki/index.php/Gpio-int-test.c पर कोड poll()
साथ ठीक काम करता है मैं परिभाषित करने की जरूरत बाधा के लिए बढ़ते/गिरते किनारे और परिभाषा पर थोड़ा सा फिक्स। यह मेरी समस्या हल करता है, हालांकि, मेरे और कुछ अन्य लोगों के लिए वैकल्पिक तरीकों को सुनना/जानना अच्छा हो सकता है।
inotify API के बारे में क्या? –
जब आप कहते हैं कि पिन केवल "बहुत ही कम समय" के लिए सक्रिय है, तो आप किस प्रकार के समय के बारे में बात कर रहे हैं? क्योंकि आपके जैसे सक्रिय मतदान भी करते हैं, इसे उपयोगकर्ता स्पेस से करने से विलंबताएं शुरू हो सकती हैं जो आपको वैसे भी याद कर सकती हैं। –
मैं एसपीआई डेटा पढ़ने के लिए एक चिपचिपाहट के रूप में एक जीपीआईओ का उपयोग करना चाहता हूं। निष्क्रिय राज्य पर यह तर्क उच्च है। ट्रांसमिशन शुरू होने पर यह तर्क कम हो जाता है। इसलिए, तेजी से प्रतिक्रिया बेहतर है। जब मुझे उपयुक्त विधि मिलती है, तो मैं धीमी गति से इसका परीक्षण करूंगा – Angs