карамболь 0 Posted November 18, 2021 · Report post Здравствуйте. Ситуация следующая. Есть система на SOC, 2 ядра + FPGA, частота ядра 1 ГГц. На ПЛИС реализован модуль, который принимает из UART пакеты, частота пакетов 1 КГц, размер 50 байт. После приема пакета модуль формирует прерывание. В драйвере реализован девайс, который при открытии засыпает и ждет соответствующего прерывания. После возникновения прерывания системный вызов open возвращает дескриптор. Код в пространстве пользователя открывает устройство, потом читает необходимое кол-во байт и закрывает устройство. Проблема в том, что периодически пакеты теряются. Реально принимается с секунду около 900 пакетов из 1000 ожидаемых. Оказалось, что время от времени открытие девайса занимает более 2, а то и 4 мсек, соответственно за это время драйвер успевает принять несколько пакетов. В драйвере все четко, строго каждую мсек приходит пакет и копируется в буфер. Проблема именно в связке между девайсом и кодом в пространстве пользователя. Пытался вставлять wait_event_interruptible в функцию read, чтобы не один раз получить дескриптор, но это ничего не изменило. Понимаю, что можно буферизировать пакеты в драйвере и читать сразу несколько. Но мне важно привязать каждый пакет к таймштампу в юзерспейсе Что еще можно предпринять ? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
BaN 0 Posted November 18, 2021 · Report post 16 minutes ago, карамболь said: Понимаю, что можно буферизировать пакеты в драйвере и читать сразу несколько. Но мне важно привязать каждый пакет к таймштампу в юзерспейсе Чем не устраивает вариант добавлять таймштамп в каждый пакет в драйвере? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
карамболь 0 Posted November 18, 2021 · Report post 3 minutes ago, BaN said: Чем не устраивает вариант добавлять таймштамп в каждый пакет в драйвере? да устраивает в принципе. Лень все переписывать ) И хочется понять, неужели 1 КГц это слишком быстро для гигигерцового двухядерного проца ? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
BaN 0 Posted November 18, 2021 · Report post 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 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
карамболь 0 Posted November 18, 2021 · Report post 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 Ясно Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
gosha 0 Posted November 23, 2021 · Report post On 11/18/2021 at 11:27 AM, карамболь said: да устраивает в принципе. Лень все переписывать ) И хочется понять, неужели 1 КГц это слишком быстро для гигигерцового двухядерного проца ? Каков шаг планировщика Linux ? Linux нет приоритетов для приложений и процессов, что приложение с высшим приоритетом перебивает приложение с низким приоритетом. Если лень, ну тогда буферизация в ПЛИС. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
карамболь 0 Posted November 23, 2021 · Report post 7 minutes ago, gosha said: Каков шаг планировщика Linux ? Linux нет приоритетов для приложений и процессов, что приложение с высшим приоритетом перебивает приложение с низким приоритетом. Если лень, ну тогда буферизация в ПЛИС. Уже реализовал все в ПЛИС. Получилось быстрее и надежнее Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
gridinp 0 Posted December 2, 2021 (edited) · Report post 18.11.2021 в 11:06, карамболь сказал: Что еще можно предпринять ? без ПЛИС поможет только realtime ядро (preempt_rt) и запуск realtime thread(s) в программе, делаю так на raspbian для CM3+ Хотя нет, ещё может помочь (но не пробовал) изолирование одного ядра проц. от системы Edited December 2, 2021 by gridinp Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...