Qmexx
Guest
Fri Aug 22, 2008 9:31 am
Mam problem z rejestracją strumienia danych na karcie flash.
Chcę na bieżąco zapisywać strumień danych w dużej pamięci nieulotnej
(logowanie danych pomiarowych). Maksymalnie ma to być 100kB/s (niby
niedużo

). Użyłem karty mikro SD (zwykłe uSD, Kingston, 1GB), z którą
komunikuję się przez SPI (wiadomo, bo najprościej dla mikrokontrolera).
Jednak ta sztuka mi się nie udaje - układ gubi dane.
Zrobiłem kilka analiz szybkościowych i już wiem dlaczego.
Zastosowana przeze mnie karta uSD w testach może zapisywać dane ze
średnią prędkością dochodzącą do 130kB/s, niby OK, ale cały problem tkwi
w czasie zapisu sektora w pamięci flash. Dla wspomnianej karty jest to
max. _139ms_!!! (najszybciej sektor zaprogramował się w 2,6ms -
zadziwiający rozrzut...).
Kupiłem inną (jakiś no-name uSD, też 1GB) i tu nieco lepiej: bo min.
2,1ms, ale max. 86ms!
W desperacji przetestowałem jeszcze 2 bardzo stare (ok. 4-5 lat) karty
MMC (32MB i 128MB) - wyniki: min. czas zapisu sektora: 2,8ms., a max.:
6,6ms. Czyli stare MMC jest dużo lepsze i ma znacznie mniejszy rozrzut
czasów (ale nie chciałbym ich stosować, bo chyba powoli wymierają -
znikają z ofert sklepowych).
Zbadałem jeszcze kartę CF (standardowa 1GB, Pretec) i tu podobnie: min.
czas zapisu sektora: 1,35ms, ale max. 153ms.(!)
Ten rozrzut czasów rozkłada mi układ. Mogę zbuforować 1, max.2 sektory
(mikrokontroler TMS320LF2406A bez zewnętrznej pamięci), mam 2 karty uSD
w systemie, żeby do nich zapisywać naprzemiennie, ale to wszystko za
mało wobec czasu zapisu sektora rzędu >100ms.
Zanim zainwestuję w nowoczesne odmiany kart klasy uSD Ultra, SD2.0, czy
SDHC, albo CF -Ultra/Extreme/x333 itp. chciałbym się zapytać bardziej
doświadczonych kolegów, czy to ma szansę powodzenia i czy uzyskam max.
czas zapisu sektora nie większy niż 5...10ms?
Gdzie te 3, 5, czy 15MB/s, które widzę w parametrach kart?
Czy to kwestia interfejsu SPI? (chyba nie, bo CF dawała podobne wyniki)
Może puścić się w równoległe flash'e? Mogłoby być szybciej, ale
potrzebuję min. 320MB - tu problem, gdzie kupić tak duże kostki?
(dlatego wybrałem karty flash)
Sorki, za przydługi tekst, ale chciałem opisać problem.
Pozdrawiam,
Qmexx.
PAndy
Guest
Fri Aug 22, 2008 9:47 am
Qmexx
Guest
Fri Aug 22, 2008 10:00 am
PAndy pisze:
Quote:
http://www.allegro.pl/item420555441_microdrive_3_3gb_cf_2.html
nie moja aukcja, zwroc uwage na zasilanie - ten akurat moze pracowac
tylko na 3.3V
Hmm... Microdrive... 3,3V, to nie problem, bo tak jest zasilany układ,
problem będzie z 420mA prądu (rejestrator może posiadać do 8 kanałów
pomiarowych, więc 420mA x 8... uuuu...)

