Я пытаюсь разработать эффективный протокол связи между микроконтроллером с одной стороны и процессором ARM на многоядерном чипе TI с другой стороны через SPI.Чип для протокола обмена чипами по SPI
Требования к необходимой протокола:
1 - Multi-сессия с очередями поддержки, так как у меня есть несколько отправка/прием потоков, так что это будет более одного приложения, используя этот протокол связи и мне нужен протокол для обработки очередей этих запросов (я буду держать буфер, если очередь передачи, но мне нужен протокол для управления очередями).
2 - Работает под SPI в качестве базового протокола.
3 - Простая проверка ошибок.
В этой теме: «Simple serial point-to-point communication protocol», PPP был рекомендованным вариантом, однако я вижу, что PPP выполняет только часть задания.
Я также нашел проект Lightweight IP (LwIP) с PPP через последовательный порт (который я предполагаю, что я могу использовать его через SPI), поэтому я подумал о возможности использования любых протоколов верхнего уровня, таких как TCP/UDP, выполняйте остальные необходимые задания. К счастью, я нашел TI, включая LwIP, как часть своего Ethernet-коммутатора в пакете стартеров, который, как я полагаю, облегчает портирование, по крайней мере, на стороне чипа TI.
Итак, мои вопросы:
1 - Справедливо ли использовать LwIP для этой схемы связи? Разве это не приведет к большим накладным расходам из-за заголовков IP-адресов, которые не нужны для связи по точкам (на уровне чипа) и убивают пропускную способность?
2 - Будет ли TCP или любой аналогичный протокол, находящийся в LwIP, обрабатывать очереди запросов на передачу, например, если я запрашиваю передачу через сокет, пока канал связи занят передающим/принимающим запросом для другого сокета (сеанса) другого thread, будет ли это управляться стеком протокола? Если да, то какой уровень протокола управляет?
3 - Является ли их более эффективным протокольным стеклом, чем LwIP, который соответствует вышеуказанным требованиям?
Update 1: Чем больше очков, чтобы рассмотреть
1 - SPI является единственным доступным вариантом, я использую его с имеющимся GPIOs для указания мастера, когда ведомые имеют данные для передачи.
2 - В текущем реализованном (нестандартном) протоколе используется DMA с SPI и формат сообщения «STX_MsgID_length_payload_ETX» с фиксированной длиной фрагментов сообщения, однако основным недостатком текущей схемы является то, что мастер ждет ответ на сообщение (а не фрагмент) перед отправкой другого, что убивает пропускную способность и не использует полный дуплексный характер SPI.
3. Улучшение этой точки заключалось в использовании своего рода почтового ящика для получения фрагментов, поэтому длинное сообщение может быть прервано более высоким приоритетом, так что фрагменты одного сообщения могут поступать не последовательно, но проблема заключается в том, что этот дизайн приводит к усложнению ситуации, особенно, что у меня нет много доступных ресурсов для многих буферов для использования подхода почтового ящика на стороне контроллера (мастера). Поэтому я подумал, что это похоже на то, что я изобретаю колесо, создавая стек протоколов для простой связи точка-точка, которая может быть неэффективной.
4 Какие протоколы более высокого уровня обычно можно использовать над SPI для установки нескольких сеансов и решения очереди или составления расписаний?
Update 2: Другой полезной нить «A good serial communications protocol/stack for embedded devices?»
Update 3: Я имел взгляд на протоколе Modbus, по-видимому, чтобы определить уровень приложений затем непосредственно канальном слой для последовательной линии связи, который звучит, чтобы пропустить ненужные накладные расходы на уровни сетевых ориентированных протоколов.
Считаете ли вы, что это будет лучший вариант, чем LwIP по назначению? Кроме того, существует широко используемая реализация с открытым исходным кодом, такая как LwIP, но для Modbus?
spi - главный раб не двунаправленный. Если вы хотите использовать lwip или какой-либо другой протокол, вы, вероятно, захотите использовать serial/uart not spi. У lwip будет много накладных расходов, вы, вероятно, могли бы просто сделать свою собственную вещь. –
@dwelch - USB также является ведущим/подчиненным, но это легко решить с периодическим опросом ведомых устройств. –
К сожалению, SPI - это доступная опция, я уже использую ее вместе с другим GPIO, чтобы указать ведущему, когда данные доступны в подчиненном устройстве. – Wessam