Как стать автором
Обновить
1
0
Serge @sefo

FW, FPGA, ASIC

Отправить сообщение
Ну чтоже, тогда придется аргументировать. Только чур не обижаться — будет не очень приятно.

Начну с положительного момента. «Первое что можно попробовать — сэкономить на всем.» — это действительно шорошая шутка, на мой взгляд. Возьму ее на вооружение.

Теперь отрицательные моменты:

"… доступ к памяти SDRAM синхронизируется, даже память так и называется Synchronous Dynamic Random Access Memory (SDRAM), поэтому такой вариант лишь добавляет дополнительную синхронизацию… Немного поразмыслив, мы поняли, что ничего удивительного тут нет, ведь память то одна, и циклы записи и чтения генерируются к одной микросхеме (по одной шине), ..., то арбитру, который и разруливает обращения по шине, нужно смешивать циклы команд от разных DMA каналов."

Synchronous в названии памяти не имеет вообще никакого отношения к синхронизации доступа, о котором вы дальше пишите. Дело тут в физическом интерфейсе,
которые бывают синхронные и асинхронные. Так вот, слово Synchronous говорит лишь о том, что данный тип памяти использует синхронный физический интерфейс
передачи данных.

На вашей отладочной плате действительно установлена одна микросхема SDRAM, но транзакции на внутренней шине контроллеры DMA генерируют не для нее
(микросхема SDRAM к внутренней шине не может быть подлючена по причине полной несовместимости физических интерфейсов). Транзакции генерируются для
встроенного контроллера внешней памяти — FMC (Flexible memory controller). По этой причине установка 2 и более микросхем SDRAM ситуацию не меняет.

По этой же причине контроллеры DMA никаких циклов команд для SDRAM не генерируют, а арбитр шины, соответственно, их никаким образом не смешивает.

Когда несколько Master-ов хотят обратиться к одному и тому же одноканальному Slave арбитр просто определяет очередность доступа.

DMA ничего не знает ни о том чтО за данные он передает, ни о том от кого и кому он передает. Для DMA что внутренняя SRAM, что FMC — все едино.

Для DMA есть начальный адрес «откуда», начальный адрес «куда», сколько, как формировать последующие адреса, разрядность данных и (для некоторых
DMA) как обрабатывать передаваемые данные (0-ми дополнить, знаком расширить, среднее арифметическое посчитать и т.д.).

Ваше пояснение в скобках, что циклы записи и чтения генерируются "...(по одной шине)..." неверное т.к. это в совсем маленьких микроконтроллерах есть одна шина
на которой «висят» все Master-ы и все Slave-ы. В таких монстрах как F7 шин много и применяется Bus Matrix.

Итак: 1) один Master (CPU) отрисовывает в буфере, находящимся в SDRAM и затем с копирует в «видеопамять», которая тоже находится SDRAM. — 45 FPS
2)вы добавляете еще один буфер и заменяете memcopy на DMA (2 Master-а к одному Slave) — 48 FPS
3)вы добавляете 2-ой DMA (3 Master-а к одному Slave) — 30 FPS

Результаты вас удивляют, а ваши объяснения "… циклы записи и чтения генерируются к одной микросхеме (по одной шине)...", «Я не хочу сказать, что DMA оказался бесполезен...» не выдерживают никакой критики. И это происходит потому, что вы совсем не понимаете что именно и в каких местах происходит.

А происходит следующее. Во всех трех вариантах количество транзакций по внутренним шинам одинаковое, из-за того, что slave (FMC) один и для обмена данными у него всего один канал, все транзакции выстраиваются в «очередь» и происходят последовательно. С точки зрения шин и Bus Matrix в этом случае большой разницы между 1-м, 2-мя и 3-мя Master-ами нет. Расходы на арбитраж не очень большие. Поэтому, если бы дело было в «одной микросхеме (по одной шине)», то замена memcopy на DMA дала бы существенное ускорение (DMA существенно быстрее memcopy), добавление второго DMA — незначительное замедление.

Проблема в особенностях работы SDRAM — причем не конкретной микросхемы, а SDRAM как таковой. Но об этом вы, явно, мало что знаете. SDRAM очень даже шустрая, если читать или писать большой объем данных, расположенных последовательно. Как только начинается произвольный доступ скорость катастрофически падает. Поэтому, если бы вместо SDRAM к FMC подключили SRAM ситуация была бы иной.

При 1) сутуацию во время прорисовки улучшает внутренний буфер FMC, правда memcopy он уже помочь не может.

При 2) степень произвольности доступа растет и производительность SDRAM падает. Это происходит потому, что DMA не гонит все ваши 256 кБ одной транзакцией, а выполняет множество burst транзакций по 16 beats и т.к. происходит это одновременно с отрисовкой, транзакции от CPU перемежаются с транзакциями от DMA. Проблема в том, что каждый мастер обращается к своей области памяти в SDRAM (их получается 3 — buf1, buf2, video). Тут на время работы DMA FMC уже помочь ничем не может. Но засчет того, что DMA работает значительно быстрее и эффективнее memcopy, транзакции DMA идут чаще транзакций CPU, в сумме получается даже небольшой выигрыш.

При 3) все существенно существенно ухудшается — оба DMA работают одинаково быстро и каждый работает со свими областями (их теперь 5 — buf1, buf2_a, buf2_b, video_a, video_b). Теперь уже речи не идет о том, что степень произвольности доступа растет — теперь на время работы обеих DMA доступ чисто произвольный. Производительность SDRAM падает примерно до плинтуса.

Итого:

Про организацию шин внутри микроконтоллера и про их работу вы мало что знаете.
Про SDRAM вы мало что знаете.
Про DMA вы мало что знаете.

Про кэш вы тоже мало что знаете, но про это вы пока еще, похоже, не знаете — об этом я вам расскажу в следующем сообщении к концу недели.

У вас для разработчика OS недопустимо низкий уровень знаний.

Отличная юмористическая статья! 5+! Давно так не смеялся. Жаль только смех был сквозь слезы… Даже хорошо, что автор так ничего и не рассказал про "особенности графической подсистемы мокроконтроллеров", как обещал в названии статьи. От Embox буду держаться как можно дальше.

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность