Я пытаюсь разработать приложение для пользовательского пространства C/C++ на Raspberry Pi, которое обрабатывает данные, поступающие с устройства SPI. Я использую WiringPi Библиотека (функция wiringPiISR), которая регистрирует функцию (реального обработчика прерываний), которая будет вызываться из обработчика прерываний pthreaded в событии IRQ.Что такое безопасный и простой способ обмена данными с резьбовым 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 загрязняют вопрос. Вызовите его обработчиком, как кажется вашим реальным вопросом, нормально ли использовать контейнеры STL в многопоточном приложении, если они защищены мьютексом. – shodanex