From e5ed029cfddc0c6a1ff54e59f213fb78a55aaaa7 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 30 Jun 2026 14:12:28 +0300 Subject: [PATCH] fix(ir-dma): __DSB() barriers before DMA arm and after circular refill (#8) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перестраховка корректности (на M4F без D-кэша обычно не обязательно): завершить запись dmaBuf/BSRR до HAL_DMA_Start_IT и refill полубуфера до прохода циркулярного DMA. Co-Authored-By: Claude Opus 4.8 (1M context) --- IrDmaTxStm32.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/IrDmaTxStm32.h b/IrDmaTxStm32.h index 7fefd2e..2e71fe2 100644 --- a/IrDmaTxStm32.h +++ b/IrDmaTxStm32.h @@ -209,11 +209,13 @@ private: void onHalf() { ticksOutput += halfLen; fill(&dmaBuf[0], halfLen); + __DSB(); // Fix #8: refill первой половины виден DMA до следующего прохода кольца } void onComplete() { ticksOutput += halfLen; fill(&dmaBuf[halfLen], halfLen); + __DSB(); // Fix #8: refill второй половины виден DMA до следующего прохода кольца } void onError() {} @@ -378,6 +380,7 @@ private: s.lastProgressMs = millis(); s.active = true; + __DSB(); // Fix #8: завершить запись dmaBuf (fill) и BSRR до арминга DMA const uint32_t dst = u32ptr(&s.port->BSRR); if (HAL_DMA_Start_IT(&s.hdma, (uint32_t)(uintptr_t)s.dmaBuf, dst, s.bufLen) != HAL_OK) { s.active = false;