fix(ir-dma): __DSB() barriers before DMA arm and after circular refill (#8)

Перестраховка корректности (на M4F без D-кэша обычно не обязательно): завершить запись dmaBuf/BSRR до HAL_DMA_Start_IT и refill полубуфера до прохода циркулярного DMA.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-30 14:12:28 +03:00
parent 55935b8b92
commit e5ed029cfd

View File

@ -209,11 +209,13 @@ private:
void onHalf() { void onHalf() {
ticksOutput += halfLen; ticksOutput += halfLen;
fill(&dmaBuf[0], halfLen); fill(&dmaBuf[0], halfLen);
__DSB(); // Fix #8: refill первой половины виден DMA до следующего прохода кольца
} }
void onComplete() { void onComplete() {
ticksOutput += halfLen; ticksOutput += halfLen;
fill(&dmaBuf[halfLen], halfLen); fill(&dmaBuf[halfLen], halfLen);
__DSB(); // Fix #8: refill второй половины виден DMA до следующего прохода кольца
} }
void onError() {} void onError() {}
@ -378,6 +380,7 @@ private:
s.lastProgressMs = millis(); s.lastProgressMs = millis();
s.active = true; s.active = true;
__DSB(); // Fix #8: завершить запись dmaBuf (fill) и BSRR до арминга DMA
const uint32_t dst = u32ptr(&s.port->BSRR); 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) { if (HAL_DMA_Start_IT(&s.hdma, (uint32_t)(uintptr_t)s.dmaBuf, dst, s.bufLen) != HAL_OK) {
s.active = false; s.active = false;