rp2pio: Transfer up to 32 bytes before checking background tasks
@Jerryneedell noticed that this problem affected strips short enough to not use the DMA peripheral, thanks for the hot tip! Instead of checking for background tasks after every byte transfer, try up to 32 transfers before attending to background tasks. This fixes the problem I was seeing on my 5-pixel circuit. Closes #4135.
This commit is contained in:
parent
a10ce39ae6
commit
5423e4966c
@ -546,15 +546,23 @@ static bool _transfer(rp2pio_statemachine_obj_t *self,
|
|||||||
size_t tx_remaining = out_len;
|
size_t tx_remaining = out_len;
|
||||||
|
|
||||||
while (rx_remaining || tx_remaining) {
|
while (rx_remaining || tx_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)) {
|
if (tx_remaining && !pio_sm_is_tx_fifo_full(self->pio, self->state_machine)) {
|
||||||
*tx_destination = *data_out;
|
*tx_destination = *data_out;
|
||||||
data_out++;
|
data_out++;
|
||||||
--tx_remaining;
|
--tx_remaining;
|
||||||
|
did_transfer = true;
|
||||||
}
|
}
|
||||||
if (rx_remaining && !pio_sm_is_rx_fifo_empty(self->pio, self->state_machine)) {
|
if (rx_remaining && !pio_sm_is_rx_fifo_empty(self->pio, self->state_machine)) {
|
||||||
*data_in = (uint8_t) *rx_source;
|
*data_in = (uint8_t) *rx_source;
|
||||||
data_in++;
|
data_in++;
|
||||||
--rx_remaining;
|
--rx_remaining;
|
||||||
|
did_transfer = true;
|
||||||
|
}
|
||||||
|
if (!did_transfer) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
RUN_BACKGROUND_TASKS;
|
RUN_BACKGROUND_TASKS;
|
||||||
if (mp_hal_is_interrupted()) {
|
if (mp_hal_is_interrupted()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user