Jump to content
    

Прерывание UART

Для возможности работы UART на скоростях в 2 Мбит был переписан драйвер UART. И связь стабильно работает до тех пор, пока загрузка процессора не достигает 100%. При этом перестает вызываться обработчик прерывания UART, FIFO переполняется и происходит потеря кадров данных. Вопрос вот в чём: можно ли в linux повысить приоритет обработчика (-ов) прерываний по сравнению с обычным приложением? Или можно что-то ещё сделать?

Raspberry 3 CM (+).
Проблема наблюдается как на старом, так и на свежем ядре:
- Raspbian 12, kernel 6.1.50. 
- Debian 7, kernel 3.18.11 

Share this post


Link to post
Share on other sites

29 минут назад, Bear_ku сказал:

Или можно что-то ещё сделать?

Как вариант, попробовать снизить нагрузку на процессор с помощью nice, cpulimit или cgroup. Но, думается мне, что у вас ошибки в драйвере, т.к. никакие процессы в пользовательском пространстве не должны влиять на обработку прерывания в контексте ядра. 🤔

Share this post


Link to post
Share on other sites

On 4/8/2025 at 9:39 AM, makc said:

Как вариант, попробовать снизить нагрузку на процессор с помощью nice, cpulimit или cgroup. Но, думается мне, что у вас ошибки в драйвере, т.к. никакие процессы в пользовательском пространстве не должны влиять на обработку прерывания в контексте ядра. 🤔

Выводил вход/выход обработчика прерывания на ножку процессора. Видно что бывают затыки в десятки-сотни миллисекунд и не вызывается само прерывание. Данные перестают передаваться и приниматься. Тут даже не знаю в чём может быть ошибка драйвера. Я привык к МК, там у каждого прерывания приоритет и обработчик, можно разобраться что, как и почему. А здесь ОС со своими прерываниями и я не в курсе как оно работает.
Загрузка CPU помогла выявить проблему и для своих утилит был использован cpulimit. Но такая ситуация, хоть и значительно реже, появляется и при работе каких-то сторонних процессов, когда на top загрузка ядра не превышает десятка процентов.

Share this post


Link to post
Share on other sites

4 минуты назад, Bear_ku сказал:

Выводил вход/выход обработчика прерывания на ножку процессора. Видно что бывают затыки в десятки-сотни миллисекунд и не вызывается само прерывание.

Как вы регистрируете обработчик прерывания? Покажите код регистрации.

Share this post


Link to post
Share on other sites

On 4/8/2025 at 10:22 AM, makc said:

Как вы регистрируете обработчик прерывания? Покажите код регистрации.

result = request_irq(UartIrq, ttyUart0_irq_handler, 0, "ttyUart0_irq_handler", NULL);

Share this post


Link to post
Share on other sites

По-моему у вас там лишняя запятая перед 0. И попробуйте задать флаг SA_INTERRUPT.

Share this post


Link to post
Share on other sites

On 4/8/2025 at 10:42 AM, makc said:

По-моему у вас там лишняя запятая перед 0. И попробуйте задать флаг SA_INTERRUPT.

Спасибо. Флаг попробую. Запятую убрал, позднее. Это я случайно её добавил при копировании.

Share this post


Link to post
Share on other sites

В 08.04.2025 в 08:17, Bear_ku сказал:

 Видно что бывают затыки в десятки-сотни миллисекунд и не вызывается само прерывание. Данные перестают передаваться и приниматься. Тут даже не знаю в чём может быть ошибка драйвера. Я привык к МК, там у каждого прерывания приоритет и обработчик, можно разобраться что, как и почему. А здесь ОС со своими прерываниями и я не в курсе как оно работает.
Загрузка CPU помогла выявить проблему и для своих утилит был использован cpulimit. Но такая ситуация, хоть и значительно реже, появляется и при работе каких-то сторонних процессов, когда на top загрузка ядра не превышает десятка процентов.

а usb в это время работает? у этого процессора ошибка в usp ip ядре и бывает из этого вся система встаёт, чтобы проверить эту версию можно снизить скорость до usb1:

в cmdline.txt добавить  dwc_otg.speed=1

Share this post


Link to post
Share on other sites

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 by sasamy

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...