PasjaGSM.pl
  Jesteś w: Forum > Snapshot 25.08.2006 i obsługa plików.


Snapshot 25.08.2006 i obsługa plików.

Forum.PasjaGSM.pl » ...:Sprzęt:... » Nokia » DCT-3 » [DCT3] Modyfikacje HW i SW » NokiX » Programowanie » Snapshot 25.08.2006 i obsługa plików.
Poprzedni temat «» Następny temat
Autor Wiadomość
 
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-08-25, 16:40   Snapshot 25.08.2006 i obsługa plików.

Cześć.

Tworzę ten temat bo nowa wersja systemu plików (V2.10 ze snapshotu 25.08.2006) posiada znacznie usprawnione funkcje obsługi plików za pomocą deskryptorów czyli w powszechnie używany sposób na każdej platformie składający się z trzech etapów:

1. Otwórz plik
2. Odczytaj / zapisz dane.
3. Zamknij plik.

Mowa oczywiście o funkcjach tfsopen(), tfsread(), tfswrite(), tfsclose() i innych.

Otórz w nowej wersji działają one w oparciu o system buforowania zapisu który ostatnio wymyśliłem. Chciałbym tu wyszczególnić różnice w porównaniu z poprzednimi wersjami i powiedzieć co to zmienia.

W starej wersji otworzenie pliku do zapisu (z flagami TFS_CREATE, TFS_CREATERM lub TFS_APPEND) oznaczało, że cały plik wczytywany był do RAMu. Następnie każde wywołanie tfswrite() powodowało zmiany tylko w tej kopii w RAMie. Zapis do flasha następował tylko po wywołaniu tfsclose() czyli po zamknięciu pliku.

Zaletą takiego rozwiązania jest przede wszystkim łatwość implementacji oraz szybkość działania. Wad jest trochę więcej. Przede wszystkim potrzeba tyle RAMu ile ma plik. 3310 w najlepszym razie ma około 35KB co wcale nie jest dużo. Dodatkowo każdy zapis powodujący powiększenie pliku powodował relokację tej pamięci. Oznacza to, że w RAMie alokowany był blok o nowym rozmiarze, następnie do niego kopiowane były dane ze starego i na końcu stary był zwalniany. Oznacza to, że mając w RAMie plik o rozmiarze 20KB nie mogliśmy powiększyć go nawet o 1 bajt, mimo że było jeszcze 15KB wolnej pamięci.

Nowy system nie wczytuje pliku do RAMu. Zapisywane dane trafiają do dynamicznej listy zmian. Gdy lista stanie się zbyt duża, plik zapisywany jest we flashu. Jeśli był to nowy plik to jest on tworzony po prostu z tej listy zmian. W przypadku edycji istniejącego pliku (TFS_APPEND) nie zmienione dane kopiowane są ze starej wersji i na to nakładane są zmiany. Wszystko podczas zapisu do flasha więc nie wymaga pamięci RAM.

Nowa funkcja, tfsbuflimit() umożliwia ustalenie maksymalnej ilości pamięci RAM, która będzie zajęta na przechowanie listy zmian. Gdy wartość ta zostanie przekroczona, plik zostanie zapisany i pamięć zwolniona co umożliwi ponowne jej zajęcie przez kolejne zapisy. Wszystko automatycznie, wewnątrz systemu plików.

Zapisanie zmian do flasha można także wymusić nową funkcją tfsflush().

Zmiany są także zapisywane przy zamykaniu pliku, oczywiście.

Cóż to zmienia?

Przede wszystkim pozwala nam to zapisywać pliki przekraczające rozmiarem dostępną pamięć RAM. Ba, można nawet zmusić system do używania mniej pamięci niż jest dostępne.

Umożliwia także efektywne tworzenie plików "log", które mogą urosnąć do sporych rozmiarów. Poprzednio jedynym sposobem na to było użycie funkcji tfsadd() z parametrem TFS_APPEND. Funkcja ja powodowała stworzenie we flashu kopii starego pliku i dopisanie do niego nowych danych na końcu. To, że zapisanie choćby jednego bajtu powodowało zapis do flasha to jeszcze nic. Im większy stawał się plik tym więcej danych musiało być kopiowanych a więc całość stawała się wolniejsza i co chwilę dysk musiał być defragmentowany.

Z uzyciem nowego buforowania, zapisywane dane trafiają do listy w RAMie a dopiero po osiągnięciu limitu zapisywane są jednocześnie do flasha. Jest to o wiele bardziej efektywne jakby na to nie patrzeć.

Oczywiście ważnym parametrem jest tu wspomniany limit pamięci RAM zajętej przez bufor zmian. Im większy, tym lepiej. Będzie wtedy mniej zapisów do flasha i mniejsza fragmentacja.

Na tej bazie łatwo możemy teraz zbudować wygodne funkcje typu tfsgets(), tfsputs() itp.

Dwie funkcje już dodałem, są to vtfsprintf() oraz tfsprintf(). Na pewno widzicie podobieństwo do znanych z libc funkcji vfprintf() oraz fprintf. Robią one dokładnie to samo.

Miałbym jednak prośbę do zainteresowanych. System buforowania testowany był narazie tylko przeze mnie. Nie znalazłem żadnych błędów ale jest on na tyle skomplikowany, że coś się mogło wkraść. Bądźcie więc czujni i dajcie mi znać gdyby coś nie działało prawidłowo.

Pozdrawiam
[Yak]
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać załączników na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do: