2012-09-22 21 views
8

Tôi đang làm việc với các ngắt gpio. Tôi có một tập tin trong "/ sys/class/gpio/gpio38/value". Tôi muốn có thông báo bất cứ khi nào có thay đổi trong thuộc tính giá trị. Vậy làm thế nào tôi có thể đạt được điều này trong không gian người dùng. Vì tôi đã thu thập thông tin, tôi có thể sử dụng select(), poll() hoặc epoll(). Vì vậy, đó là chính xác cho ứng dụng này? Hoặc xin vui lòng đề nghị tôi nếu tôi có thể sử dụng/proc/irq hoặc một cái gì đó. Cảm ơn :)select(), poll() hoặc epoll()? cho thuộc tính sysfs

Trả lời

2

Tôi đã tìm thấy một cái gì đó here mà bạn có thể giúp đỡ:

tín hiệu GPIO có con đường như/sys/lớp/gpio/gpio42/(đối với GPIO # 42) và có đọc sau/ghi thuộc tính:

"giá trị" ... lần đọc là 0 (thấp) hoặc 1 (cao). Nếu GPIO được định cấu hình làm đầu ra, giá trị này có thể được viết; bất kỳ giá trị khác không được coi là cao.

Nếu pin có thể được cấu hình như ngắt-tạo ngắt và nếu nó đã được cấu hình để tạo ra ngắt (xem mô tả của "cạnh"), bạn có thể thăm dò ý kiến ​​(2) trên tập tin đó và cuộc thăm dò (2) sẽ trở lại bất cứ khi nào ngắt được kích hoạt. Nếu bạn sử dụng thăm dò ý kiến ​​(2), đặt các sự kiện POLLPRI và POLLERR. Nếu bạn sử dụng chọn (2), hãy đặt bộ mô tả tệp bằng ngoại lệ. Sau thăm dò ý kiến ​​(2) trả về, hoặc là lseek (2) vào đầu tệp sysfs và đọc giá trị mới hoặc đóng tệp và mở lại nó để đọc giá trị.

Mặc dù nó nói là "gpio42", tôi đoán điều này có thể áp dụng cho trường hợp của bạn. Nếu không, hãy bình luận trong câu trả lời của tôi.

+0

nhờ @ tony-the-sư tử, Nó có nghĩa là tôi phải thăm dò ý kiến ​​cho tập tin cạnh hoặc tập giá trị –

1

Bạn có thể sử dụng bất kỳ thẻ nào trong số đó. Điểm ở đây là bạn mở tệp sysfs cho giá trị của dòng GPIO (ví dụ: /sys/class/gpio/gpio42/value và sau đó chặn nó trên đó.

Thay đổi trong trạng thái dòng được báo hiệu là một điều kiện ngoại lệ chứ không phải là viết (có thể trực quan)

trong trường hợp chọn:

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

Lưu ý rằng không phải tất cả GPIOs được gián đoạn có khả năng Nếu GPIO?. bạn đang làm việc với không hỗ trợ ngắt (và điều này sẽ phụ thuộc vào chính xác CPU/SoC bạn đang sử dụng), bạn sẽ cần phải đọc nó periodicall y. – duskwuff

+0

Không có nghi ngờ trường hợp điều này là đúng - đặc biệt là khi dòng GPIO được thực hiện với một bộ giải mã âm thanh hoặc ngoại vi I2C. Tuy nhiên, trong trường hợp đó, bạn sẽ không bao giờ gọi 'select()' 'pselect()', 'poll()' hoặc 'epoll()' trên chúng. ['poll()' và các anh em của nó, không thực sự là bình chọn nào cả] – marko

+0

Xin chào @Marko Cảm ơn bạn rất nhiều vì đã trả lời. Bạn có thể vui lòng cho tôi mã mẫu để chọn bạn đã đề cập ở trên không? thực sự làm thế nào tôi đang làm là khi tôi làm echo 1> file_name, sau đó thông báo nên in. Nó sẽ rất có ích. –

Các vấn đề liên quan