Skocz do zawartości

Bufor cykliczny - sprawdzanie ilości zajętego i wolnego miejsca


atlantis86

Pomocna odpowiedź

W swoich projektach dość często wykorzystuję bufory kołowe/cykliczne. Do tej pory samo zastosowanie gwarantowało mi, że nigdy nie dojdzie do sytuacji, kiedy dane będą przychodziły szybciej niż niż zadanie w pętli głównej będzie w stanie je przetworzyć, bo szybkość na wejściu była narzucana przez prędkość UART-u albo częstotliwość próbkowania ADC. Teraz jednak mam do czynienia z sytuacją odwrotną - buduję odtwarzacz audio, w którym dane z pliku (lub połączenia TCP) są zapisywane do bufora, a następnie gdy zachodzi taka potrzeba program przesyła je do VS1003 przez SPI. FatFS albo stos TCP/IP mógłby niemal momentalnie zapełnić bufor, wielokrotnie go nadpisując. Tym razem potrzebuję więc innego podejścia na zasadzie:

  1. Sprawdź czy w buforze jest np. 512 bajtów wolnego miejsca.
  2. Jeśli tak, pobierz z pliku/bufora TCP 512 bajtów i zapisz je w buforze cyklicznym. Jeśli nie, przejdź dalej.
  3. Sprawdź czy w buforze są dostępne co najmniej 32  bajty do odczytu.
  4. Jeśli tak, pobierz 32 bajty i wyślij je do VS1003. Jeśli nie, przejdź dlej.

To czego mi w tej chwili brakuje, to sprawdzanie ilości dostępnych danych i wolnego miejsca w buforze. Mógłbym to niby monitorować za pomocą osobnej zmiennej. Może jednak istnieje jakiś bardziej elegancki sposób na obliczenie tych wartości, z rozmiaru bufora i pozycji indeksów: początkowego i końcowego?

Edytowano przez atlantis86
Link do komentarza
Share on other sites

24 minuty temu, atlantis86 napisał:

z rozmiaru bufora i pozycji indeksów: początkowego i końcowego

W ten sposób możesz mieć problem z odróżnieniem pustego bufora od zapełnionego w całości. Ale jeśli zastosujesz zamiast indeksu końcowego ilość danych w buforze, sprawa jest już trywialna... a indeks końcowy jeśli do czegoś Ci jest potrzebny możesz zawsze w prosty sposób obliczyć.

 

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.