Цитата(kan35 @ Feb 8 2013, 18:10)

Сброс DMA занимает доли микросекунды.
Т.е. - если скажем сброс занимает 0.1мкс и через UART за сутки у вас проходит скажем 10МБ данных (вполне реальная ситуация - через интерфейс обычного счётчика электроэнергии может проходить и больше), то вероятность потери раз в сутки близка к 100%?
А если скажем у вас работает система сбора данных из ста таких устройств? Будет сто сбоев в сутки?
Но даже если траффик меньше, значит сбои будут происходить реже, что ещё хуже, так как найти причину таких сбоев будет крайне сложно. Лучше было сразу уволить программиста с такими кривыми руками

Цитата(kan35 @ Feb 8 2013, 18:10)

Стек на ДМА в F2/F4 отключаемый (в данном случае он не используется).
Стек в DMA???

Это новость! Всегда считал что в канале DMA может быть FIFO, но никак не LIFO...
Цитата(kan35 @ Feb 8 2013, 18:10)

Для того, чтоб вероятность потери свести к 0 на время сброса DMA нужно переключать прием на прерывание по RX. Однако, для GSM модема с его логикой это не обязательно, пропусков не наблюдается, для GPS тем более проблемы нет. Мы же работаем с реальными устройствами и знаем как они фунциклируют. Говоря о вероятности ошибки, я допускаю, что существует такой девайс которые не сможет работать через этот драйвер.
Выйдет новая прошивка для вашего GSM-модема, или захотите заложить другой модем, потому что старого уже не купить, и в новой прошивке модем станет немножко по другому слать данные в UART (скажем - с небольшими паузами) и где будет ваше ПО?

Цитата(kan35 @ Feb 8 2013, 18:10)

Эта идея не просто замена стека, а возможность дать процессору время для сна. В основном это актуально про использовании ОС. просто аппаратный стек эту задачу вообще никак не решает.
По-моему Вы путаете стек с FIFO - это вообще-то совершенно разные вещи. И как раз стандартное FIFO в UART очень хорошо решает эту проблему, снижая частоту RX-прерываний до 14раз.
Цитата(AHTOXA @ Feb 8 2013, 22:04)

А может быть, потери в таком случае и не случится? Просто в момент включении DMA будет взведён флажок RXNE, и принятый байт из UARTx->DR благополучно отправится в буфер DMA.
Наверное это можно достаточно просто проверить - принять байт, не вычитывая его, и затем включить DMA.
Потеря может быть не в момент
включения, а в момент
сброса DMA. Если, как пишет автор, проверить наличие данных в DMA, потом его сбросить, то если байт пришёл между проверкой и сбросом и не успел записаться в память, то он потеряется. Здесь никогда нельзя делать сброс DMA, можно делать только его запрет с последующим разрешением в новый буфер. И если уж работаем через DMA, то только так - тогда никаких обращений к регистру DR UART программно. Всегда нужно помнить: если у канала DMA есть FIFO, то после запрета канала, там могут остаться данные считанные с периферии но не записанные в память.