mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2026-09-18 19:13:58 +00:00
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:
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user