Получение EAGAIN создания нового потока через некоторое время с помощью библиотеки WiringPi - PullRequest
0 голосов
/ 19 марта 2019

У меня есть программа, написанная на 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). Я пытался исправить это в течение нескольких дней, чтобы не преобладать. Есть мысли о том, что здесь может быть не так? Спасибо.

...