, no i wolałbym szeregową
(nieduży mikrokontroler).
Zapis do CompactFlash'a testowałem z czystej ciekawości na innym układzie.
Karty flashowe typu uSD wydawały się idealne, ale te czasy...
No i układ będzie narażony na wibracje, więc napęd mechaniczny chyba
odpada (a microdrive'y są mechaniczne, jak sądzę).
Ale dzięki za sugestię!
PAndy
Guest
Fri Aug 22, 2008 10:46 am
"Qmexx" <qmexx_ciach@interia.pl> wrote in message
news:g8lv7o$g57$1@news.task.gda.pl...
Quote:
Hmm... Microdrive... 3,3V, to nie problem, bo tak jest zasilany układ,
problem będzie z 420mA prądu (rejestrator może posiadać do 8 kanałów
pomiarowych, więc 420mA x 8... uuuu...)

, no i wolałbym szeregową
(nieduży mikrokontroler).
no to jest jakis argument ale doczytalem tego warunku w opisie...
Quote:
Zapis do CompactFlash'a testowałem z czystej ciekawości na innym układzie.
Karty flashowe typu uSD wydawały się idealne, ale te czasy..
no to poszukaj kart z buforem w RAM - pakujesz dane szeregowo a karta
przepisuje je juz sama (tak pewnie zrobione sa ultraszybkie karty - wiele
rownoleglych kanalow zapisu)
Quote:
No i układ będzie narażony na wibracje, więc napęd mechaniczny chyba
odpada (a microdrive'y są mechaniczne, jak sądzę).
typowe wibracje im nie straszne
Paweł
Guest
Fri Aug 22, 2008 7:18 pm
Quote:
Zastosowana przeze mnie karta uSD w testach może zapisywać dane ze
średnią prędkością dochodzącą do 130kB/s, niby OK, ale cały problem tkwi
w czasie zapisu sektora w pamięci flash. Dla wspomnianej karty jest to
max. _139ms_!!! (najszybciej sektor zaprogramował się w 2,6ms -
zadziwiający rozrzut...).
Karty firmy Kingston tak mają. Co któryś sektor zapisuje się bardzo
długo. Co ciekawe dzieje się tak dopiero od pewnego miejsca. Sektory o
bardzo małych numerach zawsze zapisują się szybko.
W przypadku kart np. firmy Sandisk nie zaobserwowałem takiego zjawiska.
Mam urządzenia, które migają diodą LED po zapisaniu porcji danych. Dla
kart firmy Sandisk migania są bardzo regularne. Dla kart Kingston na
początku karty są bardzo szybkie potem skokowo robią się wolniejsze i
pojawiają się w nich nieregularności.
Paweł
JS
Guest
Fri Aug 22, 2008 9:39 pm
W artykule <g8ltge$c35$1@news.task.gda.pl> Qmexx napisalu:
Quote:
Mam problem z rejestracją strumienia danych na karcie flash.
Chcę na bieżąco zapisywać strumień danych w dużej pamięci nieulotnej
(logowanie danych pomiarowych). Maksymalnie ma to być 100kB/s (niby
niedużo

). Użyłem karty mikro SD (zwykłe uSD, Kingston, 1GB), z którą
komunikuję się przez SPI (wiadomo, bo najprościej dla mikrokontrolera).
średnią prędkością dochodzącą do 130kB/s, niby OK, ale cały problem tkwi
w czasie zapisu sektora w pamięci flash. Dla wspomnianej karty jest to
max. _139ms_!!! (najszybciej sektor zaprogramował się w 2,6ms -
Ten rozrzut czasów rozkłada mi układ. Mogę zbuforować 1, max.2 sektory
(mikrokontroler TMS320LF2406A bez zewnętrznej pamięci), mam 2 karty uSD
Może bufor w pamięci FRAM Ramtrona - interfejs SPI; 32kB powinno wystarczyć.
Czy zapisujesz kolejne sektory czy 'skaczesz' z zapisami po pamięci?
Zapisywanie strumienia do kolejnych sektorów powinno być IMO korzystniejsze
(mniejsza szansa na osobliwie długie czasy zapisu), bo wear-levelling
ma mniej roboty.
A, można jeszcze poeksperymentować z kasowaniem wstępnym sektorów
(masz 2 pamięci, więc na przemian).
Coś na temat szybkości zapisu jest w
http://www.sdcard.org/about/memory_card/pls/Simplified_Physical_Layer_Spec.pdf
choć ciekawsze części są akurat "uproszczone".
--
Pozdrawiam!
Jarosław Szynal
Qmexx
Guest
Mon Aug 25, 2008 7:20 am
JS pisze:
Quote:
Może bufor w pamięci FRAM Ramtrona - interfejs SPI; 32kB powinno wystarczyć.
Już o tym myślałem... Ale to kolejny układ na SPI do obsłużenia w czasie
rzeczywistym z ciągłymi "przewałkami" z jednego w drugi. Mogę zwyczajnie
nie wyrobić się z czasem, bo ten strumień danych nie bierze się znikąd.
To procek mierzy, obrabia, oblicza i na dokładkę będzie jeszcze musiał
się zając obsługą buforowania. Mam obawy...
Quote:
Czy zapisujesz kolejne sektory czy 'skaczesz' z zapisami po pamięci?
Zapisywanie strumienia do kolejnych sektorów powinno być IMO korzystniejsze
(mniejsza szansa na osobliwie długie czasy zapisu), bo wear-levelling
ma mniej roboty.
A, można jeszcze poeksperymentować z kasowaniem wstępnym sektorów
(masz 2 pamięci, więc na przemian).
Zapisuję "ciurkiem" sektor po sektorze, nie skaczę z zapisami. Robiłem
próby z wstępnym kasowaniem całej karty (mam na to czas przed
rejestracją). Efektem jest skrócenie czasu zapisu sektora średni o
jakieś 0,6ms, ale nie ma to wpływu na pojawiające się czasy maksymalne
(też są krótsze o te 0,6ms, ale występują jak występowały).
Pozdrawiam,
Qmexx.
Qmexx
Guest
Mon Aug 25, 2008 7:29 am
Paweł pisze:
Quote:
Karty firmy Kingston tak mają. Co któryś sektor zapisuje się bardzo
długo. Co ciekawe dzieje się tak dopiero od pewnego miejsca. Sektory o
bardzo małych numerach zawsze zapisują się szybko.
W przypadku kart np. firmy Sandisk nie zaobserwowałem takiego zjawiska.
A to bardzo ciekawe, co piszesz... bardzo ciekawe... chyba zainwestuję
jeszcze w Sandiska... :)
Quote:
Mam urządzenia, które migają diodą LED po zapisaniu porcji danych. Dla
kart firmy Sandisk migania są bardzo regularne. Dla kart Kingston na
początku karty są bardzo szybkie potem skokowo robią się wolniejsze i
pojawiają się w nich nieregularności.
Ja to obserwowałem w programie terminalowym, kiedy po każdym zapisie
sektora wysyłałem sobie UARTem znak. Na tych moich uSD (Kingston ale i
drugi no-name też) licznik znaków odebranych podczas liczenia dostaje
okresowej "czkawki", a na MMC (producent PQI) dane lecą równo, co z
resztą opisałem zakładając temat (max 6,6ms na MMC wobec 139ms na uSD).
Tylko, że pomyślałem o różnicy między rodzajami kart (MMC a uSD), a nie
między producentami.
Dzięki wielkie! Bardzo cenna jest dla mnie ta informacja, że na
Kingstonach leci nierówno!
Pozdrawiam,
Qmexx.