logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR - Petite FatFs: Problem z ustawieniem sektora do zapisu, zawsze zapisuje na początku

zbynio_k 26 Kwi 2016 14:24 1569 15
REKLAMA
  • #1 15631478
    zbynio_k
    Poziom 10  
    Witam, mam problem z ustawieniem sektora do zapisu.
    Wydaje mi się, że robię zgodnie z

    http://elm-chan.org/fsw/ff/pf/write.html

    tj.
    1. mount_card
    2. open_file
    3. seek_sector
    4. write_bufor
    4. write_finalize

    A jednak zapisuje się zawsze na początku pliku.
    Czy popełniam jakiś trywialny błąd ?

    Pozdrawiam
  • REKLAMA
  • #2 15631487
    grko
    Poziom 33  
    Pokaż kod to być może będziemy w stanie pomóc.
  • #3 15631521
    zbynio_k
    Poziom 10  
    CPU - m32
    F_CPU - 16MHz
    zapisywany bufor - buf_txt[16]
    wycinek kodu odpowiadający za zapis do pliku
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Przy okazji wyświetlam sobie pointery sektora,
    po seek > jest OK, czyli 50 a po operacji write > 16, czyli zapisał od początku, 16 bajtów
  • REKLAMA
  • #4 15631577
    grko
    Poziom 33  
    Jaki jest początkowy rozmiar twojego pliku? Ta biblioteka nie umożliwia robienia operacji truncate na pliku. Poza tym nie sprawdzasz co zwraca funkcja seek.
  • REKLAMA
  • #5 15631788
    zbynio_k
    Poziom 10  
    GrzegorzKostka napisał:
    Jaki jest początkowy rozmiar twojego pliku? Ta biblioteka nie umożliwia robienia operacji truncate na pliku. Poza tym nie sprawdzasz co zwraca funkcja seek.


    szanowny kolego
    1. trza się naumieć czytać ze zrozumieniem > na wstępie jest podane
    a po wtóre co ma truncate do zapisu ... najwyżej zwróci ilość zapisanych bajtów mniejszą niż długość bufora
    2. oj sprawdzam > kod troszkę uprościłem, a poza tym czytam fs.fptr po sekk i po zapisie

    edit - zapomniałem o szczególe > plik dok1.txt waży 15kB
  • #6 15631820
    grko
    Poziom 33  
    Cytat:

    1. trza się naumieć czytać ze zrozumieniem > na wstępie jest podane
    a po wtóre co ma truncate do zapisu ... najwyżej zwróci ilość zapisanych bajtów mniejszą niż długość bufora


    Nigdzie nie napisałeś jaki rozmiar ma plik. To może napiszę ile powinien mieć aby Twoja operacja mogła się udać. Początkowy rozmiar musi mieć co najmniej: 50 + 16 bajtów.

    Cytat:

    2. oj sprawdzam > kod troszkę uprościłem, a poza tym czytam fs.fptr po sekk i po zapisie


    A to przepraszam. Moja magiczna kula tego nie była w stanie wykryć.
  • #7 15631862
    zbynio_k
    Poziom 10  
    przepraszam > poprawiłem post powyżej ....
    ale miałeś prawo przypuszczać, że jestem na tyle początkujący, że plik mam za mały
    to, że mam poziom 10 to świadczy tylko o skromnym moim udziale na portalu
    pozdrawiam i przepraszam
  • #8 15631915
    grko
    Poziom 33  
    Przeczytałeś dokumentację?

    Cytat:

    pf_lseek(ofs); read/write pointer must be moved to sector bundary prior to initiate write operation, or it will be rounded-down to the sector boundary at first write operation.


    Cytat:

    pf_write(0, 0, &bw); Finalize the write operation. If read/write pointer is not on the sector boundary, left bytes in the sector will be filled with zero.
  • REKLAMA
  • #9 15631930
    zbynio_k
    Poziom 10  
    kolego Grzegorzu ....
    PRZECZYTAŁEM i to nieraz > wstawiając do tłumacza niezrozumiałe fragmenty
    co chcesz zasugerować Twoją odpowiedzią ??
    że nie znam angielskiego ??
    może i nie najlepiej
    więc wyjaśnij mi gdzie robię błąd a nie pisz pierdół o dokumentacji
    bo jak mniemam wykonuję wszystko zgodnie z dokumentacją
  • #10 15631951
    grko
    Poziom 33  
    To, że pf_fseek możesz robić tylko z wyrównaniem do sektora:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W naszym przypadku, przy pierwszym wywołaniu pf_write, wskaźnik pliku fptr zostanie zaokrąglony w do rozmiaru sektora (czyli w naszym przypadku 0).
  • #11 15631981
    zbynio_k
    Poziom 10  
    hmmm, więc jak piszesz nie rozumiem istoty działania seek > i tak jest

    nie pamiętam jaki cluster był przy formatowaniu uSD > zawsze można to zmienić :)

    a sedno problemu jest w tym, że chcę zapisać bufor - np. 128 znaków
    zamknąć zapis a następnie zapisać (jak update) "po" poprzednim zapisie

    cytuję
    Example
    /* Move to offset of 5000 from top of the file */
    res = pf_lseek(5000);

    /* Forward 3000 bytes */
    res = pf_lseek(fs.fptr + 3000);

    /* Rewind 2000 bytes (take care on wraparound) */
    res = pf_lseek(fs.fptr - 2000);

    oznacza, że poruszam się po SEKTORACH a nie po bajtach w pliku ?
    a jednak występuje "BYTES"
    potwierdź lub zaneguj

    względem powyższych rozważań .... cluster powinien być jak najbardziej zbliżony do rozmiaru zapisywanego bufora ?

    edit - znam Delphi (i przeszedłem na C) a tam seek poruszał się po bajtach / rekordach w zależności od rodzaju zapisu do pliku
  • Pomocny post
    #12 15631998
    grko
    Poziom 33  
    Oczywiście możesz tak robić jeżeli chcesz odczytywać plik:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeżeli chcesz zapisywać to musisz ustawić pozycję w pliku jako wielokrotność rozmiaru sektora (nie klastra). Nieważne czy ustawisz pozycję w pliku 0 czy 511. I tak to zostanie ona zaokrąglona w dół do rozmiaru sektora przy okazji wywołania pf_write. To właśnie mówi dokumentacja tych funkcji.
  • #13 15632027
    zbynio_k
    Poziom 10  
    no ok, żyłem w przeświadczeniu, że cluster to, w wolnym tłumaczeniu na polski, sektor
    nie pamiętam jak w Partition Magic można sformatować najmniejszy cluster / sektor ale spróbuję ....
    btw - dla próby dam seek x 512 bo pewnie tak jest defaultowo ( choć dla HDD jest 4k) i dam znać o efektach
    na razie dzięki

    Dodano po 26 [minuty]:

    kolego Grzegorzu, całkowicie zwracam honor
    miałeś rację > co prawda plik nie zachowuje się jak bym tego sobie życzył ale zapisuje "co sektor"
    pomijając sektor vs cluster
    dzięki
  • Pomocny post
    #14 15632127
    grko
    Poziom 33  
    @zbynio_k

    sektor -> fizyczna organizacja urządzenia blokowego (najmniejsza jednostka zapisu/odczytu). Dla kart SD jest to zwykle 512 bajty (dla dysków zresztą też).
    klaster -> najmniejsza jednostka alokacji w systemie plików FAT
  • #15 15632144
    zbynio_k
    Poziom 10  
    jeszcze raz dzięki > jakoś trudno jest mi się przestawić z Delphi > zapis do pliku
    edit - a już mi się wydawało, że ... trollujesz :P
  • #16 15806584
    zbynio_k
    Poziom 10  
    Dzięki, Grzegorz Kostka,
    opanowałem zagadnienie.
    Temat do zamknięcia.
REKLAMA