У меня есть один производитель, проблема с одним потребителем, которую (я считаю) можно решить с помощью кольцевого / кольцевого буфера.
У меня есть микроконтроллер, работающий в ОСРВ с ISR (подпрограмма обработки прерываний), обрабатывающая прерывания UART (последовательный порт). Когда UART вызывает прерывание, ISR помещает полученные символы в кольцевой буфер. В другой задаче RTOS (называемой package_handler) я читаю из этого кольцевого буфера и запускаю конечный автомат для декодирования пакета. Допустимый пакет имеет 64 байта, включая все байты кадрирования.
UART работает в 115200, и пакет приходит каждые 10 мс. Package_handler запускается каждые 10 мс. Однако этот обработчик может иногда задерживаться планировщиком из-за выполнения другой задачи с более высоким приоритетом.
Если я использую произвольно большой круговой буфер, отбрасывание пакетов не происходит. Но как определить оптимальный размер циклического буфера в этом случае? По крайней мере, теоретически. Как это решение о размере буфера принимается на практике?
В настоящее время я обнаруживаю переполнение буфера с помощью некоторых инструментальных функций, а затем увеличиваю размер буфера, чтобы уменьшить потерю пакетов.