Я повторил эту «ошибку» в BeagleBone Black (4.14.71-ti-r80).
Это происходило в некотором C ++, скопированном из превосходной Исследовавшей BeagleBone книги Дерека Моллоя Выпуск 1 , которая была написана, когда ядро 3.8 было самым последним.
Я проверил новую версию книги (выпущенную в этом году), но не упомянул об этой проблеме.
Я «исправил» это, поставив тест на существование каталога gpio # перед записью номера gpio в файл экспорта sysfs.
т.е. Я проверил наличие '/ sys / class / gpio / gpio7'
Перед записью 7 в '/ sys / class / gpio / export'
Я изменил существующую функцию exportGPIO в GPIO.cpp в Molloy с:
int GPIO::exportGPIO(){
return write(GPIO_PATH, "export", this->number);
}
до:
int GPIO::exportGPIO(){
// APM - 2019-05-27 - export twice kills it
if (checkDirectoryExists(GPIO_PATH + this->name)) {
cout << std::string("GPIO: export ") + GPIO_PATH + this->name + " already exists" << endl;
return 0;
}
return write(GPIO_PATH, "export", this->number);
}
Функция checkDirectoryExists, которую я написал на основе вызова stat ().
Подобный подход должен быть довольно простым в сценарии оболочки.