Интерфейс ARM ITCM и доступ FLa sh - PullRequest
0 голосов
/ 02 февраля 2020

Если доступ к памяти Fla sh осуществляется с адреса 0x0200 0000, он выполняется автоматически через шину ITCM. ART accelerator ™ должен быть включен, чтобы получить эквивалент доступа в режиме ожидания 0 к памяти Fla sh через шину ITCM. ART активируется путем установки бита 9 в регистре FLASH_ACR, в то время как ART-Prefetch активируется путем установки бита 8 в том же регистре.

Если я размещаю свой программный код, начиная с 0x0200 0000, Что произойдет, если ускоритель ART не включен? Будет ли выгодно просто использовать шину AXIM вместо кода запуска, а затем включить ускоритель ART и указать выполнение программы в области программы, которая находится по адресу 0x0200 0000.

Я просто немного запутался.

https://www.st.com/content/ccc/resource/technical/document/application_note/0e/53/06/68/ef/2f/4a/cd/DM00169764.pdf/files/DM00169764.pdf/jcr: содержание / переводы / ru.DM00169764.pdf

Страница 12

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Так что давайте просто попробуем. NUCLEO-F767ZI

Cortex-M7 в целом:

Prefetch Unit
The Prefetch Unit (PFU) provides:
1.2.3
• 64-bit instruction fetch bandwidth.
• 4x64-bit pre-fetch queue to decouple instruction pre-fetch from DPU pipeline operation.
• A Branch Target Address Cache (BTAC) for the single-cycle turn-around of branch predictor state and target address.
• A static branch predictor when no BTAC is specified.
• Forwarding of flags for early resolution of direct branches in the decoder and first execution stages of the processor pipeline.

Для этого теста предсказание ветвления мешает, поэтому отключите:

Установите ACTLR в 00003000 ( шестнадцатеричное, большинство чисел здесь шестнадцатеричные)

Не вижу, как отключить PFU, так или иначе, не ожидайте, что у вас будет такой контроль.

Поэтому мы ожидаем, что предварительная выборка будет читать 64 бита время, 4 инструкции на выровненной границе.

С ST

Бит DBANK устанавливается для одного банка

Предварительная выборка инструкций

В случае режима с одним банком (бит опции nDBANK установлено) 256 битов, представляющих 8 команд из 32 битов по 16 команд из 16 битов в соответствии с запущенной программой. Таким образом, в случае последовательного кода, по крайней мере, 8 циклов ЦП необходимы для выполнения предыдущего чтения строки инструкций.

Таким образом, ST собирается превратить это в 256-битные или 16 инструкций

Использование таймера на ручке. Я работаю на частоте 16 МГц, поэтому fla sh находится в нулевом состоянии ожидания.

08000140 <inner>:
 8000140:   46c0        nop         ; (mov r8, r8)
 8000142:   46c0        nop         ; (mov r8, r8)
 8000144:   46c0        nop         ; (mov r8, r8)
 8000146:   46c0        nop         ; (mov r8, r8)
 8000148:   46c0        nop         ; (mov r8, r8)
 800014a:   46c0        nop         ; (mov r8, r8)
 800014c:   3901        subs    r1, #1
 800014e:   d1f7        bne.n   8000140 <inner>

00120002

Итак, 12 часов на л oop. Две предварительные выборки из ARM, первая становится одной выборкой ST. Должно быть нулевое состояние ожидания. Обратите внимание, что это AXIM

Если я уменьшу количество nops, оно останется равным 0x1200xx, пока здесь не будет:

08000140 <inner>:
 8000140:   46c0        nop         ; (mov r8, r8)
 8000142:   46c0        nop         ; (mov r8, r8)
 8000144:   3901        subs    r1, #1
 8000146:   d1fb        bne.n   8000140 <inner>

00060003

Выбор одной руки вместо двух. Время сокращается вдвое, поэтому предварительная выборка доминирует в нашей производительности.

