Linux PCIe XDMA Оработка прерываний xdma0_events_0 блокируется после одного прерывания
Потребовалось написать обработку прерываний, по итогу столкнулся со следующей проблемой, с кнопки на плате event_0 проходит стабильно и в консоли прерывание отображается корректно, но если запускать спам пакетов, то после того как память заполняется и шлется прерывание с самой платы, система блокируется, драйвер стоит, в системе отображается /dev/xdma0_events_0, как снять блокировку после получения прерывания..? Прикладываю код обработки прерывания.
#include <QCoreApplication>
#include "Shared/xdma_linux.h"
#include "Shared/Linux.h"
#include <string>
#include <thread>
#include <vector>
#include <fstream>
#include <poll.h>
#include <sys/socket.h>
#define RW_MAX_SIZE 0x7ffff000
struct pollfd fds[1];
int fd;
int main_event(int* suc_flag)
{
int fd = open("/dev/xdma0_events_0",O_RDWR | O_SYNC | O_NONBLOCK);
if (fd == -1)
fprintf(stderr, "ERROR: [open] fd = %d %s\n", fd, "fd_path: /dev/xdma0_events_0");
try
{
auto event_loop = [&](unsigned event_id)
{
int rc;
int read_interrupt = 0;
int interput_buff = 0;
int i = 0;
while (true)
{
fds[event_id].fd = fd;
fds[event_id].events = POLLIN;
rc = poll(fds, 1, 10);
if (rc == -1)
{
fprintf(stderr, "ERROR: [poll] rc = %d\n", rc);
continue;
}
else if (rc > 0)
{
if (fds[event_id].revents & POLLIN)
{
i++;
fprintf(stderr, "SUCCESS: interrupt find!\n");
fprintf(stderr, "Iteration number: %d\n", i);
fprintf(stderr, "Path: /dev/xdma0_events_%d\n", event_id);
fprintf(stderr, "fd: %d\n", fds[event_id].fd);
fprintf(stderr, "events: %d\n", fds[event_id].events);
fprintf(stderr, "revents: %d\n\n", fds[event_id].revents);
read_interrupt = read(fds[event_id].fd, &interput_buff, 4);
if (read_interrupt != -1)
{
*suc_flag = 1;
fprintf(stderr, "SUCCESS: read complite!\n");
fprintf(stderr, "Readed bytes: %d\n", read_interrupt);
}
else
{
fprintf(stderr, "ERROR: [read] r = %d\n", read_interrupt);
*suc_flag = -1;
}
}
}
}
};
std::thread event_threads[] =
{
std::thread(event_loop, 0)
};
for (auto& t : event_threads)
{
t.join();
}
}
catch (const exception& e)
{
fprintf(stderr, "Ошибка: %s%c", e.what(), '\n');
return -1;
}
}