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

Буфер предвыборки (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, проверка, затем смена частоты.

Источники

  1. 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
  2. STMicroelectronics. RM0377: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs. Reference manual, Rev 10 — разд. 3.3.3: PRFTEN включает предвыборку — упреждающее чтение по последнему адресу выборки плюс 4 (одно слово), когда мастера ничего не читают; чтение низкоприоритетное и прерывается запросом к другому адресу; один из буферов переводится под предвыборку; предвыборка повышает быстродействие только при одном такте ожидания
  3. 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
  4. 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

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