08000140 <inner>:
 8000140:   46c0        nop         ; (mov r8, r8)
 8000142:   46c0        nop         ; (mov r8, r8)
 8000144:   46c0        nop         ; (mov r8, r8)
 8000146:   46c0        nop         ; (mov r8, r8)
 8000148:   3901        subs    r1, #1
 800014a:   d1f9        bne.n   8000140 <inner>

000 (zero wait states)

00120002

001 (1 wait state)

00140002

002 (2 wait states)

00160002

202 (2 wait states enable ART)

0015FFF3

Почему это повлияет на AXIM?

, поэтому каждое состояние ожидания добавляет 2 такта на л oop, есть два выборок на л oop, поэтому, возможно, каждая выборка заставляет st выполнить одну из 256-битных выборок, которая кажется нарушенной.

Переключиться на ITCM

00200140 <inner>:
  200140:   46c0        nop         ; (mov r8, r8)
  200142:   46c0        nop         ; (mov r8, r8)
  200144:   46c0        nop         ; (mov r8, r8)
  200146:   46c0        nop         ; (mov r8, r8)
  200148:   3901        subs    r1, #1
  20014a:   d1f9        bne.n   200140 <inner>

000

00070004

001

00080003

002

00090003

202

00070004

ram

00070003

Так что ITCM один, нулевое ожидание состояние, ART выключен 7 часов за l oop для 6 инструкций l oop с ответвлением. кажется разумным. Для этого крошечного теста включение ART с двумя состояниями ожидания возвращает нас к 7 на л oop.

Обратите внимание, что для ram этот код также работает на 7 на л oop. Давайте попробуем другую пару

00F

00230007

20F

00070004

Я не искал других предикторов ветвления, кроме BTA C

Первое, на что нужно обратить внимание: вы не хотите запускать MCU быстрее чем вам нужно, сжигает энергию, многие вам нужно добавить FL sh состояния ожидания, многие CPU и периферийные устройства имеют разные максимальные тактовые частоты, поэтому есть граница, где она становится нелинейной (занимает X тактовых циклов при медленных тактах частота, периферийные часы = тактовая частота процессора, есть место, где N раз быстрее N X тактов, чтобы сделать что-то, но одна или несколько границ, где требуется больше, чем N X, чтобы сделать что-то, когда тактовая частота процессора В N раз быстрее). Эта конкретная часть имеет эту нелинейную проблему. Если вы используете библиотеки из ST для установки часов, то вы, возможно, получаете худший случай из fla sh состояний ожидания, где, если вы настроите его и прочитаете документацию, вы сможете сбрить один или два / несколько.

Cortex-M7 имеет дополнительные кеши L1, на этот раз не связывался с ним, но у ST была эта вещь ART до того, как они появились, и я считаю, что они по крайней мере побеждают / отключают кэш i, улучшит ли это его или хуже иметь оба? Если он есть, тогда первое прошлое будет медленным, а остальное возможно быстрее даже в пространстве AXIM. Вы можете попробовать это. Кажется, помните, что они сделали что-то хитрое с ремешком на ядре процессора, было нелегко увидеть, как оно было побеждено, и это может быть не этот чип / ядро, но определенно был ST. M4 не имеет кеша, поэтому это должен быть M7, с которым я связывался (в частности, с этим).

Таким образом, краткий ответ: производительность не так уж и ужасна, если вы откажетесь от ИСКУССТВО и / или закончилась AXIM. ST реализовал fla sh таким образом, что интерфейс ITCM работает быстрее, чем AXIM. Мы можем увидеть эффект самой загрузки ARM, если вы включите предсказание ветвлений, вы также можете увидеть это, если включите его.

Нетрудно создать эталонный тест, который побеждает эти функции, так же, как вы можете сделать тест, который делает кеш L1 (или любой другой кеш) снижающим производительность. ART, как и любой другой кеш, делает производительность менее предсказуемой, и по мере того, как вы меняете код, добавляете строки, удаляете строки, производительность может прыгать в любом месте, без каких-либо изменений в результате.

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

