Модуль на базе китайского процессора Allwinner A40i по функциональным возможностям и интерфейсу очень близок к ранее выпущенному на базе imx6; он дешевле и меньше по габаритам, т. е. представляет альтернативный выбор и может служить хорошей заменой. К сожалению, далеко не всегда.
В нашем случае используются непревзойденные по простоте и удобству каналы UART; модуль посылает короткие команды и получает в ответ блоки данных размером чуть больше 2 Кбайт. Из-за жестких ограничений по времени устанавливается максимальная скорость - 5 МБод. Китайский модуль при соответствующей конфигурации поддерживает эту скорость, но, оказалось, что прямой доступ к памяти не работает, поэтому, несмотря на наличие довольно большого - 64 байта - буфера FIFO, при приеме он неизбежно переполняется, т. е. данные теряются. Пришлось изменить программу и пересылать данные короткими блоками, не превосходящими размер FIFO (таких блоков оказалось 34); это помогло, но не сильно. В любом случае каждая пересылка требует изменения направления транзакции для синхронизации обмена; при этом наблюдается огромная задержка передачи в модуле: от момента вызова функции write() до фактического начала передачи проходит не менее 100 мксек, в то время как пересылка 64 байтов занимает 128 мксек, т. е. пропускная способность канала используется едва на 60%. Но это еще не все: в полудуплексном режиме сигнал переключения буфера RS-485 на прием по окончании передачи команды запаздывает примерно на те же 100 мксек (у модуля на imx6 - не более 15 мксек), т. е. от пропускной способности остается 30%. И если задержка передачи команды модулем проявляется в среднем, то абонент, пересылающий данные модулю, должен держать паузу по максимально возможной задержке переключения. Такие задержки, по-видимому, обусловлены механизмом низкоприоритетных прерываний от UART.
Таким образом, каналы UART модуля на Allwinner A40i имеют неприемлемо низкую пропускную способность, причина которой не в привязанности китайских разработчиков к архаичной 8-битовой архитектуре UART, а в отсутствии нормальной системной поддержки. Нужно либо подключить прямой доступ при приеме данных каналами UART, либо на порядок уменьшить латентность обслуживания прерываний от UART. Первый вариант значительно лучше, т. к. при длинных блоках делает задержки обслуживания несущественными и не требует переделки управляющих программ. Поскольку проблема не связана с аппаратной частью, а лежит исключительно в области программирования, она может быть решена за обозримое время. |