Я пытаюсь разработать эффективный протокол связи между микроконтроллером с одной стороны и процессором ARM на многоядерном чипе TI с другой стороны через SPI.
Требования к необходимому протоколу:
1 - Мультисессия с поддержкой очередей, так как у меня есть несколько потоков отправки / получения, поэтому будет более одного приложения, использующего этот протокол связи, и мне нужен протокол для обработки этих запросов в очереди (я буду держать буфер, если передача это очередь, но мне просто нужен протокол для управления планированием очередей).
2 - Работает через SPI в качестве основного протокола.
3 - Простая проверка ошибок.
В этой теме: "Простой последовательный протокол связи точка-точка ", PPP был рекомендуемым вариантом, однако я вижу, что PPP выполняет только часть работы.
Я также нашел проект Lightweight IP (LwIP), в котором используется PPP через последовательный порт (который, как я предполагаю, я могу использовать через SPI), поэтому я подумал о возможности использования любого из протоколов верхнего уровня, такого как TCP / UDP, для выполнения остальной части требуемые рабочие места. К счастью, я обнаружил, что TI включает LwIP как часть своего программного обеспечения Ethernet в стартовом пакете программного обеспечения, которое, как я полагаю, облегчит перенос, по крайней мере, на стороне чипа TI.
Итак, мои вопросы:
1 - Допустимо ли использовать LwIP для этой схемы связи? Не приведет ли это к большим накладным расходам из-за заголовков IP, которые не нужны для связи точка-точка (на уровне микросхемы), и не снизит пропускную способность?
2 - Будет ли TCP или любой аналогичный протокол, находящийся в LwIP, обрабатывать очередь запросов на передачу, например, если я запрашиваю передачу через сокет, в то время как канал связи занят передачей / получением запроса для другого сокета (сеанса) другого потока, будет ли это управляться стеком протоколов? Если да, то какой уровень протокола управляет им?
3. Является ли их стек более эффективным протоколом, чем LwIP, который соответствует указанным выше требованиям?
Обновление 1. Дополнительные моменты для рассмотрения
1 - SPI - единственный доступный вариант, я использую его с доступными GPIO, чтобы указать мастеру, когда у ведомого есть данные для отправки.
2 - Текущий реализованный (нестандартный) протокол использует DMA с SPI и формат сообщения 《STX_MsgID_length_payload_ETX》 с фиксированной длиной фрагментов сообщения, однако основным недостатком текущей схемы является то, что мастер ожидает ответа на сообщение. (не фрагмент) перед отправкой другого, что снижает пропускную способность и не использует полнодуплексный характер SPI.
3. Улучшение на этом этапе заключалось в использовании своего рода почтового ящика для приема фрагментов, поэтому длинное сообщение может быть прервано сообщением с более высоким приоритетом, так что фрагменты одного сообщения могут поступать не последовательно, но проблема в том, что этот дизайн приводит к усложнению вещей, особенно тем, что у меня не так много доступных ресурсов для многих буферов, чтобы использовать подход почтового ящика на стороне контроллера (главного). Поэтому я подумал, что это как будто я заново изобретаю колесо, создавая стек протоколов для простой связи точка-точка, что может быть неэффективным.
4- Какие протоколы более высокого уровня могут обычно использоваться выше SPI для установления нескольких сеансов и решения очереди / планирования сообщений?
Обновление 2: еще одна полезная ветка: Хороший протокол / стек последовательной связи для встроенных устройств? "
Обновление 3: Я взглянул на протокол Modbus, кажется, он определяет уровень приложения, а затем непосредственно уровень канала данных для последовательной связи, что звучит так, чтобы пропустить ненужные накладные расходы слоев сетевых протоколов.
Как вы думаете, это будет лучший вариант, чем LwIP по назначению? Кроме того, существует ли широко используемая реализация с открытым исходным кодом, такая как LwIP, но для Modbus?