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

Буфер записи 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 не задерживаются в буфере.

Источники

  1. 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 и когда он полон
  2. Arm. Armv7-M Architecture Reference Manual (DDI 0403E.e), разд. A3.5.5 «Device memory» — записи в Device-память можно буферизовать, но слияние допустимо только с сохранением числа, порядка и размера обращений; если операция с Device-памятью имеет побочные эффекты для Normal-памяти, программа должна использовать барьер памяти

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