Почему FIFO прерывания на одну четверть, на половину, на три четверти предоставляются в UART RX FIFO?Каковы их варианты использования? - PullRequest
0 голосов
/ 11 февраля 2019

Я реализую декодер протокола, который получает байты через UART микроконтроллера.ISR берет байты от периферийного устройства UART и помещает его в кольцевой буфер.Основной цикл читает из кольцевого буфера и запускает конечный автомат для его декодирования.

UART имеет 32-байтовый приемный FIFO и обеспечивает прерывания, когда этот FIFO заполнен на четверть, наполовину, на три четверти и полностью.Как мне определить, какое из этих прерываний должно активировать мой ISR?В чем заключается компромисс?

Примечание. Протокол включает 32-байтовые пакеты (фиксированная длина), отправляемые каждые 10 мс.

Ответы [ 2 ]

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

Это зависит от многих вещей, в первую очередь от максимальной поддерживаемой скорости передачи данных и от того, сколько времени требуется приложению для выполнения других задач.

Традиционные кольцевые буферы работают на основе байтовых прерываний.Но, конечно, всегда приятно уменьшать количество прерываний.Вероятно, не имеет значения, как часто вы позволяете этому срабатывать.

Гораздо важнее реализовать схему двойного буфера.Конечно, вы должны , а не запускать декодирование конечного автомата прямо из одного кольцевого буфера.Это превратится в кошмар состояния гонки.

Ваша основная программа должна ударить семафор / отключить прерывание UART, затем скопировать весь буфер, а затем разрешить прерывание.В идеале буферное копирование выполняется путем изменения указателя, а не распечатки.Код, выполняющий это, должен быть протестирован, чтобы он работал быстрее 1 / бод * 10 секунд.Где 10: 1 начало, 8 данных, 1 остановка, при условии, что UART равен 8-N-1.

Если доступно, используйте DMA поверх программных кольцевых буферов.

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

Учитывая протокол на основе пакетов и UART, который прерывается, когда получено более одного байта, подумайте, что произойдет, если будет получен последний байт пакета, но этого последнего байта недостаточно, чтобы заполнить FIFO после порогаи вызвать прерывание.Ваше приложение просто не собирается получать этот неполный пакет, пока какой-нибудь последующий пакет не будет получен и FIFO наконец не заполнится достаточно?Что, если другой конец ожидает ответа и никогда не отправляет другой пакет?Или ваше приложение должно опрашивать UART для проверки оставшихся байтов, оставшихся в UART FIFO?Это кажется слишком сложным - использовать прерывание и опрос для полученных байтов.

С реализованными мною пакетными протоколами драйвер UART не полагается на UIF FIFO и настраивает UART на прерывание, когда одинБайт доступен.Таким образом, драйвер получает уведомление для каждого байта, и не остается шанса, что последний байт пакета останется в FIFO UART.

FIFO UART может быть удобен для потоковых протоколов (таких как аудио иливидео данные).Когда драйвер получает поток данных, всегда будут входящие данные, чтобы продолжать заполнять FIFO.Драйвер может полагаться на FIFO UART для буферизации некоторых данных.Драйвер может быть более эффективным, обрабатывая несколько байтов на прерывание и уменьшая частоту прерываний.

Вы можете рассмотреть возможность использования UART FIFO, поскольку ваши пакеты имеют фиксированную длину.Но подумайте, как драйвер восстановится, если один байт будет сброшен из-за шума или чего-то еще.Я думаю, что все же лучше не полагаться на FIFO для пакетных протоколов, независимо от того, являются ли пакеты фиксированной длины.

...