Предложения по управлению памятью Cortex M4: лучшее размещение данных/кода

Пытаюсь реализовать довольно сложную (по крайней мере для меня!) систему на микроконтроллере Cortex M4: LPC4370. У этого есть инструкции HighSpeed ​​ADC (до 80Msps), DMA и DSP (Single Instruction Multiple Data). Вот что я хочу сделать:

  • Пусть выборка АЦП осуществляется непрерывно (не менее 10 Мвыб/с).
  • Переместите данные в SRAM
  • Обрабатывайте их в режиме реального времени с помощью Cortex M4 DSP (фильтрация с формированием импульсов)

Тактовая частота микроконтроллера составляет 204 МГц, и пока давайте предположим, что ADC fs не является спецификацией дизайна, но в идеале я хотел бы, чтобы она была как можно выше. Поэтому мне нужно, чтобы код был настолько быстрым, насколько я могу. Вот настроена память MCU.

введите описание изображения здесьА вот и МНОГОСЛОЙНАЯ МАТРИЦА AHB

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

  • Я не хочу, чтобы ядро ​​M4 и DMA боролись за память: мне нужно, чтобы DMA мог записывать данные, пока M4 выполняет обработку
  • большая часть кода и все полученные данные должны быть в SRAM для более быстрого выполнения
  • Выборка инструкций не должна мешать хранению данных (DMA) и обработке (M4).

В руководстве пользователя LPC4370 (глава 2):

Для оптимизации производительности процессора ARM Cortex-M4 имеет три шины для доступа к инструкциям (коду) (I), доступу к данным (D) и доступу к системе (S). Пространство памяти доступа I- и D-bus расположено ниже 0x2000 0000, S-bus обращается к пространству памяти, начиная с 0x2000 0000. Когда инструкции и данные хранятся в отдельных памяти, тогда доступ к коду и данным может выполняться параллельно в один цикл. Когда код и данные хранятся в одной и той же памяти, инструкции по загрузке или сохранению данных могут занимать два цикла.

Моя идея на данный момент состоит в том, чтобы хранить выборочные данные в двух разных буферах, помещенных в две разные области памяти (например, LocRam128 и LocRam72), и «пинг-понг» DMA и M4 между этими двумя областями. Единственная проблема в том, что эти две области используются для обучения (I). Так что мой гостевой код также должен быть размещен здесь, и это нехорошо для меня. Интересно, как я могу эффективно использовать RAMAHB32, поскольку он подключен только к системной шине M4 (S), а не к данным (D) или инструкциям (I).

Любые подсказки?

