Skocz do zawartości

ESP32: Wire, dźwięk i... ślamazara :(


ethanak

Pomocna odpowiedź

Taki trochę wkurzający problem...

Mam sobie ESP32.

Nie używam WiFi ani bluetootha.

Na rdzeniu 1 działa sobie cała piękna pętla loop().

Na rdzeniu 0 działa wyłącznie generator dźwięku (cały czas), w skrócie wygląda to tak:

unsigned int frameCount;
for (;;) {
  // tu pobiera parametry generowania dźwięku
  for (i=0;i<64;i++) {
    int16 sample = kolejna_faza_dzwieku();
    dac.writeSample(sample, sample);
  }
  if (frameCount++ % 64 == 0) vTaskDelay(1);
}

Pobranie parametrów to po prostu parę podstawień w obrębie locka, generowanie kolejnej fazy to po prostu pobranie kolejnego sampla z tablicy z krokiem zależnym od parametrów i przemnożenie przez głośność (razy dwa generatory).

W głównej pętli mam obsługę wyświetlacza na I2C, uproszczoną do granic możliwości.

Dopóki nie odpalę taska z dźwiękiem, wszystko działa bardzo ślicznie. Po odpaleniu dźwięku transfer kilkunastu bajtów zajmuje mniej więcej pół sekundy...

Rozumiem, że sama procedura i2c_write działa na rdzeniu 0 (aż tak głęboko w kod nie wnikałem). Czyli: proces w tasku głównym zleca komunikację i2c, czeka na wykonanie, tymczasem działający na rdzeniu 0 i2c_write nie może się dopchać do procka...

Jakieś pomysły co z tym fantem zrobić?

 

 

Link do komentarza
Share on other sites

Nie znam szczegółów ESP32, ale z tego co wyczytałem to posiada kontroler DMA. Pytanie jak go ugryść?
Na pierwszy rzut oka to, tak wygląda, że odtwarzanie dźwięku, zajmuje większość przepustowości wewnętrznej magistrali I/O.

Link do komentarza
Share on other sites

30 minut temu, BlackJack napisał:

Nie znam szczegółów ESP32

Zobacz, to zupełnie jak ja 😉

30 minut temu, BlackJack napisał:

z tego co wyczytałem to posiada kontroler DMA

i używa go do dźwięku (8 buforów bo 64 bajty o ile dobrze pamiętam, nie chce mi się zaglądać do źródeł).

Coś mi się nie wydaje że to kwestia przepustowości, wieczorem będę miał dostęp do tego urządzenia to jeszcze poeksperymentuję...

 

Link do komentarza
Share on other sites

...no i jest tak jak myślałem; nie ma to nic wspólnego z DMA.

Drobna zmiana w kodzie: zakomentowana inicjalizacja DAC (tak na wszelki wypadek), wątek audio wygląda tak:

void busyLoop(uint32_t ms)
{
    uint32_t ems=millis();
    while (millis() - ems < ms);
}

void IRAM_ATTR AudioThread(void *pvParameter)
{
    
    while(1) {
        busyLoop(64);
        vTaskDelay(1);
    }
}

Zgodnie z moimi oczekiwaniami efekt jest ten sam - wolne działanie Wire.

Ergo: bajki o przepustowości pozostają bajkami, a problem pozostał.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.