Типы памяти Arm: Normal, Device, Strongly-ordered
Для ядра Cortex-M адрес — это не просто номер ячейки. У каждой области есть тип, и от него зависит, можно ли её кэшировать, объединять записи, читать заранее и повторять обращение после прерывания. Ошибка в типе превращает регистр периферии в «память» — и записи начинают теряться или дублироваться.
Обновлено Редакция GAW
Типы памяти Arm — атрибут, который архитектура Armv7-M назначает каждой области адресного пространства и который определяет, как процессор может к ней обращаться. Типов три, и они взаимоисключающие: Normal, Device и Strongly-ordered. У Normal-памяти есть дополнительные атрибуты кэшируемости и shareability, у Device — только shareability: Device-память по Armv7-M ARM никогда не кэшируется.
Чем они различаются
| Свойство | Normal | Device | Strongly-ordered |
|---|---|---|---|
| Типичное содержимое | флеш, ROM, SRAM, DRAM | регистры периферии, FIFO | системная периферия ядра |
| Кэширование | да, если cacheable | нет | нет |
| Слияние записей в буфере | да | нет | нет |
| Спекулятивное чтение | разрешено | запрещено | запрещено |
| Повтор после прерывания | разрешён | нет | нет |
| Порядок относительно программы | может меняться | сохраняется среди Device-обращений | строго по программе |
Armv7-M ARM объясняет разницу побочными эффектами: у периферии и чтение, и запись меняют состояние устройства, поэтому обращения нельзя повторять, а их число, порядок и размер должны совпадать с программой. Когда запись в Device-память влияет на Normal-память — например, при настройке контроллера внешней памяти, — нужен барьер памяти.
Карта по умолчанию
Если MPU выключен, атрибуты задаёт стандартная карта памяти Cortex-M. По таблице AN4839 для STM32F7 и STM32H7: область кода 0x00000000–0x1FFFFFFF и SRAM — Normal, периферия 0x40000000–0x5FFFFFFF — Device, внешняя RAM 0x60000000–0x9FFFFFFF — Normal, внешние устройства 0xA0000000–0xDFFFFFFF — Device, системная шина PPB 0xE0000000–0xE00FFFFF — Strongly-ordered.
Зачем это знать на Cortex-M7
У Cortex-M7 есть кэш, буфер записи и спекулятивная выборка, и тип памяти включает или выключает их. По TRM буфер записи не сливает записи в Device и Strongly-ordered и опустошается перед чтением из них, а TCM рассчитана на Normal-память и не годится для FIFO. Если отобразить периферию на внешней шине FMC как Normal, ядро сможет читать её спекулятивно — поэтому MPU настраивают так, чтобы такие области оставались Device. Политику кэширования Normal-памяти описывает статья о write-through и write-back.
Частые вопросы
Почему регистры периферии должны быть Device, а не Normal?
Потому что обращение к регистру может иметь побочный эффект: чтение FIFO забирает байт, чтение флага его сбрасывает. Для Normal-памяти Arm разрешает повторять обращения, объединять записи и читать заранее. Для Device, по Armv7-M ARM, число, порядок и размер обращений сохраняются, спекулятивные чтения запрещены и кэширования нет.
Чем Device отличается от Strongly-ordered?
Порядком и буферизацией. Записи в Device-память ядро может буферизовать, сохраняя их число, порядок и размер. Strongly-ordered требует, чтобы все обращения строго соответствовали порядку программы; такая память никогда не кэшируется и всегда считается shareable. В карте Cortex-M по умолчанию Strongly-ordered — область системной шины PPB 0xE0000000–0xE00FFFFF с NVIC и SysTick.
Где задаются типы памяти на Cortex-M7?
По умолчанию — стандартной картой памяти: код и SRAM — Normal, периферия — Device, системная область — Strongly-ordered. Блок защиты памяти MPU переопределяет тип и атрибуты кэширования для своих областей; так, например, делают некэшируемым буфер DMA или включают кэширование внешней SDRAM.
Источники
- Arm. Armv7-M Architecture Reference Manual (DDI 0403E.e), разд. A3.5.1 «Memory types», A3.5.4–A3.5.6 — три взаимоисключающих типа: Normal, Device, Strongly-ordered; A3.5.2: атрибут кэшируемости — только у Normal, shareability — у Normal и Device; Normal — флеш, ROM, SRAM, DRAM; периферия, FIFO, регистры контроллеров — Device или Strongly-ordered: и чтение, и запись могут иметь побочные эффекты, обращения нельзя повторять, число, порядок и размер обращений сохраняются; Strongly-ordered — ещё и строгий порядок относительно программы; Device: спекулятивные обращения запрещены, некэшируемая, записи можно буферизовать, но не сливать с изменением числа, порядка или размера; при побочных эффектах на Normal-память нужен барьер; Strongly-ordered не кэшируется и всегда считается shareable
- Arm. Cortex-M7 Processor Technical Reference Manual r1p2 (DDI 0489F), разд. «Memory types and memory system behavior», «Store buffer», «TCM interfaces» — табл. 5.2: Normal Non-shared — кэшируется, слияние, перезапуск; Normal Shared — кэшируется только при CACR.SIWT = 1; Device и Strongly-ordered — не кэшируются, без слияния и перезапуска; буфер записи не сливает записи в Device и Strongly-ordered и опустошается перед чтением из них; TCM рассчитаны на Normal-память и допускают спекулятивные чтения, поэтому не подходят для FIFO
- STMicroelectronics. AN4839 Level 1 cache on STM32F7 Series and STM32H7 Series, Rev 2 (March 2018) — табл. 2 — атрибуты карты по умолчанию при выключенном MPU: 0x00000000–0x1FFFFFFF Code — Normal, Non-shareable, WT; 0x20000000–0x3FFFFFFF SRAM — Normal; 0x40000000–0x5FFFFFFF периферия — Device, Non-shareable; 0x60000000–0x9FFFFFFF внешняя RAM — Normal; 0xA0000000–0xDFFFFFFF внешние устройства — Device; 0xE0000000–0xE00FFFFF PPB — Strongly-ordered
Нашли ошибку?
Смотрите также
- Блок защиты памяти (MPU)Права доступа к областям памяти в Cortex-M
- Карта памяти Cortex-MФиксированные области адресного пространства ядра Cortex-M
- Политика записи кэша (write-through, write-back)Сквозная и отложенная запись кэша данных и выделение строки при записи
- Барьер памятиГраница, через которую нельзя переставлять обращения к памяти
- Кэш L1 Cortex-M7 (I-cache, D-cache)Раздельные кэши команд и данных ядра Cortex-M7: строка 32 байта
- Буфер записи Cortex-M7 (store buffer)Очередь записей между ядром Cortex-M7 и памятью: слияние и опустошение