2009-11-03 11 views
5

Potrzebuję przechowywać przedmioty o różnej długości w kolistej kolejce w układzie flash. Każdy przedmiot będzie miał hermetyzację, dzięki czemu będę mógł określić, jak duży jest i gdzie zaczyna się następny element. Gdy w buforze znajduje się wystarczająca ilość elementów, zostanie zawinięte do początku.Bufor cyrkowy we Flashu

Jaki jest dobry sposób przechowywania okrągłej kolejki w układzie flash?

Istnieje możliwość dziesiątek tysięcy przedmiotów, które chciałbym przechowywać. Zatem rozpoczęcie od początku i odczytywanie do końca bufora nie jest idealne, ponieważ wyszukiwanie zajmie trochę czasu.

Ponadto, ponieważ jest okrągły, muszę umieć odróżnić pierwszy element od poprzedniego.

Ostatnim problemem jest to, że jest on przechowywany w pamięci flash, więc wymazywanie każdego bloku jest czasochłonne i może być wykonane tylko określoną liczbę razy dla każdego bloku.

+1

I Jestem zdezorientowany twoim językiem. Bufor, według mnie, jest szybkim, zmiennym elementem pamięci, który często się zmienia. Jak słusznie zauważysz, pamięć flash może mieć pewne problemy z tym. Czy możesz podać nieco więcej kontekstu lub szczegółów dotyczących tego, co próbujesz zrobić i dlaczego? – Mikeb

+0

Chcę zapisać dane w pamięci nieulotnej. Pamięć nieulotna, którą mam, jest flashowa. Niestała jest ważna, ponieważ produkt może być wyłączony na pewien czas i nie chcę stracić danych. Po ponownym włączeniu zasilania, należy położyć następny kawałek danych po ostatnim. – Robert

Odpowiedz

9

pierwsze, zarządzanie blok:

Put mniejszy nagłówek na początku każdego bloku. Najważniejszą rzeczą, której potrzebujesz do śledzenia "najstarszego" i "najnowszego", jest numer bloku, który po prostu zwiększa modulo k. k musi być większa niż całkowita liczba bloków. Najlepiej, aby wartość k była mniejsza niż wartość MAX (na przykład 0xFFFF), aby można było łatwo określić, co jest wymazanym blokiem.

Przy rozruchu, kod odczytuje nagłówki każdego bloku z kolei, i lokalizuje pierwszy i ostatni bloków w kolejności, która jest n i + 1 = (n i + 1) MODULO k. Uważaj, aby się nie pomylić przez skasowane bloki (numer bloku to np. 0xFFFF) lub dane, które są w jakiś sposób uszkodzone (na przykład niekompletne kasowanie).

ramach każdego bloku

Każdy blok początkowo zaczyna pusty (każdy bajt 0xFF). Każdy rekord jest po prostu pisany jeden po drugim. Jeśli posiadasz rekordy o ustalonym rozmiarze, możesz uzyskać do niego dostęp za pomocą prostego indeksu. Jeśli posiadasz rekordy o zmiennych rozmiarach, to aby je odczytać musisz skanować od początku bloku, stylu listy połączonej.

Jeśli chcesz mieć rekordy o zmiennych rozmiarach, ale unikaj skanowania liniowego, możesz mieć dobrze zdefiniowany nagłówek dla każdego rekordu. Na przykład. użyj 0 jako ogranicznika rekordu i-kod (lub COBS/R-kod) każdego rekordu. Lub użyj bajtu do wyboru jako ogranicznika i "uciec", że bajt, jeśli występuje w każdym rekordzie (podobny do PPP protocol).

Po uruchomieniu, gdy znasz swój najnowszy blok, możesz wykonać skanowanie liniowe dla najnowszego rekordu. Lub jeśli posiadasz stałe rekordy lub ograniczniki rekordów, możesz wykonać wyszukiwanie binarne.

Erase szeregowanie

Dla niektórych układów pamięci Flash, kasowanie bloku może trwać dużo czasu - np. 5 sekund. Rozważ zaplanowanie wymazywania jako zadania w tle trochę "z wyprzedzeniem". Na przykład. gdy aktualny blok jest wypełniony w x%, a następnie zacznij kasować następny blok.

Record numeracji

Możesz zapisów rejestracyjnych. Sposób, w jaki zrobiłem to w przeszłości, to umieszczenie w nagłówku każdego bloku rekordowego numeru pierwszego rekordu. Następnie oprogramowanie musi liczyć numery każdego rekordu w bloku.

kontrolna lub CRC

Jeśli chcesz, aby wykryć uszkodzone dane (np niekompletne zapisuje lub wymazuje z powodu niespodziewanej awarii zasilania), a następnie można dodać sumę kontrolną lub CRC dla każdego rekordu, a może i do bloku nagłówek. Zauważ, że CRC bloku nagłówka obejmowałaby tylko sam nagłówek, a nie rekordy, ponieważ nie można go ponownie napisać po zapisaniu każdego nowego rekordu.

+0

+1 dla kodowania COBS. – starblue

1

Myślę, że rozumiem teraz. Wygląda na to, że największym problemem będzie wypełnienie dostępnego miejsca na nagrywanie, co będzie dalej? Nowe dane powinny zastąpić najstarsze dane, co jest moim zdaniem wynikiem bufora cyklicznego. Ale ponieważ dane nie mają ustalonej długości, możesz nadpisać więcej niż jeden rekord.

Przyjmuję, że wielkość zmienności w długości jest wystarczająco duża, aby dopełnienie wszystkiego do określonej długości nie było opcją.

Twój segment zapisu musi śledzić adres, który reprezentuje początek następnego rekordu do zapisu. Jeśli znasz rozmiar bloku, który chcesz napisać z wyprzedzeniem, możesz sprawdzić, czy skończysz na końcu bufora logicznego i zacząć od nowa na "0". Nie rozdzieliłbym nagrania z niektórymi na końcu, a niektórymi na początku.

Oddzielny rejestr może śledzić początek; to najstarsze dane, które nie zostały jeszcze nadpisane. Jeśli poszedłeś odczytywać dane, jest to miejsce, od którego zaczniesz.

Program zapisujący dane sprawdzi wówczas, biorąc pod uwagę adres startowy zapisu i długość danych, które ma zamiar zatwierdzić, jeśli powinien przerzucić rejestr odczytu, który sprawdzałby pierwszy blok i widziałby długość, a następnie przechodził do następny rekord, dopóki nie będzie wystarczająco dużo miejsca na zapisanie danych. Prawdopodobnie pojawi się przerwa w przesyłaniu danych między końcem zapisanych danych a początkiem najstarszych danych. Ale w ten sposób możesz po prostu pisać adres lub dwa jako obciążenie i nie zmieniać bloków.

Przynajmniej to prawdopodobnie bym zrobił. HTH

0

widzę trzy opcje:

Opcja 1: jest pad wszystko się do tego samego rozmiaru, to jest proste, przechowywać wskaźnik do głowy i ogona bufora więc wiesz gdzie napisać i gdzie zacznij czytać od, użyj rozmiaru każdego obiektu, aby uzyskać przesunięcie do następnego, oznacza to, że musisz przekierować bufor, tak jak listę połączoną, czyli powoli, jeśli potrzebujesz pozycji 5000.

opcja2: jest przechowuj tylko wskaźniki do prawdziwych danych w kolistym buforze, w ten sposób, gdy będziesz w pętli, nie musisz zajmować się błędami dopasowania rozmiaru. jeśli przechowujesz prawdziwe dane w okrągłym buforze i nie wylewasz go, możesz natknąć się na sytuacje, w których przeciążasz wiele przedmiotów jednym nowym obiektem danych, zakładam, że to nie jest w porządku.

przechowywać rzeczywiste dane w innym miejscu w pamięci flash, większość lamp błyskowych ma wbudowaną funkcję poziomowania zużycia, jeśli nie trzeba się martwić wielokrotnym nadpisaniem tej samej lokalizacji, układ scalony wykryje, gdzie faktycznie przechowywać to na chipie, po prostu napisz do następnej dostępnej wolnej przestrzeni.

oznacza to, że musisz wybrać maksymalny rozmiar bufora kołowego, jak to zrobić, zależy od zmienności danych. Jeśli rozmiar danych po prostu się znacznie zmieni, powiedzmy tylko o kilka bajtów, powinieneś go po prostu wyłożyć i użyć opcji 1. Jeśli rozmiar zmienia się szalenie i nieprzewidywalnie, wybierz największy rozmiar, jaki może być, i wymyśl, ile obiektów tego rozmiaru zmieści się w twoim fleszu, użyj go jako maksymalnej liczby wpisów w buforze. Oznacza to, że marnujesz sporo miejsca.

