Перейти к содержанию

ART Accelerator — ускоритель флеш-памяти STM32

Флеш-память STM32F4 не успевает за ядром на 168 МГц: при чтении нужны такты ожидания. Чтобы программа всё же шла почти на полной скорости, ST поставила между флеш-памятью и ядром ускоритель с предвыборкой и кэшем — ART Accelerator.

Обновлено Редакция GAW

ART Accelerator (adaptive real-time memory accelerator) — блок между флеш-памятью и ядром Cortex-M4 в STM32F4, который скрывает такты ожидания флеш-памяти. Он читает флеш-память строками по 128 бит, заранее выбирает следующую строку и держит недавно использованные строки в кэше. По данным ST, на тесте CoreMark это даёт производительность, равную выполнению из флеш-памяти без тактов ожидания, при частоте до 180 МГц (RM0090, разд. 3.5.2).

Из чего состоит

ЧастьОбъёмБит FLASH_ACR
Предвыборка командследующая 128-битная строкаPRFTEN
Кэш команд64 строки по 128 бит, замещение LRUICEN
Кэш данных (литералы)8 строк по 128 битDCEN

Одна строка — это четыре 32-битные или восемь 16-битных команд Thumb. В последовательном коде ядро тратит на строку не меньше четырёх тактов, а за это время предвыборка успевает прочитать следующую — поэтому ожидание не видно. Предвыборка полезна, когда нужен хотя бы один такт ожидания.

Где он не помогает

  • Переходы. Если адрес перехода не попал ни в текущую строку, ни в строку предвыборки, ни в кэш, штраф — не меньше числа тактов ожидания. Кэш команд нужен как раз для циклов, где одни и те же строки читаются много раз.
  • Константы. Литералы читаются по шине D-Code в момент исполнения; у кэша данных только 8 строк.
  • Сектор конфигурации. Данные пользовательского сектора конфигурации, по RM0090, не кэшируются.

Сами такты ожидания по-прежнему задают в поле LATENCY по частоте и напряжению — их подбирает калькулятор тактов ожидания флеш STM32. Как предвыборка соотносится с конвейером команд ядра, видно по рисунку 5 RM0090: без неё каждая новая строка добавляет ожидание, с ней — только переходы.

В других сериях

Ускоритель ART есть не только у STM32F4: о нём говорится, например, на страницах STM32F2 и STM32G4. Объёмы кэшей и предельная частота выше приведены только для STM32F4 по RM0090; для других серий их смотрят в справочном руководстве серии.

Не путать

С Chrom-ART Accelerator (DMA2D) — графическим контроллером DMA у STM32F42x/43x; с флеш-памятью и кэшем он не связан. Остальная память STM32F4 описана на странице STM32F4.

Частые вопросы

Нужно ли включать ART Accelerator вручную?

Да, кэши и предвыборку включают биты ICEN, DCEN и PRFTEN в регистре FLASH_ACR (RM0090, разд. 3.5.2). В HAL для STM32F4 для этого есть макросы __HAL_FLASH_INSTRUCTION_CACHE_ENABLE, __HAL_FLASH_DATA_CACHE_ENABLE и __HAL_FLASH_PREFETCH_BUFFER_ENABLE (stm32f4xx_hal_flash.h); при работе с регистрами напрямую биты ставят сами вместе с числом тактов ожидания LATENCY.

Значит ли это, что такты ожидания флеш-памяти можно не ставить?

Нет. Число тактов ожидания по частоте и напряжению питания всё равно задают в поле LATENCY: ускоритель лишь скрывает их при последовательном коде и в циклах. При переходе на адрес, которого нет ни в строке предвыборки, ни в кэше, штраф не меньше числа тактов ожидания (RM0090, разд. 3.5.2). Число тактов подбирает калькулятор тактов ожидания флеш STM32.

Почему код с таблицами констант работает медленнее, чем ожидалось?

Литералы и таблицы читаются по шине D-Code во время исполнения, и конвейер стоит, пока данные не придут. Для частых литералов ST предусмотрела кэш данных — всего 8 строк по 128 бит (бит DCEN). Наш вывод: большие таблицы в него не помещаются, поэтому для скорости их копируют в ОЗУ.

Источники

  1. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — разд. 3.5.2 — ART Accelerator: очередь предвыборки и кэш ветвлений для флеш-памяти шириной 128 бит; по CoreMark производительность равна выполнению из флеш-памяти без тактов ожидания до 180 МГц; строка 128 бит — четыре 32-битные или восемь 16-битных команд; предвыборка — бит PRFTEN в FLASH_ACR, полезна при хотя бы одном такте ожидания; при переходе (промахе) штраф не меньше числа тактов ожидания; кэш команд — 64 строки по 128 бит, бит ICEN, замещение LRU; кэш данных для литералов — 8 строк по 128 бит, бит DCEN; данные пользовательского сектора конфигурации не кэшируются
  2. STMicroelectronics. STM32CubeF4 HAL driver (commit 1f6451c), stm32f4xx_hal_flash.h — макросы __HAL_FLASH_PREFETCH_BUFFER_ENABLE, __HAL_FLASH_INSTRUCTION_CACHE_ENABLE, __HAL_FLASH_DATA_CACHE_ENABLE — установка PRFTEN, ICEN и DCEN

Нашли ошибку?