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

Кэш L1 Cortex-M7

Флеш-память и внешняя SDRAM не успевают за ядром на сотнях мегагерц. Cortex-M7 держит рядом с собой небольшие быстрые копии недавно использованных команд и данных — кэши первого уровня. В STM32F7 и STM32H7 они есть, но после сброса выключены.

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

Кэш L1 Cortex-M7 — встроенные в ядро Cortex-M7 кэш команд (I-cache) и кэш данных (D-cache): небольшая быстрая память, хранящая копии недавно использованных строк из медленной памяти, подключённой к шине AXIM. Они раздельные, гарвардские: команды и данные кэшируются независимо. По TRM Arm кэши необязательны, а размер каждого производитель выбирает из 4, 8, 16, 32 или 64 КБ.

Устройство

ПараметрКэш командКэш данных
Ассоциативность2 канала4 канала
Длина строки32 байта (8 слов)32 байта (8 слов)
Выделение строкипри промахе чтенияпри промахе чтения; при записи — в Write-Allocate памяти
Операции обслуживанияаннулировать всё, по адресуаннулировать, очистить, очистить и аннулировать — по адресу или по set/way

Строка заполняется через интерфейс AXIM: сначала приходит нужное слово, и ядро продолжает работу, не дожидаясь остальных — «критическое слово первым». Политику записи — сквозную или отложенную — определяют атрибуты области памяти.

Что кэшируется

Через кэш идут только обращения не к TCM и не к периферийной шине AHBP. Кэшируется Normal-память с атрибутом cacheable; Device и Strongly-ordered — нет. ST в AN4839 подчёркивает, что выигрыш больше всего у памяти на AXI: внешней SDRAM на FMC и Quad-SPI-флеш. Для внутренней флеш-памяти STM32F7 у ST есть ещё свой ART Accelerator.

STM32F7 и STM32H7

По AN4839 у этих семейств до 16 КБ кэша команд и до 16 КБ кэша данных. После сброса кэши выключены, их включают функциями CMSIS SCB_EnableICache() и SCB_EnableDCache(). Включить кэш команд почти всегда безопасно, а кэш данных требует внимания к DMA: контроллер DMA пишет в память мимо кэша, и ядро может прочитать устаревшую копию — подробности в статье о когерентности кэша. Обзор памяти семейств — на страницах STM32F7 и STM32H7.

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

Как включить кэш на STM32H7 или STM32F7?

Вызвать в начале программы SCB_EnableICache() и SCB_EnableDCache() из CMSIS: по таблице AN4839 обе функции сначала аннулируют содержимое, а потом включают кэш. После сброса кэши выключены. Если в программе есть DMA, до включения кэша данных нужно решить вопрос когерентности — настроить MPU или вызывать очистку и аннулирование.

Какого размера кэш у STM32H7?

Arm позволяет производителю выбрать размер каждого кэша от 4 до 64 КБ. ST в AN4839 пишет, что у STM32F7 и STM32H7 до 16 КБ кэша команд и до 16 КБ кэша данных; точные значения для линейки — в её reference manual. Строка у всех Cortex-M7 одна — 32 байта.

Какая память кэшируется у Cortex-M7?

Только Normal-память с атрибутом cacheable. TCM и периферийная шина AHBP идут мимо кэша, Device и Strongly-ordered память не кэшируются. По умолчанию, по TRM, кэшируются только Non-shareable области; атрибуты областей задаёт MPU или стандартная карта памяти.

Источники

  1. Arm. Cortex-M7 Processor Technical Reference Manual r1p2 (DDI 0489F, 15 November 2018), разд. «Configuration options» и «L1 caches» — табл. 1.1: кэши команд и данных необязательны, размер каждого — 4, 8, 16, 32 или 64 КБ, выбирается при интеграции; ECC на кэшах — опция; разд. «L1 caches»: любой доступ не к TCM и не к AHBP обслуживает контроллер кэша; кэшируется Non-shared cacheable память при включённом кэше; оба кэша выделяют строку при промахе чтения (Read-Allocate), кэш данных — и при записи в Write-Allocate память; заполнение строки через AXIM с критическим словом первым; кэш данных 4-канальный, команд — 2-канальный, длина строки 32 байта
  2. STMicroelectronics. AN4839 Level 1 cache on STM32F7 Series and STM32H7 Series, Rev 2 (March 2018) — разд. 2: STM32F7 и STM32H7 имеют до 16 КБ кэша L1 для команд и для данных; строки по 32 байта, кэш данных 4-канальный, команд 2-канальный, псевдослучайная замена; наибольший выигрыш — для памяти на AXI: FMC и Quad-SPI; четыре базовые операции — включение, отключение, очистка, аннулирование; табл. 1 — функции CMSIS из core_cm7.h; разд. 3.2: после сброса кэши команд и данных выключены
  3. Arm. CMSIS 5.9.0, CMSIS/Core/Include/cachel1_armv7.h (V1.0.1, 19 April 2021) — __SCB_DCACHE_LINE_SIZE и __SCB_ICACHE_LINE_SIZE = 32U — «Cortex-M7 cache line size is fixed to 32 bytes (8 words)»; функции SCB_EnableICache, SCB_EnableDCache, SCB_InvalidateDCache, SCB_CleanDCache, SCB_CleanInvalidateDCache и варианты _by_Addr

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