opcja 3: jeśli obiekt może być naprawdę dowolnym rozmiarem, w punkcie, w którym powinieneś po prostu użyć systemu plików, nazwij pliki w kolejności i wróć do poprzedniej wersji, pamiętając o tym, jeśli twój nowy wpis jest duży może trzeba usunąć wiele starych wpisów, aby je dopasować. Jest to tak naprawdę rozszerzenie opcji 2, ponieważ opcja2 jest pod wieloma względami prostym systemem plików.

+4

Należy zachować ostrożność przy założeniu wyrównywania zużycia ... Prawdziwe, jeśli masz interfejs typu USB lub SD. Nie tak, jeśli masz do czynienia bezpośrednio z częścią flash. – Benoit

2

Zachowaj oddzielny blok zawierający wskaźnik do początku pierwszego rekordu i koniec ostatniego rekordu. Możesz także zachować więcej informacji, takich jak całkowita liczba rekordów itp.

Do czasu, gdy początkowo zabraknie miejsca, dodawanie rekordów jest tak proste, jak zapisanie ich na końcu bufora i zaktualizowanie wskaźnika końcowego.

Aby odzyskać miejsce, należy usunąć wystarczającą liczbę rekordów, aby można było dopasować bieżący rekord. Zaktualizuj wskaźnik głowicy podczas usuwania rekordów.

Musisz śledzić, ile dodatkowej przestrzeni zostało uwolnione. Jeśli wskaźnik zostanie umieszczony na końcu ostatniego rekordu, następnym razem, gdy trzeba będzie dodać rekord, można to porównać ze wskaźnikiem do pierwszego rekordu, aby określić, czy należy usunąć więcej rekordów.

Ponadto, jeśli jest to NAND, ty lub kontroler pamięci flash będzie musiał wykonać odblokowanie i wyrównywać poziom zużycia, ale to wszystko powinno znajdować się na niższej warstwie niż przydzielanie miejsca na bufor cykliczny.

+2

Blok zawierający wskaźnik do pierwszego i ostatniego rekordu będzie zużywał się szybciej niż te zawierające rekordy, ponieważ musi być aktualizowany za każdym razem, gdy jest zapisywany nowy rekord. W przypadku niektórych pamięci flash z niskimi cyklami zapisu może to nastąpić już na 100 000. rekordu. – mjh2007

0

"Okrągłe" w pamięci flash może być wykonane na podstawie rozmiaru bloku, co oznacza, że ​​musisz zadeklarować ile bloków lampy błyskowej przeznaczysz dla tego bufora.

Rzeczywisty rozmiar bufora będzie za każdym razem od n-1 (n to liczba bloków) do n.

Każdy blok powinien rozpoczynać się od nagłówka zawierającego kolejny numer lub znacznik czasu, który może być użyty do określenia, który blok jest starszy od drugiego.

Każda pozycja zawiera nagłówek i stopkę. domyślny nagłówek zawiera wszystko, co chcesz, ale zgodnie z tym nagłówkiem musisz znać rozmiar przedmiotu. Domyślna stopka to 0xFFFFFFFF. Ta wartość oznacza zerowe zakończenie.

W pamięci RAM należy zapisać wskaźnik do najstarszego bloku, a ostatni blok i wskaźnik do najstarszego przedmiotu i ostatniego przedmiotu. Po włączeniu przejdziesz przez wszystkie bloki znajdując odpowiednie bloki i załaduj tych członków.

Jeśli chcesz zapisać nowy przedmiot, sprawdź, czy najnowszy blok zawiera wystarczającą ilość miejsca dla tego przedmiotu. Jeśli tak, zapisz element na końcu poprzedniego elementu i zmień poprzednią stopkę, aby wskazywała na ten element. Jeśli nie zawiera wystarczającej ilości miejsca, musisz usunąć najstarszy blok. Zanim usuniesz ten blok, zmień najstarsze elementy bloku (RAM), aby wskazywały na następny blok i najstarszy element do wskazania pierwszego elementu w tym bloku. Następnie można zapisać nowy element w tym bloku i zmienić stopkę najnowszego przedmiotu, aby wskazać ten element.

Wiem, że wyjaśnienie może wydawać się skomplikowane, ale proces jest bardzo prosty i jeśli napiszesz go poprawnie, możesz sprawić, że będzie on nawet bezpieczny pod względem zasilania (zawsze pamiętaj o kolejności zapisów).

Zwróć uwagę, że cykliczność bufora nie jest zapisany w pamięci flash, ale lampa zawiera tylko do bloków z elementów, które można podjąć decyzję zgodnie z bloków nagłówki i elementy nagłówków jaka jest kolejność tych elementów