Трудно сказать похоже, они утверждают, что АРТ снижает мощность. Я ожидал бы, что это увеличит власть, имея те srams на / такт. Не вижу очевидного, сколько вы сэкономите, если выключите fla sh и бегите от барана. Детали M7 на самом деле не предназначены для деталей с низким энергопотреблением, как некоторые детали STM32L, где вы можете получить единицы / десятки микроампер (микро, а не миллионы, если бы это было сделано).

Небольшое количество часов 0x70004 вместо 0x70000 приходится иметь дело с некоторыми накладными расходами на выборку, будь то ARM или ST или их комбинация. Чтобы увидеть производительность памяти / fla sh, вам необходимо отключить как можно больше функций, таких как прогнозирование ветвлений, кэши, которые вы можете отключить, и т. Д. c. В противном случае сложно измерить производительность, а затем сделать предположения о том, что делает флэш / память / шина. Я подозреваю, что все еще есть вещи, которые я не выключил, чтобы сделать точное измерение, и / или не могу выключить. И простые циклы nop (пробовали другие не nop инструкции, не меняли их) не скажут вам всего. Используя документы в качестве руководства, вы можете попытаться кэшировать sh ART или другие данные и посмотреть, какие попадания вам нужны.

Для кода, критичного к производительности, вы можете запустить из ОЗУ и избежать всех этих вопросов, я не искал его, но предположил, что эти части SRAM могут работать так же быстро, как процессор. Ответ не выскакивает у меня, вы можете понять его.

Обратите внимание, что мой тест на самом деле выглядит как

    ldr r2,[r0]
inner:
    nop
    nop
    nop
    nop
    sub r1,#1
    bne inner
    ldr r3,[r0]
    sub r0,r2,r3
    bx lr

, где выборка из синтистика находится только впереди и сзади. Перед веткой. Чтобы измерить ART, вам нужно выбрать время до перехода в ветвь для диапазона памяти, который не был прочитан, магически невозможно прочитать, что чем быстрее первое чтение в кэш, тем медленнее. Если я переместлю отсчет времени дальше, я смогу увидеть go от 0x7000A до 0x70027 для состояний ожидания от 0 до 15 с включенным ART. Это заметное снижение производительности веток в коде, который еще не был запущен / кэширован. Зная размер художественных выборок, должно быть легко сделать тест, который много скачет, и функция ART начинает не иметь значения.


Короткий ответ, ITCM - это другой интерфейс шины на ARM Ядро, ST реализовал их дизайн так, что есть выигрыш в производительности. Таким образом, даже если ART не включен, ITCM работает быстрее, чем AXIM (скорее всего, это шина ARM, а не ST fla sh). Если вы работаете на достаточно высоких тактовых частотах, чтобы добавить в состояние ожидания значения sh, то ART в основном может стереть их.

0 голосов
/ 03 февраля 2020

Q. Если я размещу свой программный код, начинающийся с 0x0200 0000, что произойдет, если ускоритель ART не включен?

A. Выполнение программы (выбор инструкций и постоянный доступ) будет мучительно медленным, с безумным количеством циклов ожидания (15?).

[UPD. Я должен исправить, что это в большей степени относится к конфигурациям с высокой тактовой частотой, например, требуется 15 состояний ожидания для 216 МГц. При более низких частотах штраф за доступ к fla sh будет менее значительным и минимальным при 16 МГц. Мы не знаем, какую частоту использует OP]

[UPD2. Извините, нужно максимум 9 состояний ожидания на частоте 216 МГц. ]

Q. Какая шина предпочтительнее для доступа с кодом fla sh, AXI или ITCM?

A. Обширный документ, на который вы ссылались, включает некоторые измерения производительности, в которых также сравниваются различные варианты размещения кода. Результаты несколько различаются для разных моделей процессоров, поскольку размеры кэша и ширина шины различны. Ваш код, скорее всего, будет изменен. Мой вывод из этой статьи: если ваш код не критичен по производительности, оба варианта работают достаточно хорошо. Однако наличие двух параллельных шин с кэшами позволяет вам создавать творческие вещи, такие как разбиение кода на части и распределение их по разным шинам, чтобы критический, но редко используемый код не исключался из кэша. Я имею в виду, если тебе это действительно нужно.

...