Pracuję nad prostym stosem protokołów dla małego systemu wbudowanego (typu multidrop, rs485). W tym stosie, losely modele po OSI warstw:Jak najlepiej radzić sobie z dużymi buforami w warstwowym stosie protokołów?
- aplikacji
- Network
- Datalink
- fizyczne (sterownik szeregowy)
Każda warstwa ma swoją własną część nagłówka/stopki, która owija ładunek warstwy nad nim.
Będę korzystał z własnej puli buforów statycznie przydzielonych bloków o stałej wielkości do przechowywania pakietów binarnych. (Bez malloc/free w tej aplikacji.)
W innych interfejsach API widziałem, że dane są zwykle przekazywane jako wskaźnik stały o powiązanej długości. W ten sposób dane będą wymagały operacji kopiowania na każdej warstwie, ponieważ ładunek powyższej warstwy zostanie umieszczony w nowo przydzielonym buforze dla bieżącej warstwy.
Dla stosu trzywarstwowego będą to 2 operacje kopiowania i 3 alokowane bufory.
Czy istnieje lepszy sposób na zrobienie tego i utrzymanie czystego rozdzielenia warstw protokołów?
Aby lepiej zakotwiczyć dyskusję, powiedzmy, że pakiety mają zwykle około 2k, a procesor to małe 8-bitowe mikroprzedsiębiorstwo działające z prędkością 8 MHz.
Pakiet 8bit micro @ 8Mhz i pakiet 2kB? Nie wspomniałeś o dostępnej pamięci RAM, ale zgaduję, że pakiet prawie ją wypełnia, a twój wyraźnie działający "pojedynczy proces", wydaje mi się, że nie widzę powodu, by tworzyć tak wiele warstw i abstrakcji dla tak prostego systemu. podziel go na "transmisję danych" i "aplikację" i przeprowadź ładunek przez wskaźnik do globalnego. – Mark
@ Mark, stos protokołów ma być używany na różnych platformach, jeden to Atmega1281 z 8k ramą. Może być taktowany z częstotliwością 20 Mhz, ale nie robimy tego z powodów związanych z zasilaniem. Mógłbym rozluźnić separację obaw, ale nie o to pytam. – JeffV
@ Mark, masz rację co do bufora 2k, najprawdopodobniej nie będę w stanie zrobić tak dużego, ale dla tej aplikacji im większy tym lepiej, ponieważ jest to kanał danych o dużym opóźnieniu (satelita) i nie planuję dodawać windowing (jak to ma miejsce w przypadku TCP). – JeffV