У меня есть собственное оборудование Xilinx PCIe Endpoint Hardware, я написал для него драйвер Linux, а также образец приложения для его тестирования. Драйвер загружается правильно, и устройство также распознается. Тогда использование ЦП также будет стабильным, пока я не запустил свое приложение. Когда я запускаю свое приложение, одно из моих 4 ядер достигает 100%, тогда как другие ядра остаются ниже 10%. Затем открывая любое другое приложение (может быть браузер Firefox, как я), система полностью зависает и требует жесткого перезапуска, чтобы вернуться в нормальное состояние. Использование ЦП с точки зрения процесса показывает только мое приложение на уровне 25%, а все остальные остаются на уровне 0–1%.

Связь между драйвером и приложением - это только прерывания. Когда есть прерывание MSI, вызов чтения файла устройства в приложении разблокируется, и приложение снова начинает ждать другого прерывания. Также я получаю доступ к BAR Regions из приложения, используя файлы ресурсов.

Почему только одно ядро ​​показывает 100% загрузку ЦП? и почему моя система полностью зависает при запуске другого приложения, даже когда 3 ядра почти полностью свободны?

0
sskartheekadivi 9 Фев 2021 в 14:43

1 ответ

Лучший ответ

Нашел проблему.

В приложении, которое я запускаю, создано 4 потока, которые будут обрабатывать каждое прерывание PCIe. Кроме того, функция main опрашивает глобальную переменную с пустым циклом while. Это причина высокой загрузки ЦП. Выяснили способ и использовали usleep вместо цикла while и сделали. Загрузка ЦП сейчас менее 20%.

Спасибо за ваши комментарии.

0
kartheek73 12 Фев 2021 в 13:28