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 бит, замещение LRU | ICEN |
| Кэш данных (литералы) | 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). Наш вывод: большие таблицы в него не помещаются, поэтому для скорости их копируют в ОЗУ.
Источники
- 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; данные пользовательского сектора конфигурации не кэшируются
- 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
Нашли ошибку?
Смотрите также
- Такт ожиданияЛишние такты при обращении к медленной памяти: частоты, настройка, кэш
- Такты ожидания флеш-памяти STM32LATENCY в FLASH_ACR по частоте и питанию, таблица и код
- STM32F4Cortex-M4 с FPU: от F401 и F411 до F429 и F469 — линейки и распиновки
- Конвейер командPipeline: выборка следующей команды во время исполнения
- XIP (execute in place)Выполнение кода из внешней флеш через кэш: устройство, кэш, скорость