diff options
| author | Dan Halbert <halbert@adafruit.com> | 2021-02-08 16:34:16 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-08 16:34:16 -0500 |
| commit | b0ed258302617a2a5175e9b870cdf8240006c2b4 (patch) | |
| tree | b94a0f1f4a9b6a31dcc96fa05e1e09865271f20d | |
| parent | f171660870a29619942256124ca457f6f087726f (diff) | |
| parent | 5423e4966c857c7d02c08f87fd872ddfbe8afc20 (diff) | |
Merge pull request #4155 from jepler/rpi-pio-background
rp2pio: Transfer up to 32 bytes before checking background tasks
| -rw-r--r-- | ports/raspberrypi/common-hal/rp2pio/StateMachine.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/ports/raspberrypi/common-hal/rp2pio/StateMachine.c b/ports/raspberrypi/common-hal/rp2pio/StateMachine.c index 6510410b0..90c48130e 100644 --- a/ports/raspberrypi/common-hal/rp2pio/StateMachine.c +++ b/ports/raspberrypi/common-hal/rp2pio/StateMachine.c @@ -546,15 +546,23 @@ static bool _transfer(rp2pio_statemachine_obj_t *self, size_t tx_remaining = out_len; while (rx_remaining || tx_remaining) { - if (tx_remaining && !pio_sm_is_tx_fifo_full(self->pio, self->state_machine)) { - *tx_destination = *data_out; - data_out++; - --tx_remaining; - } - if (rx_remaining && !pio_sm_is_rx_fifo_empty(self->pio, self->state_machine)) { - *data_in = (uint8_t) *rx_source; - data_in++; - --rx_remaining; + for (int i=0; i<32; i++) { + bool did_transfer = false; + if (tx_remaining && !pio_sm_is_tx_fifo_full(self->pio, self->state_machine)) { + *tx_destination = *data_out; + data_out++; + --tx_remaining; + did_transfer = true; + } + if (rx_remaining && !pio_sm_is_rx_fifo_empty(self->pio, self->state_machine)) { + *data_in = (uint8_t) *rx_source; + data_in++; + --rx_remaining; + did_transfer = true; + } + if (!did_transfer) { + break; + } } RUN_BACKGROUND_TASKS; if (mp_hal_is_interrupted()) { |
