Merge pull request #2055 from jepler/run-background-tasks
Implement and use RUN_BACKGROUND_TASKS in place of MICROPY_VM_HOOK_LOOP
This commit is contained in:
commit
0ddfbb0c20
|
@ -408,9 +408,7 @@ uint32_t common_hal_audiobusio_pdmin_record_to_buffer(audiobusio_pdmin_obj_t* se
|
|||
// If wait_counts exceeds the max count, buffer has probably stopped filling;
|
||||
// DMA may have missed an I2S trigger event.
|
||||
while (!event_interrupt_active(event_channel) && ++wait_counts < MAX_WAIT_COUNTS) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
// The mic is running all the time, so we don't need to wait the usual 10msec or 100msec
|
||||
|
|
|
@ -69,9 +69,7 @@ static void ramp_value(uint16_t start, uint16_t end) {
|
|||
DAC->DATA.reg = value;
|
||||
DAC->DATABUF.reg = value;
|
||||
common_hal_mcu_delay_us(50);
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -94,9 +92,7 @@ static void ramp_value(uint16_t start, uint16_t end) {
|
|||
DAC->DATABUF[1].reg = value;
|
||||
|
||||
common_hal_mcu_delay_us(50);
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -291,13 +291,11 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
|
|||
// Reset the timeout on every character read.
|
||||
start_ticks = ticks_ms;
|
||||
}
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP ;
|
||||
RUN_BACKGROUND_TASKS;
|
||||
// Allow user to break out of a timeout with a KeyboardInterrupt.
|
||||
if (mp_hal_is_interrupted()) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
// If we are zero timeout, make sure we don't loop again (in the event
|
||||
// we read in under 1ms)
|
||||
if (self->timeout_ms == 0) {
|
||||
|
@ -339,9 +337,7 @@ size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data,
|
|||
done = true;
|
||||
break;
|
||||
}
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
if (!done) {
|
||||
|
|
|
@ -198,9 +198,7 @@ void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t* self, uint16_t* pu
|
|||
while(pulse_index < length) {
|
||||
// Do other things while we wait. The interrupts will handle sending the
|
||||
// signal.
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
tc->COUNT16.CTRLBSET.reg = TC_CTRLBSET_CMD_STOP;
|
||||
|
|
|
@ -51,9 +51,7 @@ static uint16_t get_raw_reading(touchio_touchin_obj_t *self) {
|
|||
|
||||
while (!adafruit_ptc_is_conversion_finished(PTC)) {
|
||||
// wait
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
return adafruit_ptc_get_conversion_result(PTC);
|
||||
|
|
|
@ -53,9 +53,7 @@ void mp_hal_delay_ms(mp_uint_t delay) {
|
|||
uint64_t start_tick = ticks_ms;
|
||||
uint64_t duration = 0;
|
||||
while (duration < delay) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
// Check to see if we've been CTRL-Ced by autoreload or the user.
|
||||
if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
|
||||
MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
|
||||
|
|
|
@ -138,9 +138,7 @@ void ble_uart_init(void) {
|
|||
m_cccd_enabled = false;
|
||||
|
||||
while (!m_cccd_enabled) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -150,9 +148,7 @@ bool ble_uart_connected(void) {
|
|||
|
||||
char ble_uart_rx_chr(void) {
|
||||
while (isBufferEmpty(&m_rx_ring_buffer)) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
uint8_t byte;
|
||||
|
|
|
@ -115,7 +115,7 @@ void common_hal_bleio_central_connect(bleio_central_obj_t *self, bleio_address_o
|
|||
}
|
||||
|
||||
while (self->waiting_to_connect) {
|
||||
MICROPY_VM_HOOK_LOOP;
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
if (self->conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||
|
|
|
@ -94,7 +94,7 @@ STATIC void characteristic_gatts_notify_indicate(uint16_t handle, uint16_t conn_
|
|||
// TX buffer is full
|
||||
// We could wait for an event indicating the write is complete, but just retrying is easier.
|
||||
if (err_code == NRF_ERROR_RESOURCES) {
|
||||
MICROPY_VM_HOOK_LOOP;
|
||||
RUN_BACKGROUND_TASKS;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -118,7 +118,7 @@ STATIC void characteristic_gattc_read(bleio_characteristic_obj_t *characteristic
|
|||
}
|
||||
|
||||
while (m_read_characteristic != NULL) {
|
||||
MICROPY_VM_HOOK_LOOP;
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
ble_drv_remove_event_handler(characteristic_on_gattc_read_rsp_evt, characteristic);
|
||||
|
@ -258,7 +258,7 @@ void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self,
|
|||
// Write without reponse will return NRF_ERROR_RESOURCES if too many writes are pending.
|
||||
if (err_code == NRF_ERROR_BUSY || err_code == NRF_ERROR_RESOURCES) {
|
||||
// We could wait for an event indicating the write is complete, but just retrying is easier.
|
||||
MICROPY_VM_HOOK_LOOP;
|
||||
RUN_BACKGROUND_TASKS;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ int common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_
|
|||
|
||||
// Wait for all bytes received or timeout
|
||||
while ( (ringbuf_count(&self->ringbuf) < len) && (ticks_ms - start_ticks < self->timeout_ms) ) {
|
||||
MICROPY_VM_HOOK_LOOP;
|
||||
RUN_BACKGROUND_TASKS;
|
||||
// Allow user to break out of a timeout with a KeyboardInterrupt.
|
||||
if ( mp_hal_is_interrupted() ) {
|
||||
return 0;
|
||||
|
|
|
@ -235,13 +235,11 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
|
|||
|
||||
// Wait for all bytes received or timeout
|
||||
while ( (ringbuf_count(&self->rbuf) < len) && (ticks_ms - start_ticks < self->timeout_ms) ) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP ;
|
||||
RUN_BACKGROUND_TASKS;
|
||||
// Allow user to break out of a timeout with a KeyboardInterrupt.
|
||||
if ( mp_hal_is_interrupted() ) {
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// prevent conflict with uart irq
|
||||
|
@ -271,9 +269,7 @@ size_t common_hal_busio_uart_write (busio_uart_obj_t *self, const uint8_t *data,
|
|||
|
||||
// Wait for on-going transfer to complete
|
||||
while ( nrfx_uarte_tx_in_progress(self->uarte) && (ticks_ms - start_ticks < self->timeout_ms) ) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
// Time up
|
||||
|
@ -295,9 +291,7 @@ size_t common_hal_busio_uart_write (busio_uart_obj_t *self, const uint8_t *data,
|
|||
(*errcode) = 0;
|
||||
|
||||
while ( nrfx_uarte_tx_in_progress(self->uarte) && (ticks_ms - start_ticks < self->timeout_ms) ) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
if ( !nrfx_is_in_ram(data) ) {
|
||||
|
|
|
@ -200,9 +200,7 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
|
|||
|
||||
// But we have to wait for the flag to be set.
|
||||
while ( !nrf_pwm_event_check(pwm, NRF_PWM_EVENT_SEQEND0) ) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
// Before leave we clear the flag for the event.
|
||||
|
|
|
@ -155,9 +155,7 @@ void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t* self, uint16_t* pu
|
|||
while(pulse_array_index < length) {
|
||||
// Do other things while we wait. The interrupts will handle sending the
|
||||
// signal.
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
nrfx_timer_disable(timer);
|
||||
|
|
|
@ -39,9 +39,7 @@ void mp_hal_delay_ms(mp_uint_t delay) {
|
|||
uint64_t start_tick = ticks_ms;
|
||||
uint64_t duration = 0;
|
||||
while (duration < delay) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
// Check to see if we've been CTRL-Ced by autoreload or the user.
|
||||
if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
|
||||
MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
|
||||
|
|
|
@ -37,9 +37,7 @@ void sd_mutex_acquire_check(nrf_mutex_t* p_mutex) {
|
|||
|
||||
void sd_mutex_acquire_wait(nrf_mutex_t* p_mutex) {
|
||||
while (sd_mutex_acquire(p_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -596,8 +596,8 @@ extern const struct _mp_obj_module_t ustack_module;
|
|||
WIZNET_MODULE \
|
||||
PEW_MODULE \
|
||||
PIXELBUF_MODULE \
|
||||
PULSEIO_MODULE \
|
||||
PS2IO_MODULE \
|
||||
PULSEIO_MODULE \
|
||||
RANDOM_MODULE \
|
||||
RE_MODULE \
|
||||
ROTARYIO_MODULE \
|
||||
|
@ -645,6 +645,7 @@ extern const struct _mp_obj_module_t ustack_module;
|
|||
NETWORK_ROOT_POINTERS \
|
||||
|
||||
void run_background_tasks(void);
|
||||
#define RUN_BACKGROUND_TASKS (run_background_tasks())
|
||||
|
||||
// TODO: Used in wiznet5k driver, but may not be needed in the long run.
|
||||
#define MICROPY_THREAD_YIELD()
|
||||
|
|
|
@ -96,9 +96,7 @@ STATIC mp_obj_t stage_render(size_t n_args, const mp_obj_t *args) {
|
|||
}
|
||||
|
||||
while (!displayio_display_begin_transaction(display)) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP ;
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
displayio_area_t area;
|
||||
area.x1 = x0;
|
||||
|
|
|
@ -119,9 +119,7 @@ STATIC mp_obj_t displayio_fourwire_obj_send(mp_obj_t self, mp_obj_t command_obj,
|
|||
|
||||
// Wait for display bus to be available.
|
||||
while (!common_hal_displayio_fourwire_begin_transaction(self)) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP ;
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
common_hal_displayio_fourwire_send(self, true, &command, 1);
|
||||
common_hal_displayio_fourwire_send(self, false, ((uint8_t*) bufinfo.buf), bufinfo.len);
|
||||
|
|
|
@ -111,9 +111,7 @@ STATIC mp_obj_t displayio_i2cdisplay_obj_send(mp_obj_t self, mp_obj_t command_ob
|
|||
|
||||
// Wait for display bus to be available.
|
||||
while (!common_hal_displayio_i2cdisplay_begin_transaction(self)) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP ;
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
uint8_t full_command[bufinfo.len + 1];
|
||||
full_command[0] = command;
|
||||
|
|
|
@ -122,9 +122,7 @@ STATIC mp_obj_t displayio_parallelbus_obj_send(mp_obj_t self, mp_obj_t command_o
|
|||
|
||||
// Wait for display bus to be available.
|
||||
while (!common_hal_displayio_parallelbus_begin_transaction(self)) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP ;
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
common_hal_displayio_parallelbus_send(self, true, &command, 1);
|
||||
common_hal_displayio_parallelbus_send(self, false, ((uint8_t*) bufinfo.buf), bufinfo.len);
|
||||
|
|
|
@ -182,7 +182,7 @@ STATIC mp_obj_t i2cslave_i2c_slave_request(size_t n_args, const mp_obj_t *pos_ar
|
|||
bool is_read;
|
||||
bool is_restart;
|
||||
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
RUN_BACKGROUND_TASKS;
|
||||
if (mp_hal_is_interrupted()) {
|
||||
return mp_const_none;
|
||||
}
|
||||
|
@ -337,7 +337,7 @@ STATIC mp_obj_t i2cslave_i2c_slave_request_read(size_t n_args, const mp_obj_t *p
|
|||
uint8_t *buffer = NULL;
|
||||
uint64_t timeout_end = common_hal_time_monotonic() + 10 * 1000;
|
||||
while (common_hal_time_monotonic() < timeout_end) {
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
RUN_BACKGROUND_TASKS;
|
||||
if (mp_hal_is_interrupted()) {
|
||||
break;
|
||||
}
|
||||
|
@ -382,7 +382,7 @@ STATIC mp_obj_t i2cslave_i2c_slave_request_write(mp_obj_t self_in, mp_obj_t buf_
|
|||
mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
|
||||
|
||||
for (size_t i = 0; i < bufinfo.len; i++) {
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
RUN_BACKGROUND_TASKS;
|
||||
if (mp_hal_is_interrupted()) {
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -85,9 +85,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
|
|||
|
||||
uint32_t i = 0;
|
||||
while (!self->begin_transaction(self->bus)) {
|
||||
#ifdef MICROPY_VM_HOOK_LOOP
|
||||
MICROPY_VM_HOOK_LOOP ;
|
||||
#endif
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
while (i < init_sequence_len) {
|
||||
uint8_t *cmd = init_sequence + i;
|
||||
|
@ -242,7 +240,7 @@ int32_t common_hal_displayio_display_wait_for_frame(displayio_display_obj_t* sel
|
|||
uint64_t last_refresh = self->last_refresh;
|
||||
// Don't try to refresh if we got an exception.
|
||||
while (last_refresh == self->last_refresh && MP_STATE_VM(mp_pending_exception) == NULL) {
|
||||
MICROPY_VM_HOOK_LOOP
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue