Кэш 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 или стандартная карта памяти.
Источники
- 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 байта
- 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: после сброса кэши команд и данных выключены
- 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
Нашли ошибку?
Смотрите также
- STM32H7Cortex-M7 от 280 до 600 МГц, двухъядерные H745/H747 — линейки, память, загрузка и распиновки
- STM32F7Cortex-M7 до 216 МГц: F72x/F73x, F74x/F75x, F76x/F77x — линейки, память, загрузка и распиновки
- Когерентность кэша (cache coherency)Согласование кэша ядра с памятью, в которую пишет DMA
- Политика записи кэша (write-through, write-back)Сквозная и отложенная запись кэша данных и выделение строки при записи
- TCM (ITCM, DTCM)ОЗУ на прямых интерфейсах ядра Cortex-M7: предсказуемый доступ без кэша
- ART Accelerator (кэш флеш STM32)Предвыборка и кэш, скрывающие такты ожидания флеш-памяти