Estoy trabajando en una pila de protocolos simple para un pequeño sistema integrado (multidrop, tipo de cosas rs485). En esta pila, los modelos losely después de capas OSI:¿Cuál es la mejor manera de manejar buffers grandes en una pila de protocolos en capas?
- de aplicación
- Red
- Datalink
- física (controlador serie)
Cada capa tiene su propia parte de cabecera/pie de página que se envuelve la carga útil de la capa superior.
Usaré mi propio grupo de búferes de bloques de tamaño fijo asignados estáticamente para almacenar los paquetes binarios. (No malloc/gratis en esta aplicación)
En otras API he visto que los datos generalmente se pasan como un puntero de const con una longitud asociada. De esta manera, los datos necesitarían una operación de copia en cada capa, ya que la carga útil de la capa anterior se coloca en un búfer recién asignado para la capa actual.
Para una pila de tres capas esto sería de 2 operaciones de copia y 3 búferes asignados.
¿Hay una mejor manera de hacer esto y aún mantener una separación limpia de las capas de protocolo?
Para anclar mejor la discusión, digamos que los paquetes son típicamente alrededor de 2k y el procesador es un micro pequeño de 8 bits que se ejecuta a 8Mhz.
8bit micro @ 8Mhz y un paquete de 2kB? No mencionaste el carnero disponible, pero supongo que el paquete lo llena bastante y claramente ejecutas un "proceso único", supongo que no veo la razón para crear tantas capas y abstracciones para un sistema tan simple. dividirlo en "transmisión de datos" y "aplicación" y pasar la carga a través de un puntero a un global. – Mark
@Mark, la pila de protocolos se utilizará en diferentes plataformas, una es una Atmega1281 con 8 k ram. Se puede sincronizar a 20Mhz, pero no lo hacemos por razones de potencia. Podría relajar la separación de preocupaciones pero ese no es el punto de mi pregunta. – JeffV
@Mark, tiene razón sobre el buffer 2k, probablemente no pueda ir tan grande, pero para esta aplicación cuanto más grande mejor, ya que es un canal de datos de alta latencia (satélite) y no planeo agregar ventanas (como se hace con TCP). – JeffV