Буфер предвыборки (prefetch) флеш-памяти
Флеш-память медленнее ядра, и на высокой частоте каждое чтение стоит тактов ожидания. Чтобы линейный код не тормозил, контроллер флеш-памяти заранее читает следующую порцию команд — это предвыборка, которую включают битом PRFTEN.
Обновлено Редакция GAW
Буфер предвыборки (prefetch buffer) флеш-памяти — механизм, при котором контроллер флеш-памяти читает следующую по порядку строку команд, пока ядро выполняет текущую. Если код линейный, к моменту, когда ядру понадобятся следующие команды, они уже прочитаны, и такты ожидания не видны. В STM32 предвыборку включают битом PRFTEN регистра FLASH_ACR (у STM32F1 бит называется PRFTBE).
Как это работает в разных семействах
| Семейство | Ширина чтения | Особенности по RM |
|---|---|---|
| STM32L1 (RM0038) | 64 бита — 2 или 4 команды | PRFTEN только при 64-битном доступе ACC64 = 1 |
| STM32L0 (RM0377) | слово, предвыборка на адрес + 4 | один из четырёх буферов отдаётся под предвыборку |
| STM32F7 (RM0385) | 256 бит — 8–16 команд | предвыборка на шине ITCM, рядом ART Accelerator |
Общее правило из всех трёх руководств: предвыборка полезна, только если нужен хотя бы один такт ожидания. У STM32L0 она повышает быстродействие лишь при одном такте; у STM32L1 после сброса стоит 0 тактов, 32-битный доступ и выключенная предвыборка.
Ограничения
- Ветвления. При переходе команды нет ни в текущей, ни в упреждённой строке, и штраф не меньше числа тактов ожидания (RM0038, RM0385). Циклам помогает кэш, а не предвыборка.
- Потребление. 32-битный доступ STM32L1 экономит энергию, но работает только с 0 тактов ожидания и без предвыборки.
- Порядок настройки. У STM32L1 ACC64 нельзя менять одновременно с LATENCY и PRFTEN; ST приводит порядок: ACC64, затем LATENCY, затем частота.
Число тактов зависит от частоты и напряжения ядра — его считают в калькуляторе задержки флеш-памяти.
Частые вопросы
Когда включать предвыборку флеш-памяти?
Когда флеш-памяти нужен хотя бы один такт ожидания: так пишут RM0038 и RM0385. На низкой частоте без тактов ожидания она не ускоряет код, а у STM32L1 в 32-битном режиме доступа её и включить нельзя — PRFTEN допустим только при ACC64 = 1.
Почему предвыборка не помогает на ветвлениях?
Она читает следующий по порядку блок. Если программа переходит в другое место, нужной команды нет ни в текущей, ни в упреждённой строке, и ядро ждёт полное чтение: по RM0038 и RM0385 штраф не меньше числа тактов ожидания. Для циклов и переходов в STM32F7 есть кэш ART Accelerator.
Почему у STM32L1 не включается PRFTEN?
Потому что сначала нужно включить 64-битный доступ ACC64: по RM0038 предвыборку можно разрешить только при ACC64 = 1, и ACC64 нельзя записывать одновременно с LATENCY и PRFTEN. ST рекомендует порядок: ACC64, проверка, LATENCY, проверка, затем смена частоты.
Источники
- STMicroelectronics. RM0038: STM32L100xx, STM32L151xx, STM32L152xx and STM32L162xx advanced Arm-based 32-bit MCUs. Reference manual, Rev 18 — разд. 3.3.1: флеш-память читается по 64 или 32 бита, 64-битный доступ — бит ACC64 в FLASH_ACR; 32-битный доступ экономит энергию, требует 0 тактов ожидания и выключенной предвыборки; после сброса — MSI 2 МГц, 0 тактов ожидания, 32-битный доступ, предвыборка выключена; разд. 3.3.2: каждое чтение даёт 64 бита — две 32-битные или четыре 16-битные команды, на выполнение строки нужно не меньше 2 тактов; предвыборка по шине I-Code читает следующую строку, пока ядро запрашивает текущую; включается битом PRFTEN, полезна, если нужен хотя бы один такт ожидания; при ветвлении команды может не оказаться ни в текущей, ни в упреждённой строке — штраф не меньше числа тактов ожидания; табл. 14 — PRFTEN = 1 допустим только при ACC64 = 1
- STMicroelectronics. RM0377: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs. Reference manual, Rev 10 — разд. 3.3.3: PRFTEN включает предвыборку — упреждающее чтение по последнему адресу выборки плюс 4 (одно слово), когда мастера ничего не читают; чтение низкоприоритетное и прерывается запросом к другому адресу; один из буферов переводится под предвыборку; предвыборка повышает быстродействие только при одном такте ожидания
- STMicroelectronics. RM0385: STM32F75xxx and STM32F74xxx advanced Arm-based 32-bit MCUs. Reference manual, Rev 9 — разд. 3.3.2, Instruction prefetch: каждое чтение флеш-памяти даёт 256 бит — от 8 32-битных до 16 16-битных команд, на линейный код уходит не меньше 8 тактов; предвыборка на шине ITCM читает следующую строку, пока ядро запрашивает текущую; бит PRFTEN в FLASH_ACR; полезна при хотя бы одном такте ожидания; при промахе штраф не меньше числа тактов ожидания; рядом — ART Accelerator
- STMicroelectronics. CMSIS device header stm32f103xb.h, cmsis-device-f1 (GitHub, Apache-2.0) — FLASH_ACR_PRFTBE — Prefetch Buffer Enable, FLASH_ACR_PRFTBS — Prefetch Buffer Status
Нашли ошибку?
Смотрите также
- Такт ожиданияЛишние такты при обращении к медленной памяти: частоты, настройка, кэш
- ART Accelerator (кэш флеш STM32)Предвыборка и кэш, скрывающие такты ожидания флеш-памяти
- Такты ожидания флеш-памяти STM32LATENCY в FLASH_ACR по частоте и питанию, таблица и код
- Масштабирование напряжения ядра (VOS)Выбор напряжения ядра стабилизатором STM32 под нужную частоту
- STM32L1Cortex-M3, до 32 МГц, малое потребление: L100, L151, L152 и L162 с ЖКИ и AES — линейки и распиновки
- STM32F7Cortex-M7 до 216 МГц: F72x/F73x, F74x/F75x, F76x/F77x — линейки, память, загрузка и распиновки
- Конвейер командPipeline: выборка следующей команды во время исполнения