Witam!
Pracuję obecnie nad zintegrowaniem stdio (streams) z różnymi peryferiami w ARMie (akurat jest to LPC1769) oraz z plikami (FatFS), a wszystko to "pod kontrolą" FreeRTOSa. Jak wiadomo (albo i nie), integracja taka to w głównej mierze napisanie własnych wersji syscalls - m.in. open, close, read, write. Za przykład problemu weźmy write - funkcja ma parametry typu bufor i rozmiar, zwraca ilość przesłanych faktycznie danych. Jeśli ilość przesłana jest mniejsza niż ilość żądana funkcja zostania wywołana raz jeszcze z odpowiednio przesuniętym buforem i zmniejszonym rozmiarem - innymi słowy będzie wywoływana dopóki nie uda się wysłać całych danych - ciągiem lub w kawałkach. No i teraz zakładając, że istnieje wątek który faktycznie zajmuje się wysyłaniem tych danych "gdzieś" (np. UART) należy w write() dane pakować do kolejki, a wątek sobie te dane odbierze.
No i teraz powstaje pytanie - "jak lepiej?" - czy lepiej żeby w write() został zaalokowany (malloc()) jakiś odpowiednio duży bufor (powiedzmy że z ograniczeniami), w kolejce przesłany zostanie tylko wskaźnik na niego, a wątek odbierający po przesłaniu danych jest odpowiedzialny za skasowanie go, czy może lepiej zrobić tak, że kolejka ma swoje małe buforki (np o długośc 16-znaków) i w write() dane są partycjonowane na te poszczególne kawałki (po jednym kawałku na wywołanie write())?
Jak jest lepiej, sensowniej, szybciej, bezpieczniej? Czy ktoś miał już kiedyś taki dylemat i doszedł do jakichś konstruktywnych wniosków?
Z góry dzięki!
4\/3!!
Pracuję obecnie nad zintegrowaniem stdio (streams) z różnymi peryferiami w ARMie (akurat jest to LPC1769) oraz z plikami (FatFS), a wszystko to "pod kontrolą" FreeRTOSa. Jak wiadomo (albo i nie), integracja taka to w głównej mierze napisanie własnych wersji syscalls - m.in. open, close, read, write. Za przykład problemu weźmy write - funkcja ma parametry typu bufor i rozmiar, zwraca ilość przesłanych faktycznie danych. Jeśli ilość przesłana jest mniejsza niż ilość żądana funkcja zostania wywołana raz jeszcze z odpowiednio przesuniętym buforem i zmniejszonym rozmiarem - innymi słowy będzie wywoływana dopóki nie uda się wysłać całych danych - ciągiem lub w kawałkach. No i teraz zakładając, że istnieje wątek który faktycznie zajmuje się wysyłaniem tych danych "gdzieś" (np. UART) należy w write() dane pakować do kolejki, a wątek sobie te dane odbierze.
No i teraz powstaje pytanie - "jak lepiej?" - czy lepiej żeby w write() został zaalokowany (malloc()) jakiś odpowiednio duży bufor (powiedzmy że z ograniczeniami), w kolejce przesłany zostanie tylko wskaźnik na niego, a wątek odbierający po przesłaniu danych jest odpowiedzialny za skasowanie go, czy może lepiej zrobić tak, że kolejka ma swoje małe buforki (np o długośc 16-znaków) i w write() dane są partycjonowane na te poszczególne kawałki (po jednym kawałku na wywołanie write())?
Jak jest lepiej, sensowniej, szybciej, bezpieczniej? Czy ktoś miał już kiedyś taki dylemat i doszedł do jakichś konstruktywnych wniosków?
Z góry dzięki!
4\/3!!