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

TCM — память, тесно связанная с ядром

Кэш ускоряет доступ в среднем, но не гарантирует его: промах — и ядро ждёт память. Для кода и данных, которым нужна предсказуемая скорость, у Cortex-M7 есть TCM — ОЗУ, подключённое прямо к ядру и работающее на его частоте. У STM32F7 и STM32H7 это ITCM-RAM и DTCM-RAM.

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

TCM (tightly coupled memory, память, тесно связанная с ядром) — ОЗУ, подключённое к ядру Cortex-M7 через отдельные интерфейсы, а не через кэш и общую шину. Их два: ITCM для команд и DTCM для данных. По TRM Arm интерфейсы TCM рассчитаны на SRAM с минимумом связующей логики и оптимизированы под малую задержку.

Как устроена

ПараметрITCMDTCM
Интерфейсодин 64-битныйдва 32-битных, D0TCM и D1TCM, выбор по биту 2 адреса
Базовый адрес0x000000000x20000000
Размер (выбирает производитель)0 или 4 КБ – 16 МБ степенями двойки0 или 4 КБ – 16 МБ, поровну на два интерфейса
Типичное содержимоекритичный по времени код, обработчики прерыванийстек, часто используемые данные

Обращения к TCM идут мимо кэша, поэтому скорость предсказуема и нет вопросов когерентности. Размер реализованной TCM программа читает из полей SZ регистров CM7_ITCMCR и CM7_DTCMCR; бит EN включает TCM, а при выключенной все обращения уходят на шину AXIM. Arm рекомендует код в ITCM, данные в DTCM, но запрета на обратное нет.

TCM рассчитана на Normal-память: ядро может делать спекулятивные чтения, поэтому подключать к ней FIFO и другие устройства с побочными эффектами чтения нельзя. Если TCM защищена ECC, её нужно инициализировать при загрузке, иначе спекулятивное чтение нетронутой ячейки вызовет ошибку ECC.

В STM32F7 и STM32H7

По RM0385 у STM32F74x/75x флеш-память видна по двум адресам: на шине AXIM с 0x0800 0000 и через интерфейс ITCM с 0x0020 0000. DTCM-RAM расположена с 0x2000 0000 — начало SRAM на карте памяти Cortex-M. DMA обращается к TCM через порт AHBS ядра, но какие именно контроллеры туда подключены, зависит от семейства. У STM32F7 в AN4839 ST есть пример копирования DMA из SRAM1 в DTCM. У STM32H742/743/750, по табл. 3 RM0433, к ITCM и DTCM из ведущих шин имеет доступ только MDMA через AHBS, а DMA1, DMA2 и BDMA — нет: буферы для них размещают в AXI-SRAM или SRAM1–SRAM3. Объёмы ITCM и DTCM по линейкам — на страницах STM32F7 и STM32H7, а размещение кода и данных в TCM задаёт скрипт компоновщика.

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

Чем TCM отличается от кэша?

Кэш автоматически хранит копии недавно использованных данных из любой кэшируемой памяти и может промахнуться. TCM — обычное ОЗУ с фиксированными адресами, подключённое к ядру напрямую: что программист туда положил, то и читается с малой задержкой, без промахов. Доступы к TCM в Cortex-M7 вообще идут мимо кэша, поэтому для данных в DTCM не нужно обслуживание кэша.

Как разместить функцию или буфер в ITCM и DTCM?

Через скрипт компоновщика: описать области памяти ITCM и DTCM и секции для них, а в коде пометить функции и переменные атрибутом section. Код для ITCM хранится во флеш-памяти и копируется в ITCM стартовым кодом, как секция .data. Стек и часто используемые данные обычно кладут в DTCM.

Может ли DMA работать с DTCM?

Только тот, что подключён к порту AHBS ядра: по TRM Arm этот порт и служит для DMA-доступа к TCM. У STM32F7 в AN4839 ST есть пример, где DMA копирует данные из SRAM1 в DTCM RAM. У STM32H743 и родственных линеек, по RM0433, к ITCM и DTCM через AHBS обращается только MDMA, а DMA1, DMA2 и BDMA доступа не имеют. Для других линеек смотрят таблицу связей ведущих и ведомых шин в reference manual.

Источники

  1. Arm. Cortex-M7 Processor Technical Reference Manual r1p2 (DDI 0489F), разд. «About the Cortex-M7 processor», «Configuration options», «TCM interfaces», «TCM configuration», «TCM read modify write», «Instruction and Data Tightly-Coupled Memory Control Registers» — ITCM — один 64-битный интерфейс, DTCM — два 32-битных D0TCM и D1TCM, выбор по биту 2 адреса; интерфейсы для SRAM с минимумом логики, оптимизированы под малую задержку; рассчитаны на Normal-память — возможны спекулятивные чтения, поэтому не годятся для FIFO; лучше всего код в ITCM, данные в DTCM, но ограничений нет; базовые адреса фиксированы: ITCM 0x00000000, DTCM 0x20000000; размер — от 4 КБ до 16 МБ степенями двойки, задаётся при интеграции; DTCM делится пополам между D0TCM и D1TCM; обращения выше реализованного объёма идут на AXIM; CM7_ITCMCR и CM7_DTCMCR: SZ [6:3] — размер, RETEN, RMW, EN — при выключенной TCM все доступы идут на AXIM; RMW нужен при ECC в TCM, тогда TCM инициализируют при загрузке; интерфейс AHBS даёт DMA доступ к TCM; доступ к TCM идёт мимо кэша
  2. STMicroelectronics. RM0385 Reference manual STM32F75xxx and STM32F74xxx, Rev 9, разд. 3.3.1, табл. 3 — флеш-память доступна по двум адресам: на интерфейсе AXIM с 0x0800 0000 и на интерфейсе ITCM с 0x0020 0000; системная память — 0x1FF0 0000 на AXIM и 0x0010 0000 на ITCM
  3. STMicroelectronics. AN4839 Level 1 cache on STM32F7 Series and STM32H7 Series, Rev 2 (March 2018) — рис. 1: у STM32F7 ITCM и DTCM RAM подключены к ядру отдельными шинами, DTCM доступна шинной матрице через порт AHBS ядра; разд. 3.2: в примере DMA копирует данные из SRAM1 в DTCM RAM
  4. STMicroelectronics. RM0433 Reference manual STM32H742, STM32H743/753 and STM32H750 Value line, Rev 9, разд. 2.1, табл. 3, рис. 1 — табл. 3: к ITCM и DTCM из ведущих имеют доступ только ядро (шины ITCM и DTCM) и MDMA через AHBS, у DMA1, DMA2, BDMA, DMA2D, LTDC, SDMMC, Ethernet и USB доступа нет; разд. 2.1.2: DTCM и ITCM подключены к Cortex-M7 отдельными TCM-шинами, MDMA обращается к ним через AHBS — ведомый AHB-порт ядра; ITCM работает на частоте ядра без тактов ожидания; разд. 2.1.5: AXIM (64 бит) — доступ ко всей памяти, кроме ITCM и DTCM, и к периферии AHB3, AHB4, APB3, APB4; DTCM — шина 2 × 32 бит; AHBS (32 бит) — только для MDMA

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