SPI 장치에서 나오는 데이터를 처리하는 Raspberry Pi에서 C/C++ 사용자 공간 응용 프로그램을 개발하려고합니다. IRQ 이벤트에서 pthread 된 인터럽트 핸들러에서 호출 할 함수 (실제 인터럽트 핸들러)를 등록하는 WiringPi 라이브러리 (함수 wiringPiISR)를 사용하고 있습니다.스레드 ISR에서 데이터를 안전하고 간편하게 교환하는 방법은 무엇입니까? (Raspberry Pi)
STL 컨테이너는 스레드 안전하지 않지만 내 콜백 함수를 실행하는 동안 뮤텍스 잠금을 가지고 있고 버퍼/컨테이너에 액세스하는 동안 메인 스레드에서 잠금을 수행하는 것으로 충분하다고 들었습니까? wiringPiISR을 통해 등록
내 "실제 인터럽트 핸들러는"이
std::deque<uint8_t> buffer;
static void irq_handler()
{
uint8_t data;
while (digitalRead(IRQ_PIN)==0)
{
data = spi_txrx(CMD_READBYTE);
pthread_mutex_lock(&mutex1);
callback(data);
pthread_mutex_unlock(&mutex1);
}
}
static void callback(uint8_t byte)
{
buffer.push_back(byte);
}
모양 또는 스레드 ISR 및 메인 쓰레드 사이의 데이터 교환을 달성하는 쉬운 방법은 무엇입니까?
ISR에서 뮤텍스를 사용할 수 없습니다. ISR은 잠금을 기다릴 수 없습니다. –
그래서 당신의 제안은 무엇입니까? – kloetpatra
모든 ISR이 문제를 오염시키고 있다고 생각합니다. 핸들러를 호출하면 실제 질문이되는 것처럼 보입니다. mutex로 보호되는 STL 컨테이너를 다중 스레드 응용 프로그램에서 사용하는 것이 좋습니다. – shodanex