Nuvoton NUC970 -> и "малоканальность" DMA. http://caxapa.ru/837495.html
Всем хорошо 970, кроме одного маленького нюанса - всего 2 канала DMA.
980 содержит 2 DMA контроллера, по 10 каналов в каждом, и это позволяет (теоретически) эффективно работать с периферией. Но нет варианта без криптографии, что создает известные трудности.
У 970 есть версии без криптографии, но мало DMA. Просто как в известной миниатюре про больших и маленьких раков :(
2 канала DMA - это, по сути, обслужить "на всю катушку" один Ethernet контроллер. А их два в некоторых чипах.
DMA Host имеет встроенный DMA, что конечно хорошо, но мало.
Все остальные коммуникационные интерфейсы становятся малополезными из-за сильной нагрузки на процессор.
56к ОЗУ - это некоторое спасение, но не полное.
Когда процессор начинает таскать данные в/из периферии, нас будет сильно мучить разная тактовая ядра и периферийных шин.
CPU - 300 MHz
DRAM - 150 MHz 16 бит
AHB - 150 MHz
APB - 75 MHz - вот тут большая часть периферии сидит.
Ethernet - 256 байт FIFO, отдельно TX, RX, сидят на AHB.
LDM/STM в режиме ARM - 16 слов за 16 тактов по шине процессора (одна половина операции - прочитать в регистры; не учтены расходы тактов на саму команду и спасение/сохранения банка регистров). 16 слов мы прочитали из FIFO периферии за 32 такта (150 МГц) и записали по адресу, который закеширован - 16 тактов.
48 тактов/16 слов/64 байта. 256 байт - 192 такта. 1к - 768 тактов. 10 Мбайт - 7 680 000 тактов. 20 мбайт - 15 360 000 тактов. У меня получилось 0,75 байта на такт. В приложенной презе на 64 стр. 0.64 байта на такт на некоем асм куске.
Там еще немало накладных расходов, так что умножаем на 1.5 = 23 040 000 тактов. Будем считать 24м тактов. Или 8% от 300 МГц.
100М Ethernet способен пропустить 20Мбайт/сек дуплексного потока, а мы только на передачу/прием такого потока в память затратили 8..10% производительности процессора.
DMA не бесплатен, он блокирует шину (здесь нет многобанкового ОЗУ), но за счет многослойного шинного коммутатора и способности процессора выполнять регистровые операции "внутри себя" не все так плохо, потери будут раза в 3-4 меньше от описанного выше.
Куча всякой мелкой периферии чревата нагрузкой на кеш команд обработчиками прерываний от такой периферии. Видимо, код таких обработчиков стоит хранить в 56к ОЗУ, может часть данных тоже.
В целом, NUC хороши ценой, -40 и богатой периферией, но не стоит забывать, что ожидать полной скорости от всей периферии наивно.
У кого какой опыт работы с этими камнями?