Bear_ku 0 April 8 Posted April 8 · Report post Для возможности работы UART на скоростях в 2 Мбит был переписан драйвер UART. И связь стабильно работает до тех пор, пока загрузка процессора не достигает 100%. При этом перестает вызываться обработчик прерывания UART, FIFO переполняется и происходит потеря кадров данных. Вопрос вот в чём: можно ли в linux повысить приоритет обработчика (-ов) прерываний по сравнению с обычным приложением? Или можно что-то ещё сделать? Raspberry 3 CM (+). Проблема наблюдается как на старом, так и на свежем ядре: - Raspbian 12, kernel 6.1.50. - Debian 7, kernel 3.18.11 Quote Share this post Link to post Share on other sites More sharing options...
makc 352 April 8 Posted April 8 · Report post 29 минут назад, Bear_ku сказал: Или можно что-то ещё сделать? Как вариант, попробовать снизить нагрузку на процессор с помощью nice, cpulimit или cgroup. Но, думается мне, что у вас ошибки в драйвере, т.к. никакие процессы в пользовательском пространстве не должны влиять на обработку прерывания в контексте ядра. 🤔 Quote Share this post Link to post Share on other sites More sharing options...
Bear_ku 0 April 8 Posted April 8 · Report post On 4/8/2025 at 9:39 AM, makc said: Как вариант, попробовать снизить нагрузку на процессор с помощью nice, cpulimit или cgroup. Но, думается мне, что у вас ошибки в драйвере, т.к. никакие процессы в пользовательском пространстве не должны влиять на обработку прерывания в контексте ядра. 🤔 Выводил вход/выход обработчика прерывания на ножку процессора. Видно что бывают затыки в десятки-сотни миллисекунд и не вызывается само прерывание. Данные перестают передаваться и приниматься. Тут даже не знаю в чём может быть ошибка драйвера. Я привык к МК, там у каждого прерывания приоритет и обработчик, можно разобраться что, как и почему. А здесь ОС со своими прерываниями и я не в курсе как оно работает. Загрузка CPU помогла выявить проблему и для своих утилит был использован cpulimit. Но такая ситуация, хоть и значительно реже, появляется и при работе каких-то сторонних процессов, когда на top загрузка ядра не превышает десятка процентов. Quote Share this post Link to post Share on other sites More sharing options...
makc 352 April 8 Posted April 8 · Report post 4 минуты назад, Bear_ku сказал: Выводил вход/выход обработчика прерывания на ножку процессора. Видно что бывают затыки в десятки-сотни миллисекунд и не вызывается само прерывание. Как вы регистрируете обработчик прерывания? Покажите код регистрации. Quote Share this post Link to post Share on other sites More sharing options...
Bear_ku 0 April 8 Posted April 8 · Report post On 4/8/2025 at 10:22 AM, makc said: Как вы регистрируете обработчик прерывания? Покажите код регистрации. result = request_irq(UartIrq, ttyUart0_irq_handler, 0, "ttyUart0_irq_handler", NULL); Quote Share this post Link to post Share on other sites More sharing options...
makc 352 April 8 Posted April 8 · Report post По-моему у вас там лишняя запятая перед 0. И попробуйте задать флаг SA_INTERRUPT. Quote Share this post Link to post Share on other sites More sharing options...
Bear_ku 0 April 8 Posted April 8 · Report post On 4/8/2025 at 10:42 AM, makc said: По-моему у вас там лишняя запятая перед 0. И попробуйте задать флаг SA_INTERRUPT. Спасибо. Флаг попробую. Запятую убрал, позднее. Это я случайно её добавил при копировании. Quote Share this post Link to post Share on other sites More sharing options...
gridinp 10 April 26 Posted April 26 · Report post В 08.04.2025 в 08:17, Bear_ku сказал: Видно что бывают затыки в десятки-сотни миллисекунд и не вызывается само прерывание. Данные перестают передаваться и приниматься. Тут даже не знаю в чём может быть ошибка драйвера. Я привык к МК, там у каждого прерывания приоритет и обработчик, можно разобраться что, как и почему. А здесь ОС со своими прерываниями и я не в курсе как оно работает. Загрузка CPU помогла выявить проблему и для своих утилит был использован cpulimit. Но такая ситуация, хоть и значительно реже, появляется и при работе каких-то сторонних процессов, когда на top загрузка ядра не превышает десятка процентов. а usb в это время работает? у этого процессора ошибка в usp ip ядре и бывает из этого вся система встаёт, чтобы проверить эту версию можно снизить скорость до usb1: в cmdline.txt добавить dwc_otg.speed=1 Quote Share this post Link to post Share on other sites More sharing options...
sasamy 9 May 23 Posted May 23 (edited) · Report post On 4/8/2025 at 7:08 AM, Bear_ku said: Вопрос вот в чём: можно ли в linux повысить приоритет обработчика (-ов) прерываний по сравнению с обычным приложением? Или можно что-то ещё сделать? использовать патч PREEMT_RT http://starterkit.ru/html/index.php?name=forum&op=view&id=32175 для проверки загружал процессор на 100% стресстестом - в течении нескольких часов не было потерь на скорости 4 мбит кадры 4 кб Можно повысить приоритет как пользовательских процессов так и обрабочтиков прерываний - с PREEMT-RT обработчики работают в контексте процессов ядра и видны в выхолпе ps в квадратных скобках Edited May 23 by sasamy Quote Share this post Link to post Share on other sites More sharing options...