для встроенной платформы на базе MIPS Я реализую небольшую программу для опроса GPIO, то есть я использую библиотеку GPIO уровня пользователя чип-провайдера с базовыми функциями (open/dev/gpio, read, write pin и т. Д. .). Конструкция проста:идентификатор файла опроса
int gpio_fd;
fd_set rfds;
gpio_fd = gpio_open(...);
while (1) {
FD_ZERO(&rfds);
FD_SET(gpio_fd, &rfds);
if (select(gpio_fd + 1, &rfds, NULL, NULL, NULL) > 0) {
if (FD_ISSET(gpio_fd, &rfds)) {
/* read pins and similar */
}
}
}
Но я столкнулся с серьезной проблемой - это приложение, когда бежал с «&» в конце, т.е. положить его в фоновом режиме, потребляет 99% CPU, это, очевидно, из-за жесткой но я наблюдал подобный подход во многих сетевых кодах, и он работал нормально.
Я что-то упускаю, это может быть дефект библиотеки gpio?
На самом деле, только один «while (1);» делает тот же эффект. Может ли это быть «естественным» поведением ядра?
Спасибо.
Я только что просмотрел драйвер устройства gpio и не нашел реализаций «poll/select». Я думаю, ваше предположение верно, спасибо за подсказку! – Mark
@Mark. Может быть, не существует конкретной реализации, а просто какой-то способ для драйвера устройства сигнализировать ОС, что он доступен для чтения. Если бы я знал больше о драйверах устройств Linux, я мог бы дать более конкретные рекомендации, чем это. Я действительно знаю, что существуют типы дескрипторов файлов, которые не реализуют никакого способа опроса/выбора для работы над ними. Например, дескрипторы файлов, относящиеся к фактическим файлам на диске. – Omnifarious
Я только подумал, что «select» может быть намеренно не реализован в библиотеке GPIO, дескриптор файла IMHO gpio всегда готов, в отличие, например, от сокета. Что бы вы сказали ? – Mark