2014-11-10 7 views
3

C++ library (easyBlack)을 사용하여 GPIO를/dev/mem을 통해 처리합니다.BeagleBone Black이 사용자 공간에서 인터럽트를 얻습니다.

나는 장에서 보았 듯이의 "25.3.3 인터럽트 기능" "AM335x SitaraTM 프로세서 - 기술 참조 설명서"정의 된 이벤트에 따라 호스트 프로세서에 인터럽트 요청을 생성하기 위해

(레벨 또는 GPIO 핀에서 발생하는 GPIO 구성 레지스터는 다음과 같이 프로그래밍되어야합니다 :

• GPIO 채널에 대한 인터럽트는 GPIO_IRQSTATUS_SET_0 및/또는 GPIO_IRQSTATUS_SET_1 레지스터에서 활성화되어야합니다.

• GPIO_LEVELDETECT0, GPIO_LEVELDETECT1, GPIO_RISINGDETECT 및 GPIO_FALLINGDETECT 레지스터에서 인터럽트 요청을 트리거 할 예상 GPIO 이벤트를 선택해야합니다.

괜찮을 때까지 찾을 수있는 모든 문서는 리눅스 커널 헤더 파일 ("linux/gpio.h"및 "linux/interrupt.h")을 사용하여 만들어졌으며 사용 가능한 것으로 보입니다 사용자 공간 프로그램, 모듈에서만. 또는 examples은 커널 드라이버를 사용하고 sysfs의 상태 파일을 감시하여 인터럽트를 구현합니다. 그럴 수도 있지만 느리고 많은 자원이 필요합니다.

원하는 핀의 값을 변경하는 경우 멀티 스레드로 작업하는 것 외에 다른 방법이 있습니까? (이 다른 라이브러리 (github.com/jackmitch/libsoc)는 어떻게합니까?

easyBlack을 커널 모듈로 컴파일 할 수 있습니까?

감사합니다.

답변

1

불행히도, 사실적인 인터럽트는 사용자 공간에 들어 오기가 불가능합니다. 이것이 모든 인터럽트 종속 코드가 커널 모듈이나 커널 자체에 쓰여지는 이유입니다. 일반적으로 이것은 괜찮습니다. ISR은 가능한 한 빨리 설계되어야하며 실제 처리가 나중에 스케줄되도록 남겨 두어야합니다. 이는 위에서 sysfs의 statefile과 비슷합니다. 그러나 easyBlack 라이브러리가 GPIO 메모리 공간을 사용자 공간에 메모리 매핑하고 핀 상태를 폴링하는 것을 지원하는 것처럼 보입니다. 표시된 예제는 while 루프에 절전 모드가 없기 때문에 매우 집중적으로 처리됩니다. 이것은 프로세스가 스케줄러가 허용하는만큼의 CPU 시간을 차지한다는 것을 의미합니다.

Beaglebone은 임베디드 리눅스 커널을 실행하기 때문에 libGPIO 드라이버가 GPIO를 지원하도록 작성되었다고 가정합니다. LibGPIO는 리눅스 커널 내의 프레임 워크로서, 다른 GPIO 장치 및 선물의 세부적인 내용을 추상화하여 표준 인터페이스로 제공합니다. /sys/class/gpio 디렉토리를 살펴보십시오. 그러면 GPIO 또는 GPIO 칩 목록을 제공해야합니다. 여기

https://www.kernel.org/doc/Documentation/gpio/sysfs.txt

귀하의 사용자 공간 소프트웨어가 풀어서 GPIO의 '가치'파일을 열 수 GPIOsysfs 문서이며, 사용이 FileDescriptor에의 '여론 조사'작동 할 수 있습니다. 이렇게하면 GPIO가 변경 될 때까지 소프트웨어를 차단 한 다음 이에 따라 행동 할 수 있으므로 사용자 공간에서 의사 인터럽트 기능을 사용할 수 있습니다.