Честно говоря, на этот вопрос будет сложно ответить. Я написал процедуру «Высокоскоростной АЦП» для M4. Но максимальная пропускная способность составляет около 1800 кГц. Я проделал массу математических расчетов с образцами, которые действительно ограничивали пропускную способность (не говоря уже о других домашних делах). Честно говоря, вам нужно начать с реальных требований к частоте дискретизации. Вы можете обнаружить, что вы привязаны к процессору, а не к конфликту памяти.
Привет @pgvoorhees, спасибо за ответ. Я понял, что вы имеете в виду, и поэтому я не хочу строго устанавливать частоту дискретизации. Знаете ли вы, есть ли способ использовать системную (S) шину?
Повторюсь: на этот вопрос невозможно ответить, не зная, что вы собираетесь делать с образцами. Если вы не собираетесь ничего с ними делать, то 80Mhz — вполне достижимая цель: просто выделить буфер в памяти и постоянно перезаписывать его с помощью DMA и никогда не позволять процессору вмешиваться. Если вы хотите сделать что-то другое, вы должны указать, что это такое, потому что максимально возможная частота дискретизации и стратегия для достижения этой частоты дискретизации меняются в зависимости от конечной потребности.
Привет @pgvoorhees Я добавил некоторую информацию (я не могу подробно описать проект): мне нужно как минимум 10 МГц, и я хочу формировать импульсы на своих данных. Я уже пытаюсь написать свою функцию обработки наилучшим образом, используя SIMD instrinsics.
Я думаю, вы упускаете из виду то, что пытается донести @pgvoorhees. Вы спрашиваете о тонких деталях управления памятью и DMA для очень конкретного процессора, но, похоже, рассматриваемый процессор не подходит по другим причинам. Так зачем тратить время на размышления об этом процессоре?
Привет @ElliotAlderson, я спрашиваю общие мысли, так как знаю, что мне нужно много работать, чтобы реализовать такую ​​​​вещь. Я просто не хочу начинать с явно (на более опытный взгляд) неправильных оснований. Также, как вы можете видеть в матрице памяти, у этого блока есть 1 M4 и 2 M0: это довольно мощно. (Я придерживаюсь этого, потому что моя компания ни в коем случае не должна использовать это)
К вашему сведению, если вы выполняете выборку со скоростью ~ 10 MSPS, а шина работает на частоте 204 МГц, то я бы не слишком беспокоился о конкуренции DMA и CPU. M4 основан на регистрах, и даже при самой простой обработке сэмплов маловероятно, что он будет тратить более 50% времени на операции загрузки/сохранения. Я бы, вероятно, больше беспокоился о том, где вы размещаете любые константы и промежуточные данные (например, коэффициенты фильтра), поскольку они могут легко конкурировать с выборкой инструкций. Как уже отмечалось, вам необходимо лучше определить свои требования к обработке сигналов, прежде чем вы начнете пытаться снизить производительность таким образом.
Все это похоже на то, что вы выбрали не тот процессор. Также никогда не думайте, что DMA бесплатен. Предположим, вы собираетесь конкурировать с ним. Если вы чувствуете, что вам нужно иметь код в ОЗУ, прежде чем вы столкнетесь с проблемами производительности, я думаю, что этот дизайн уже провален. Вам нужно прототипировать и тестировать, или вам нужно купить продукт, который имеет много излишеств, а затем вы можете делать предположения и не беспокоиться ни о чем из этого. Работайте с каждым блоком отдельно (передачи dma без фактической их обработки) (обработка без передач dma) и т. д. Есть ли у nxp i-кэш, как у st?
то, как вы пишете свой код, будет играть важную роль в его производительности, тактовая частота части так быстро, как она может работать, не обязательно дает вам лучшую производительность, иногда это просто означает, что процессор ожидает на более высокой тактовой частоте то же самое. количество времени и просто сжигание гораздо больше энергии. Придется заняться системным проектированием.

Ответы (1)

Хорошо, поскольку вы не можете поделиться более подробной информацией. Я дам вам несколько общих моментов:

  1. функциональность Scatter-gather в модуле DMA спасет вас; Потратьте время, чтобы понять, как это работает и как его использовать.
  2. Если вы беспокоитесь о доступе к памяти, просто поместите свои буферы пинга и понга в разные памяти. Разбросать-собрать поможет облегчить это.
  3. После вышеизложенного не беспокойтесь о конфликтах с шиной, пока не доберетесь туда. На самом деле: если при использовании отдельных блоков памяти конкуренция за шину ПО-ПРЕЖНЕМУ является вашим узким местом, то у вас неправильный чип. Чисто и просто.
  4. Инвестируйте в j-trace Segger и внедрите потоковую трассировку в свою отладочную плату. Это поможет вам, когда вам нужно устранить проблемы с синхронизацией. Да, это дорого.
  5. Потратьте время, чтобы поэкспериментировать с вашим циклом обработки, размер буферов ping и pong в зависимости от времени цикла обработки. Возможно, вам также придется проявить творческий подход, выполняя частичные рабочие нагрузки, чтобы уложиться в сроки.
  6. Мне нужно было переписать некоторые функции CMSIS DSP, чтобы они работали быстрее.
  7. Не бойтесь копаться в библиотеках CMSIS, они очень удобочитаемы и представляют собой хороший пример обработки SIMD.
  8. когда я сравнивал свой код, я обнаружил, что оставление раздела .data моей прошивки во флэш-памяти не дало мне сверхзначительного удара по производительности по сравнению с .data, расположенным в оперативной памяти. Это меня удивило.
  9. Используйте данные с фиксированной точкой везде, конвертируйте в число с плавающей запятой только в конце и только при необходимости.

Надеюсь это поможет.