Интерфейс ARM ITCM и доступ к флэш-памяти

Если доступ к Flash-памяти осуществляется начиная с адреса 0x0200 0000, то он осуществляется автоматически по шине ITCM. Ускоритель ART должен быть включен, чтобы получить доступ к флэш-памяти с нулевым ожиданием через шину 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:content/translations/en.DM00169764.pdf

Страница 12


person Anton Stafeyev    schedule 02.02.2020    source источник


Ответы (3)


Итак, давайте просто попробуем. НУКЛЕО-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 МГц, поэтому флэш-память находится в нулевом состоянии ожидания.

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 тактов на цикл. Две предварительные выборки от 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 такта на цикл, есть две выборки на цикл, так что, возможно, каждая выборка заставляет 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 тактов на цикл для цикла из 6 инструкций с ответвлением. кажется разумным. Для этого крошечного теста включение ART с 2 состояниями ожидания возвращает нас к 7 на цикл.

Обратите внимание, что из оперативной памяти этот код также работает со скоростью 7 за цикл. попробуем другую пару

00F

00230007

20F

00070004

Я не искал других предсказателей ветвления, кроме BTAC.

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

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

Таким образом, краткий ответ: производительность не так уж ужасна, если вы не используете ART и/или не используете AXIM. ST реализовал флэш-память таким образом, что интерфейс ITCM работает быстрее, чем AXIM. Мы можем увидеть эффекты выборки ARM, если вы включите прогнозирование ветвлений, вы также можете увидеть это, если включите его.

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

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

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

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

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

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

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

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


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

person old_timer    schedule 03.02.2020
comment
Правильно ли я понимаю эти цифры (00F/00230007/20F/00070004), что отключение ART привело к 5-кратному снижению производительности вашего простого цикла с 15 состояниями ожидания? Это был бы важный результат для тех, кто использует F7 на частоте 216 МГц. - person A.K.; 03.02.2020
comment
Нет, если вы посмотрите на таблицу 216, вы находитесь либо в 7,8, либо в 9 состояниях ожидания в зависимости от вашего диапазона напряжения. (что-то, что может сказать библиотека, поэтому я предполагаю, что 9). В то же время да, вам нужно добавить состояния ожидания, чтобы работать быстро, но по сравнению с AXIM, ITCM по-прежнему будет заметно быстрее, как можно было бы предположить на основе документации и приведенного выше эксперимента. 15 сделано в демонстрационных целях. процессор будет использовать эти 4 или 8 инструкций с очень высокой скоростью по сравнению с более медленной работой с меньшим количеством состояний ожидания. а еще может быть и кеш l1... - person old_timer; 03.02.2020
comment
да, использование 15 продемонстрировало ART, но даже с ART я продемонстрировал, что это не волшебство, как подразумевается, вы не получите эффективной производительности в состоянии 0-wait, только для кода, который повторно запускается, я ожидаю, что он будет на одном уровне с Кэш L1, ART - это в основном кеш L2, он может быть быстрее, чем L1 (если L1 реализован в этих частях), если ST спроектировал его таким образом, они управляют ART и геометрией / интерфейсом флэш-памяти. - person old_timer; 03.02.2020
comment
Из вопроса (для меня) не имеет смысла начинать с AXIM, а затем переключаться только потому, что ART выключен. Кажется, что вы можете просто включить ART в любое время, когда вы играете с изменением nDBANK во время работы, есть процедуры для остановки/очистки ART. Если вы хотите использовать ART, поместите код, чувствительный к производительности, в этот диапазон адресов и включите его. Если вы работаете без него, он все равно превосходит AXIM. Если флэш-память достаточно велика, любой код, который не помещается в ITCM, должен быть в диапазоне 0x08000000 и pic или создан для этого пространства. - person old_timer; 03.02.2020

Я ДУМАЮ, что вопрос намного проще, чем предполагают другие ответы.

Если вы думаете о таких вещах, как размещение вашей программы в другом месте, а не просто во flash: не делайте этого. Как говорит ST: с ART производительность будет очень близка к «нулевому состоянию ожидания». Так что не беспокойтесь об этом. Все, что вы пытаетесь сделать, не будет быстрее этого.

person rew    schedule 27.05.2020

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

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

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

[УПД2. Извините, на частоте 216 МГц требуется не более 9 состояний ожидания. ]

В. Какая шина предпочтительнее для доступа к флэш-коду, AXI или ITCM?

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

person A.K.    schedule 03.02.2020