Я работаю над простым стеком протокола для небольшой встроенной системы (многоточечный материал типа rs485). В этом стеке, losely модели после OSI слоев:Как лучше всего обрабатывать большие буферы в многоуровневом стеке протоколов?
- Применение
- Сеть
- Канальный
- физический (последовательный драйвер)
Каждый слой имеет свой собственный заголовок/нижнего колонтитула часть, которая обертывает полезная нагрузка слоя над ним.
Я буду использовать собственный буферный пул статически выделенных блоков фиксированного размера для хранения двоичных пакетов. (Нет malloc/free в этом приложении.)
В других API-интерфейсах я видел, что данные обычно передаются как указатель const со связанной длиной. Таким образом, данные потребуют операции копирования на каждом уровне, так как полезная нагрузка вышележащего уровня помещается в новый выделенный буфер для текущего слоя.
Для трехслойного стека это будет 2 операции копирования и 3 выделенных буфера.
Есть ли лучший способ сделать это и по-прежнему поддерживать чистое разделение уровней протокола?
Чтобы лучше зафиксировать обсуждение, скажем, что пакеты обычно составляют около 2 тыс., А процессор - это небольшой 8-битный микрофон, работающий на частоте 8 МГц.
8bit micro @ 8Mhz и 2kB пакет? Вы не упомянули о доступном баре, но я бы предположил, что пакет в значительной степени заполняет его, и вы четко выполняете «единый процесс», я думаю, я не вижу причины создавать столько слоев и абстракций для такой простой системы. разбить его на «передачу данных» и «приложение» и передать полезную нагрузку с помощью указателя на глобальный. – Mark
@Mark, стек протоколов должен использоваться на разных платформах, один из них - Atmega1281 с 8k RAM. Он может быть синхронизирован с частотой 20 МГц, но мы не делаем этого по соображениям мощности. Я мог бы расслабить разделение проблем, но это не вопрос моего вопроса. – JeffV
@Mark, вы правы в отношении 2k-буфера, я, скорее всего, не смогу пройти так много, но для этого приложения тем лучше, так как это канал с высокой задержкой (спутник), и я не планирую добавлять windowing (как это делается с TCP). – JeffV