it warns that outputting at higher freq could max out the mcu, but Im not clear on what causes that limitation?
The timers used for the Waveform are a mix of a single hardware timer, plus software to handle the scheduling of multiple tasks (eg multiple waveforms, digitalPulse, software PWM, etc) on that one timer. If you do too much stuff then the processor just spends all its time servicing the interrupt and no time executing anything else!
If you're doing a sine wave then you could just write that to a buffer and use Waveform on that buffer without need for DSP instructions though?
If you're looking at doing realtime audio output and you're doing Inline C, then I would say you should actually just make your C code access the PWM output hardware directly - an example of doing that from JS is at https://www.espruino.com/STM32+Peripherals.
Actually executing your code at a fixed interval could be a little more problematic, but probably the easiest method right now is:
Use analogWrite(...,{freq:44100}) on one pin
Physically connect that pin to another pin
Use setWatch(your_inline_c_fn, other_pin, { irq:true, repeat:1})
And that should then be able to execute your function 441000 times a second without JS ever getting involved
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
The timers used for the Waveform are a mix of a single hardware timer, plus software to handle the scheduling of multiple tasks (eg multiple waveforms, digitalPulse, software PWM, etc) on that one timer. If you do too much stuff then the processor just spends all its time servicing the interrupt and no time executing anything else!
If you're doing a sine wave then you could just write that to a buffer and use Waveform on that buffer without need for DSP instructions though?
If you're looking at doing realtime audio output and you're doing Inline C, then I would say you should actually just make your C code access the PWM output hardware directly - an example of doing that from JS is at https://www.espruino.com/STM32+Peripherals.
Actually executing your code at a fixed interval could be a little more problematic, but probably the easiest method right now is:
analogWrite(...,{freq:44100})
on one pinsetWatch(your_inline_c_fn, other_pin, { irq:true, repeat:1})
And that should then be able to execute your function 441000 times a second without JS ever getting involved