ESP32 - dacWrite ersetzen

Hallo.

Momentan arbeite ich an einem ESP32-Spiel und versuche gerade, meine Musik-Routine da reinzuflechten. Mit anfangs mäßigem Erfolg. Die Musik wird über zwei Timer erzeugt, einer berechnet die DAC-Werte in Echtzeit und der andere ließt die Musikdaten ein. Nachdem ich beide miteinander verwoben hatte, stellte ich fest, dass die Musik nicht, wie vermutet, 15-40% der CPU-Leistung verbraucht, sondern satte 75-85. Da die FPS bei dem Spiel gewöhnlich irgendwo zwischen 25 und 30 sind (ich nutze ein I²C-Display, das mit SPI will irgendwie nicht am ESP32), fallen sie dann in den mittleren einstelligen Bereich. Nachdem ich die Filter und die Filterhüllkurve gestrichen und einige Berechnungen mittels Bitoperationen effizienter bekommen habe, war die Auslastung nur noch bei 50-60%. Als ich dann aber
dacWrite(soundPin, pos);durch

if(!(dWrite++ & B1111))dacWrite(soundPin, pos);

ersetzt habe, war sie plötzlich nur noch bei 25 - 30%. Natürlich war die Sample-Rate dadurch von angenehmen 50 kHz auf klägliche 3,125 kHz gefallen. Ich wüsste deswegen gerne, ob man, statt dacWrite zu nutzen, vielleicht direkt in irgendwelche Register schreiben kann.

Gruß
HTML-Fan

Das sollte im Datenblatt stehen.

Gruß Tommy

Sollte. Ich habe jetzt gerade mal DAC_1 = xyz ausprobiert - 'DAC_1' was not declared in this scope. Außerdem müsste man das doch eher bei einer Beschreibung der Arduino-IDE-Version finden, oder?

Die Meldung ist normal, wenn man die Notwendigkeiten ausblendet.
Hier findest du die dacWrite() Funktion.

Und Hier wird gezeigt, wie man die DAC Abhandlung in eine eigene Task verlagert.
Schließlich hat der ESP ja 2 Cores, nutze sie.

Auch lässt sich der DAC per DMA füttern.
Aber KA, wie, nie gemacht.
Da darfst du selber hinterher suchen.

Vielen Dank für die Infos, jetzt bin ich so zwischen 40 und 45% unterwegs. Nicht optimal, aber besser. Das Aktualiesieren mit

        //Disable Channel Tone
        CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN1_M);
        //Set the Dac value
        SET_PERI_REG_BITS(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC, pos, RTC_IO_PDAC1_DAC_S);   //dac_output
        //Channel output enable
        SET_PERI_REG_MASK(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC | RTC_IO_PDAC1_DAC_XPD_FORCE);

nimmt immernoch ~35% ein. Mal schauen, ob das mit dem zweiten Kern läuft.

Juhu, die Zeile

SET_PERI_REG_BITS(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC, pos, RTC_IO_PDAC1_DAC_S);

reicht sogar, das Aktualisieren ist jetzt auf ~10% gesunken. Und das Musikstück klingt übrigens irgendwie besser, insbesondere akkurater.

combie:
Schließlich hat der ESP ja 2 Cores, nutze sie.

Link
Offenbar sollte man Core 0 nicht als vollwärtigen Core ansehen, dennoch konnte ich die 5 fehlenden FPS noch hervorzuholen, indem ich die Timer auf Core 0 gelegt habe. Geht, aber keine Ahnung, warum. Mit dem Hauptprozess hatte es zumindest nicht geklappt.

Irre.
(mehr weiß ich zu dem Artikel nicht dazu zu sagen)

combie:
Irre.

Wie kann ich das auffassen? Es würde erklären, dass ich 0 FPS angezeigt bekomme, wenn ich den Hauptprozess auf Core 0 lege, und ich dem Display zuschauen kann, wie es sich Zeile für Zeile aufbaut.