У меня есть программа, написанная на C, которая работает на Raspberry Pi с установленным raspbian. Программа проверяет наличие прерывания на выводе GPIO и при возникновении прерывания создает новый поток для чтения последовательного порта. Программа написана с использованием библиотеки WiringPi и обладает многопоточностью:
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
int Count = 0;
PI_THREAD(readSerial) {
FILE *f = fopen("/home/pi/file", "a");
if (f == NULL) {
printf("Error opening file!\n");
exit(1);
}
//read serial port data here - omitted for simplicity
fprintf(f, "%s", serial_port_data);
fclose(f);
}
void interruptGPIO(void) {
piLock(0);
Count++;
int x = piThreadCreate(readSerial);
if (x != 0)
printf("error no: %d\n", x);
piUnlock(0);
}
int main(int argc, char** argv) {
wiringPiSetup();
pinMode(11, INPUT);
wiringPiISR(11, INT_EDGE_FALLING, &interruptGPIO); //interrupt function
while (1) {
sleep(100);
piLock(0);
Count = 0;
piUnlock(0);
}
return (EXIT_SUCCESS);
}
Проблема в том, что программа работает нормально в течение 15 минут, выводя данные последовательного порта, как и должно быть. Через некоторое время piThreadCreate(readSerial);
начинает возвращать ошибку 11, что из того, что я гуглил, означает EAGAIN
- достигнут предел количества потоков. Данные из последовательного порта всегда составляют около 20 байтов со скоростью 115200 бод, поэтому они должны читать их довольно быстро. Прерывание происходит один раз в несколько секунд, иногда несколько раз в секунду, но не чаще, чем три раза в секунду, поэтому не очень часто. Примерно через 5 минут после получения ошибки EAGAIN
она снова начинает работать в течение еще ~ 15 минут, затем снова перестает работать в течение ~ 5 минут и снова и снова, снова и снова. Я посмотрел в файл WiringPi.h, но нет функции для завершения потока, поэтому я считаю, что он завершается, когда он выполняет функцию PI_THREAD(readSerial)
. Я пытался исправить это в течение нескольких дней, чтобы не преобладать. Есть мысли о том, что здесь может быть не так? Спасибо.