Выбор между двойным буфером и кольцевым буфером? - PullRequest
0 голосов
/ 12 февраля 2019

У меня проблема с декодированием пакета, который отправляется через UART микроконтроллера (прошивка должна быть не металлической, без поддержки RTOS).Пакет имеет длину 32 байта и отправляется каждые 10 миллисекунд (непрерывно, без остановки).

Мне нужно выполнить минимальную обработку в ISR (чтобы ISR был достаточно коротким) и выполнить отложенную обработку в цикле main ().На мой взгляд, есть два подхода: 1. Использовать безопасный для прерывания кольцевой буфер с ISR-записью в буфер и чтением из него цикла main ().Предполагается, что указатель head и tail является атомарным типом моей архитектуры, чтобы гарантировать, что буфер безопасен от прерываний.Смотрите пример реализации здесь .

Используйте схему двойной буферизации (пинг-понг), в которой цикл main () должен обрабатывать один из буферов, пока ISR записывает в другой.Предположим, что я могу атомарно изменить указатель на буфер ISR, чтобы избежать проблемы критической секции.

UART способен генерировать непустое прерывание RIF FIFO.Также доступна поддержка DMA.

  1. Какая оптимальная структура данных для использования здесь?
  2. Какая здесь компромиссная комбинация?

1 Ответ

0 голосов
/ 12 февраля 2019

Двойной буфер - это просто особый вид кольцевого буфера с двумя слотами, которыми обмениваются производитель и потребитель.Если время обработки не сильно отличается, этого должно быть достаточно.Кольцевой буфер может быть полезен, если скорость ввода или время обработки изменяются, но тогда вам, скорее всего, потребуется некоторый контроль потока, чтобы замедлить скорость ввода, когда обработка не может идти в ногу.

...