Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][PIC32] - Cykliczne opóźnienia karty SD podczas zapisu

marco248 16 Kwi 2014 13:25 1458 3
  • #1 16 Kwi 2014 13:25
    marco248
    Poziom 10  

    Ok, więc uruchomiłem sobie zapis logów z poziomu PIC32MX na kartę pamięci SD, wszystko działa oczywiście. Robię to w ten sposób, że w miejscach gdzie chce zapisać log wysyłam go do kolejki FIFO, a następnie w wolnej chwili dane są odczytywane z kolejki i zapisywane na kartę. Dodawanie danych do kolejki realizuje funkcja StoreLog(), natomiast odczytuje i zapisuje na karcie WriteLogBufer(), piszę o tym, żeby łatwiej było zrozumieć wykres. Samo dodanie danych do bufora zajmuje koło 10us, zapis troszkę więcej, ale jest to akceptowalny czas.

    Natomiast karta pamięci, co ileś cykli zapisu wymusza dosyć długą przerwę, bo aż 0,2s ! W takiej skali, to olbrzymie marnowanie czasu, co widać na załączonym obrazku.

    Zastanawiam się, czy można to jakoś pominąć i z czego to wynika, ktoś miał taki problem? Szkoda, żeby procesor w głównej pętli tak marnował czas.

    0 3
  • #2 16 Kwi 2014 14:40
    grko
    Poziom 33  

    Specyfikacja kart SD mówi wyraźnie, że zapis może trwać nawet 250ms:

    Cytat:

    For a Standard Capacity SD Memory Card, the times after which a timeout condition for write operations occurs are (card independent) either 100 times longer than the typical program times for these operations given below or 250 ms (the lower of the two). The R2W_FACTOR field in the CSD is used to calculate the typical block program time obtained by multiplying the read access time by this factor. It applies to all write commands (e.g. SET(CLR)_WRITE_PROTECT, PROGRAM_CSD and the block write commands). High Capacity SD Memory Card and Extended Capacity SD Memory Card indicate R2W_FACTOR as a fixed value.
    In case of High Capacity SD Memory Card, maximum length of busy is defined as 250ms for all write operation.



    Masz do wyboru kilka rozwiązań:

    1. RTOS
    2. Buforowanie logów i jak procek nic nie robi to zapis na kartę.
    3 Jeżeli nie zapisujesz często logów to możesz przerobić funkcję zapisującą na kartę tak aby sprawdzanie czy zakończył się zapis był przed wysłaniem komendy write block.

    0
  • #3 16 Kwi 2014 14:52
    marco248
    Poziom 10  

    GrzegorzKostka dziękuje za odpowiedź, nie wiem, czy czytałeś w ogóle mój post w całości, ale własnie jak pisałem, buforuje logi i zapisuje jak procek nic nie robi. Ważne funkcje realizowane są w przerwaniach, więc procesor przerwie czekanie i wykona ważne zadania, ale w głównej pętli też jest kilka funkcji których tak opóźnianie nie służy wydajności, np. obsługa portu USB.

    W każdym razie odpowiedziałeś na moje pytanie, za co dziękuje. Myślę, że logi nie są zapisywane aż tak często, być może czekanie na kartę pamięci nie spowoduje dodatkowych problemów. Zamykam temat, jeszcze raz dzięki :)

    P.S. Jak by ktoś był ciekawy, lub potrzebował takiego rozwiązania, załączam kod, realizujący kolejkę FIFO, której używam do buforowania wiadomości.

    0
  • #4 17 Kwi 2014 12:16
    gulson
    Administrator Systemowy

    Raport:
    Temat zamknięty, a podane procedury mogą być faktycznie przez kogoś wykorzstane. Niestety, z powodu nieatomowego dostępu są one poprawne jedynie gdy działają w tym samym wątku. Wykorzystanie ich w przerwaniach spowoduje błędy. Należy albo dopisać takową uwagę, albo poprawić/usunąć kod. Albert

    0