Буфер записи Cortex-M7 (store buffer)
Команда записи у Cortex-M7 завершается раньше, чем данные доходят до памяти или регистра периферии: сначала они попадают в буфер записи. Это ускоряет программу, но иногда удивляет — например, когда флаг прерывания «ещё не сброшен» в момент выхода из обработчика.
Обновлено Редакция GAW
Буфер записи (store buffer) — очередь в подсистеме памяти ядра Cortex-M7, где данные записей ждут отправки в кэш или на шину. По TRM Arm в нём четыре записи, каждая — до 64 бит данных и 32-битный адрес. Ядро продолжает выполнять команды, не дожидаясь, пока запись дойдёт до памяти. В буфер попадают все записи со стороны данных, кроме записей в TCM и в периферию на порту AHBP.
Куда направляются записи
- Кэшируемая запись с попаданием — буфер проверяет, есть ли строка в кэше, и сливает в неё данные, когда запись уходит из буфера.
- Non-cacheable, Write-Through, Write-Back без Write-Allocate с промахом — запись выполняется на интерфейсе AXIM.
- Write-Back с Write-Allocate и промахом — запускается заполнение строки, и данные из буфера сливаются с пришедшей строкой. Подробнее о политиках — в статье write-through и write-back.
Слияние
Если предыдущая запись уже заняла позицию буфера, следующие записи в ту же строку кэша могут слиться с ней; несколько позиций с данными одной строки связываются вместе. Это разрешено только для Normal-памяти. Записи в Device и Strongly-ordered память не сливаются — так требует архитектура: для типов памяти периферии число, порядок и размер обращений сохраняются.
Когда буфер опустошается
| Условие | Что уходит |
|---|---|
| все байты позиции записаны, позицию можно слить в буфер заполнения строки, запись в Device или Strongly-ordered | эта позиция |
| Non-cacheable или Write-Through запись слишком долго ждёт слияния | эта позиция |
| чтение из Device или Strongly-ordered памяти | все записи в Device и Strongly-ordered |
| операция обслуживания кэша, DMB, DSB, эксклюзивная запись в Shared-память, буфер полон | весь буфер |
Отсюда практическое правило: если следующее действие программы зависит от того, что запись уже дошла до адресата, — перед ним ставят барьер памяти DSB. Типичные места — после сброса флага прерывания в конце обработчика, перед входом в сон, перед запуском DMA после очистки кэша. Подробнее о ядре Cortex-M7 в STM32 — на странице STM32H7.
Частые вопросы
Почему после записи в регистр периферии иногда ставят DSB?
Потому что команда STR завершается, когда данные попали в буфер записи, а не в регистр. Если следующая инструкция зависит от того, что запись уже дошла — например, выход из обработчика после сброса флага прерывания или переход в сон после настройки, — нужен барьер DSB: по TRM Cortex-M7 инструкции DMB и DSB полностью опустошают буфер записи.
Объединяет ли буфер записи две записи в один регистр периферии?
Нет. Слияние разрешено только для Normal-памяти. Записи в Device и Strongly-ordered память, к которым относятся регистры периферии, не сливаются: число, порядок и размер обращений сохраняются, как требует архитектура Armv7-M.
Через буфер записи идут все записи Cortex-M7?
Все записи со стороны данных, кроме записей в TCM и в периферию на порту AHBP. Записи в кэшируемую память буфер направляет в кэш, остальные — на интерфейс AXIM. Поэтому записи в DTCM и в периферию на AHBP не задерживаются в буфере.
Источники
- Arm. Cortex-M7 Processor Technical Reference Manual r1p2 (DDI 0489F), разд. «Store buffer» и «Memory types and memory system behavior» — буфер хранит данные перед записью в RAM кэша или передачей на AXIM; четыре записи по 64 бита данных и 32-битному адресу; в буфер попадают все записи со стороны данных, кроме TCM и AHBP; слияние записей одной строки — только для Normal-памяти и не для эксклюзивных записей в Shared; записи в Strongly-ordered и Device не сливаются, перед чтением из них буфер опустошается от таких записей; запись в буфере уходит, когда все байты записаны, когда её можно слить в буфер заполнения строки, когда это запись в Device или Strongly-ordered, или когда Non-cacheable/Write-Through запись слишком долго ждёт слияния; полностью буфер опустошается по операции обслуживания кэша, по DMB и DSB, по эксклюзивной записи в Shared и когда он полон
- Arm. Armv7-M Architecture Reference Manual (DDI 0403E.e), разд. A3.5.5 «Device memory» — записи в Device-память можно буферизовать, но слияние допустимо только с сохранением числа, порядка и размера обращений; если операция с Device-памятью имеет побочные эффекты для Normal-памяти, программа должна использовать барьер памяти
Нашли ошибку?
Смотрите также
- Барьер памятиГраница, через которую нельзя переставлять обращения к памяти
- Кэш L1 Cortex-M7 (I-cache, D-cache)Раздельные кэши команд и данных ядра Cortex-M7: строка 32 байта
- Политика записи кэша (write-through, write-back)Сквозная и отложенная запись кэша данных и выделение строки при записи
- Типы памяти Arm (Normal, Device, Strongly-ordered)Normal, Device и Strongly-ordered: как ядро обращается к памяти и периферии
- Шина AXI (AXIM)64-битный главный интерфейс AXI4 ядра Cortex-M7
- STM32H7Cortex-M7 от 280 до 600 МГц, двухъядерные H745/H747 — линейки, память, загрузка и распиновки