Jump to content

    

Чтение из устройства по прерыванию

Recommended Posts

Здравствуйте.

Ситуация следующая.

Есть система на SOC, 2 ядра + FPGA, частота ядра 1 ГГц. На ПЛИС реализован модуль, который принимает из UART пакеты, частота пакетов 1 КГц, размер 50 байт.

После приема пакета модуль формирует прерывание. 

В драйвере реализован девайс, который при открытии засыпает и ждет соответствующего прерывания. После возникновения прерывания системный вызов open возвращает дескриптор.

Код в пространстве пользователя открывает устройство, потом читает необходимое кол-во байт и закрывает устройство.

Проблема в том, что периодически пакеты теряются. Реально принимается с секунду около 900 пакетов из 1000 ожидаемых.

Оказалось, что время от времени открытие девайса занимает более 2, а то и 4 мсек, соответственно за это время драйвер успевает принять несколько пакетов.

В драйвере все четко, строго каждую мсек приходит пакет и копируется в буфер. Проблема именно в связке между девайсом и кодом в пространстве пользователя.

Пытался вставлять wait_event_interruptible в функцию read, чтобы не один раз получить дескриптор, но это ничего не изменило.

Понимаю, что можно буферизировать пакеты в драйвере и читать сразу несколько. Но мне важно привязать каждый пакет к таймштампу в юзерспейсе 

Что еще можно предпринять ?

Share this post


Link to post
Share on other sites

BaN
16 minutes ago, карамболь said:

Понимаю, что можно буферизировать пакеты в драйвере и читать сразу несколько. Но мне важно привязать каждый пакет к таймштампу в юзерспейсе 

Чем не устраивает вариант добавлять таймштамп в каждый пакет в драйвере?

Share this post


Link to post
Share on other sites

3 minutes ago, BaN said:

Чем не устраивает вариант добавлять таймштамп в каждый пакет в драйвере?

да устраивает в принципе. Лень все переписывать ) И хочется понять, неужели 1 КГц это слишком быстро для гигигерцового двухядерного проца ?

Share this post


Link to post
Share on other sites

BaN
2 minutes ago, карамболь said:

да устраивает в принципе. Лень все переписывать ) И хочется понять, неужели 1 КГц это слишком быстро для гигигерцового двухядерного проца ?

Обычный линукс без rt-ядра может иметь и бОльшие задержки:

http://shukra.cedt.iisc.ernet.in/edwiki/Real-time_response_of_the_Embedded_Linux_system_on_BeagleBone_Black_Wireless

Share this post


Link to post
Share on other sites

14 minutes ago, BaN said:

Обычный линукс без rt-ядра может иметь и бОльшие задержки:

http://shukra.cedt.iisc.ernet.in/edwiki/Real-time_response_of_the_Embedded_Linux_system_on_BeagleBone_Black_Wireless

Ясно

Share this post


Link to post
Share on other sites

gosha
On 11/18/2021 at 11:27 AM, карамболь said:

да устраивает в принципе. Лень все переписывать ) И хочется понять, неужели 1 КГц это слишком быстро для гигигерцового двухядерного проца ?

Каков шаг планировщика Linux ?

Linux нет приоритетов для приложений и процессов, что приложение с высшим приоритетом перебивает   приложение с низким приоритетом.

Если лень, ну тогда буферизация в ПЛИС.

 

 

Share this post


Link to post
Share on other sites

7 minutes ago, gosha said:

Каков шаг планировщика Linux ?

Linux нет приоритетов для приложений и процессов, что приложение с высшим приоритетом перебивает   приложение с низким приоритетом.

Если лень, ну тогда буферизация в ПЛИС.

 

 

Уже реализовал все в ПЛИС. Получилось быстрее и надежнее 

Share this post


Link to post
Share on other sites

gridinp
18.11.2021 в 11:06, карамболь сказал:

Что еще можно предпринять ?

без ПЛИС поможет только realtime ядро (preempt_rt) и запуск realtime thread(s) в программе, делаю так на raspbian для CM3+

Хотя нет, ещё может помочь (но не пробовал) изолирование одного ядра проц. от системы

Edited by gridinp

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.