Краткое примечание о дизайне программного обеспечения «UART»: в зависимости от требований можно использовать как минимум качественно разные подходы:
Драйвер бита взрыва «перехватит все» отключит все прерывания и использует код с циклическим счетом для синхронизации каждого бита. Для получения данных с помощью драйвера «перехватить все» требуется, чтобы при получении данных контроллер не делал ничего, кроме как ожидал его.
Драйвер бита взрыва «перехватить основной цикл» будет вести себя почти так же, как и выше, за исключением того, что он будет использовать ресурс таймера для битовых таймингов, а не для подсчета циклов. Прерывания, которые не требуют много времени для обслуживания, могут быть оставлены включенными. Для последовательной передачи ресурс таймера с фиксированной скоростью может использоваться совместно с другими целями; однако для последовательного приема драйвер сдвоенного взрыва должен иметь возможность перезагружать таймер при поступлении начального бита, чтобы истечь его в середине каждого входящего битового времени.
Драйвер полного прерывания, управляемый прерываниями, использует таймер с фиксированной скоростью, который работает с некоторой кратностью скорости передачи данных, предпочтительно (3x и 5x лучше, чем 4x), и делает все через этот таймер. Такой драйвер может работать одновременно со всем остальным, но потребует более быстрого процессора, чем требовалось для драйверов предыдущих типов.
Чтобы не допустить, чтобы первые два стиля контроллера ожидали данные, которые могут никогда не прийти, всегда, в подпрограммах чтения обычно указывается значение времени ожидания. Обратите внимание, что если цикл контроллера, например, «получает байт, ожидая его до 100 мсек, делает другие вещи, если ничего не пришло, затем получает следующий байт и т. Д.» и байт прибывает между временем ожидания процедуры get и контроллер снова начинает ждать, этот байт будет потерян; устройство, с которым оно связывается, должно ожидать такую возможность.
Только третий стиль драйвера сможет справиться с возможностью начала поступления байта данных во время передачи байта данных. Однако первые два стиля могут использоваться для некоторых полнодуплексных протоколов связи с полной скоростью, если контроллер говорит только тогда, когда с ним разговаривают. Хитрость заключается в том, чтобы иметь подпрограмму «чтение и запись данных», которая будет ожидать входящий стартовый бит, и когда он обнаружен, перекрываются операции чтения и записи, так что контроллер отправляет каждый бит, как только собирается проверить входящие данные. Как только контроллер обнаружит входящий стартовый бит, он будет точно знать, когда ему нужно искать следующие 8 битов данных и стоповый бит, и, таким образом, будет знать, что он может безопасно использовать время между для вывода своих собственных данных.
Одно прощальное примечание: контроллер, который использует один из первых двух стилей битового взрыва uart для получения данных, должен обрабатывать каждый байт данных до того, как спадет начальный бит следующего байта, чтобы избежать потери данных. Если контроллер знает, что обработка займет, по крайней мере, половину бита, он может максимизировать время, доступное для обработки, принимая каждый байт, как только он захватит последний бит данных, а не ожидая стоп-бита. Однако в качестве дополнительного средства предоставления контроллеру большего количества времени может оказаться полезным, чтобы устройство, передающее ему данные, передавало два стоповых бита, а не один. Если можно настроить «отметку четности», это добавит еще один дополнительный бит времени. Передача, например, в 115200-8-M-2, обеспечит большее время обработки, чем 57600-8-N-1, даже несмотря на то, что он будет передавать данные более чем в 1,6 раза быстрее.