임베디드 Linux에서 제가 가장 그리워하는 "작은 임베디드" 기능 중 하나는 인터럽트입니다. 특정 핀에 신호가 나타나거나 다른 인터럽트 소스가 트리거되고 CPU 내부에서 수행되는 모든 작업이 중단되고 인터럽트 핸들러 기능이 시작됩니다. Linux에서는 모든 것이 버퍼링되어 있으며 어떤 일이 발생하면 시스템은 자체 프로세스를 계속합니다. (마지막으로) 지정된 스레드가 포그라운드로 가져오면 외부 소스를 기다리는 대기 상태가 종료되고 해당 핸들러가 시작됩니다.
내가 아는 가장 가까운 것은 스레드의 정상적인 흐름을 방해하기 위해 핸들러를 트리거할 수 있는 신호이지만, 핸들러는 커널이 스레드를 포그라운드로 가져올 때까지(신호 후 수 밀리초가 걸릴 수 있음) 여전히 신호를 포착하지 않습니다. 발생 - 신호 트리거링도 그다지 강력하지 않습니다. 신호를 보내려면 애플리케이션이나 커널 모듈이 필요하며 단순히 GPIO 핀에 연결할 수 없습니다.
Linux 사용자 공간 소프트웨어에서 하드웨어 인터럽트와 같은 것을 어떻게 구현할 수 있습니까? 프로세스 대기열이 스레드를 가져올 때까지 기다릴 필요 없이 외부 소스 조건이 트리거되는 즉시 특정 기능을 시작하거나 특정 스레드를 포그라운드로 가져옵니다. 전경?
이 질문이 너무 광범위하다고 생각되면 구체적인 예로 범위를 좁혀 보겠습니다. Raspberry Pi 보드는 GPIO 핀 중 하나에서 신호를 수신합니다(반드시 임의적인 것은 아니며 특정 핀만 수신하는 경우에도 괜찮습니다.). 내 사용자 공간 애플리케이션은 대기 상태에서 벗어나거나, 핸들러 기능을 시작하거나, 동등한 메커니즘을 실행하든 관계없이 가능한 한 가장 짧은 시간 내에 이 이벤트에 반응합니다. 그러나 가장 중요한 것은 작업 대기열이 모든 것을 순환할 때까지 기다리지 않는다는 것입니다. 핸들러가 도입되기 전에 보류 중인 프로세스를 포그라운드에 배치하지만 가능한 한 빨리 트리거합니다. (구체적으로, 신호가 없는 경우 시스템을 영원히 잠그는 대신 처리기 프로세스는 입력에 대해 100% CPU 시간 폴링을 사용하고 결코 OS에 양보하지 않습니다.) 이에 대한 메커니즘이 있습니까?
답변1
귀하의 질문을 제가 이해한다면 이 기사가 귀하가 찾고 있는 내용과 유사하다고 생각됩니다. 기사 제목은 다음과 같습니다.사용자 공간의 장치 드라이버.
발췌
UIO 드라이버
Linux는 사용자 공간 기반 장치 드라이버를 개발하기 위한 표준 UIO(사용자 I/O) 프레임워크를 제공합니다. UIO 프레임워크는 두 가지 주요 작업을 수행하는 작은 커널 공간 구성 요소를 정의합니다.
- ㅏ. 사용자 공간에 대한 장치 메모리 영역을 나타냅니다.
- b. 장치 인터럽트를 등록하고 사용자 공간에 인터럽트 명령을 제공합니다.
그런 다음 커널 공간 UIO 구성 요소는 /dev/uioXX와 같은 sysfs 항목 집합을 통해 장치를 노출합니다. 사용자 공간 구성 요소는 이러한 항목을 검색하고 장치 주소 범위를 읽고 이를 사용자 공간 메모리에 매핑합니다.
사용자 공간 구성 요소는 장치의 I/O를 포함하여 모든 장치 관리 작업을 수행할 수 있습니다. 그러나 인터럽트의 경우 장치 항목에서 차단 read()를 수행해야 하며, 이로 인해 커널 구성 요소는 사용자 공간 응용 프로그램을 절전 모드로 설정하고 인터럽트를 받은 후 깨우게 됩니다.
저는 이런 일을 해본 적이 없어서 이보다 더 많은 지침을 드릴 수는 없지만, 이것이 여러분의 추구에 도움이 될 것이라고 생각합니다.
답변2
@RBerteig와 마찬가지로 BeagleBone Black에는 프로그래밍 가능한 PRU(실시간 장치)가 포함되어 있습니다.32비트 마이크로컨트롤러.
이러한 것들을 활용하는 거대한 커뮤니티는 없는 것 같습니다. 좋은 컴파일러가 있는지조차 모르겠습니다. SBC와 마이크로컨트롤러 또는 마이크로컨트롤러 보드 어셈블리에 비해 장점은 PRU 코드가 메인 ARM에서 나올 수 있고 공유 메모리가 매우 편리하다는 것입니다.
이것을 사용했다고 말할 수 없고 BeagleBone Black에서 더 많은 예제를 실행할 수도 없지만 이 질문에 표현된 요구 사항은 개발자가 이러한 요구 사항을 Black 쪽으로, Pi에서 멀어지게 만들 수 있는 것일 수 있습니다.
답변3
고정관념에서 벗어나 생각해보면 다음과 같은 방법을 사용하여 수행할 수 있습니다.알라 패턴 보드. 이것은 완전한 Arduino를 포함하는 "파이 보드"입니다. 하드 실시간 응답, 비트 버스 프로토콜 또는 기타 깊이 내장된 로직을 구축하여 AVR 프로세서에서 실행하고 대기 시간이 더 긴 채널을 통해 Linux의 프로세스와 통신할 수 있습니다.
ala 모드는 사용 가능한 유일한 기성 하드웨어 옵션이 아닙니다. Linux 및 Arduino에서 사용할 수 있는 유사한 Arduino 모델은 다음과 같습니다.아두이노 클라우드MIPS 기반 임베디드 Linux SOC와 AVR을 모두 갖추고 있습니다. Arduino도 발표했습니다.아두이노 트레ARM SOC를 기반으로 하지만 1년 동안 "곧 출시"되었습니다. RPi와 Arduino 모두 더 많은 마력의 이점을 누릴 수 있다면 다음이 있습니다.우수, 쿼드 코어 ARM CORTEX-A9 및 Linux 또는 Android를 실행하는 GPU, 이전 세대와 동일한 Atmel ARM CORTEX-M3 칩 포함Arduino 기한.
문제가 이러한 종류의 파티셔닝에 해당하는 경우 네트워킹, 비즈니스 로직, 사용자 인터페이스, 디스크 드라이브 및 비디오와 같은 복잡한 하드웨어. Arduino가 낮은 수준의 처리를 수행할 만큼 강력하지 않은 경우 고려해야 할 심층 임베디드 칩과 모듈이 많이 있습니다. 거의 모든 칩과 모듈에는 Linux 측과 통신하는 데 사용할 수 있는 UART, I2C 또는 USB도 있습니다.
이 아키텍처의 장점 중 하나는 Linux 커널을 전혀 건드릴 필요가 없다는 것입니다. 하드 실시간 코드는 커널 외부의 자체 CPU에서 실행되며 둘 사이의 통신은 기존 드라이버와 프로토콜을 사용할 수 있습니다.