карамболь 0 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба Здравствуйте. Проект разрастается и появляются новые вопросы. Для отладки VCU добавил в PL модуль генерирующий тестовую картинку 4:2:2 FullHD. В модуле реализован DMA канал и генерация прерывания после записи кадра и пара регистров для управления передачей В драйвере выделяю память для DMA через dma_alloc_coherent, шинный адрес записываю в соответствующий регистр модуля. Здесь все стандартно. DMA работает хорошо, все копируется правильно, с прерыванием проблем тоже нет. В юзерспейс принятые данные копируются через copy_to_user. Проблема со скорость чтения этих данных из модуля. По моим замерам выходит, что буфер размером 2*1920*1080 копируется ~ 30 мсек. Память DDR4 работает на частоте 1200 МГц, шина 64 бит. У меня же получается едва ли 100 МБ/сек, что на пару порядков меньше ожидаемого. Может кто-нибудь сталкивался с этим ? Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба Странно. Сейчас выделил 2 буфера в юзерспейсе, копирую через memcpy и получаю скорость в 40 раз быстрее, хотя буфера находятся в той же самой DDR. Что за чудеса ? И не связано ли это с кэшированием ? А если связано, то, где нужно копать ? Настройки ядра ? Модуль ядра ? DTB ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 3 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба 14 hours ago, карамболь said: В юзерспейс принятые данные копируются через copy_to_user. Ой! А mmap - не судьба? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба 1 hour ago, gosha-z said: Ой! А mmap - не судьба? Признаюсь честно, с mmap работал только в юзерспейсе, опыта разработки модулей ядра с поддержкой mmap отсутствует. Я вообще с Линуксом недавно столкнулся, раньше работал с ПЛИС и процессорами без ОС. Если не сложно, поделитесь ссылками для быстрого старта с mmap Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 3 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба 4 minutes ago, карамболь said: Если не сложно, поделитесь ссылками для быстрого старта с mmap Тыц Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба Just now, gosha-z said: Тыц Спасибо. И еще, для общего развития. У вас есть идеи, почему такая дикая разница в скорости передачи между буферами в юзерспейсе и между юзерспейсом и буфером, выделенном в модуле ядра ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 3 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба 12 minutes ago, карамболь said: У вас есть идеи, почему такая дикая разница в скорости передачи между буферами в юзерспейсе и между юзерспейсом и буфером, выделенном в модуле ядра ? Потому-что во втором случае каждый раз происходит дрессировка MMU, а это небыстрый процесс.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба 15 minutes ago, gosha-z said: Потому-что во втором случае каждый раз происходит дрессировка MMU, а это небыстрый процесс.. А вылечить это можно ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 3 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба 2 minutes ago, карамболь said: А вылечить это можно ? Только переходом на mmap Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба 4 minutes ago, gosha-z said: Только переходом на mmap Я вас понял. Огромное спасибо ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба Реализовал в драйвере системный вызов mmap через dma_mmap_coherent. В юзерспейсе вызываю mmap и получаю адрес буфера. Копирую из полученного адреса во временный буфер. Данные копируются правильно. Но время копирования те же 30 мсек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 3 23 октября, 2020 Опубликовано 23 октября, 2020 · Жалоба 12 minutes ago, карамболь said: Копирую из полученного адреса во временный буфер Зачем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 23 октября, 2020 Опубликовано 23 октября, 2020 (изменено) · Жалоба 1 hour ago, gosha-z said: Зачем? Для оценки времени копирования. Я потом этот буфер должен передать в функцию, которую пишут другие люди, а они там делают резервные копии под свои нужды. Одновременно, этот буфер необходимо записать во входной буфер кодера Изменено 23 октября, 2020 пользователем карамболь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 26 октября, 2020 Опубликовано 26 октября, 2020 · Жалоба Дополню. На выходных читал форумы по этой проблеме, оказалось, что я не первый с этим столкнулся. Короче, добавив эту строку "dma-coherent" в DTB удалось сократить время чтения ~ в 10 раз. Здесь https://github.com/bperez77/xilinx_axidma/issues/69 обсуждается эта проблема и рекомендуют еще и в дизайне добавить пару констант на Axi шину, но я этого не делал. Скорость чтения на данный момент меня вполне устраивает. Интересно, чем придется за это заплатить ? Пока, вроде, данные приходят корректные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 27 октября, 2020 Опубликовано 27 октября, 2020 · Жалоба Почему бы не реализовать таймер на логике, который счтал бы такты при передаче данных, а потом просто значение считать? PS просто на логике будет более достоверный результат Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться