py/scheduler: Move mp_keyboard_interrupt from lib/utils to py core.

This function is tightly coupled to the state and behaviour of the
scheduler, and is a core part of the runtime: to schedule a pending
exception.  So move it there.
This commit is contained in:
Damien George 2020-02-06 20:25:54 +11:00
parent 5a91cd9ff3
commit 9efb36bfa6
6 changed files with 14 additions and 23 deletions

View File

@ -38,13 +38,4 @@ void mp_hal_set_interrupt_char(int c) {
mp_interrupt_char = c;
}
void mp_keyboard_interrupt(void) {
MP_STATE_VM(mp_pending_exception) = MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception));
#if MICROPY_ENABLE_SCHEDULER
if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) {
MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
}
#endif
}
#endif

View File

@ -28,6 +28,5 @@
extern int mp_interrupt_char;
void mp_hal_set_interrupt_char(int c);
void mp_keyboard_interrupt(void);
#endif // MICROPY_INCLUDED_LIB_UTILS_INTERRUPT_CHAR_H

View File

@ -26,8 +26,7 @@
#include <stdint.h>
#include "py/mpconfig.h"
#include "py/obj.h"
#include "py/runtime.h"
#include "py/mphal.h"
#include "lib/utils/interrupt_char.h"
#include "telnet.h"

View File

@ -24,9 +24,8 @@
* THE SOFTWARE.
*/
#include "py/mpstate.h"
#include "py/runtime.h"
#include "py/mphal.h"
#include "lib/utils/interrupt_char.h"
#include "samd_soc.h"
#include "tusb.h"
@ -46,15 +45,6 @@ void mp_hal_set_interrupt_char(int c) {
tud_cdc_set_wanted_char(c);
}
void mp_keyboard_interrupt(void) {
MP_STATE_VM(mp_pending_exception) = MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception));
#if MICROPY_ENABLE_SCHEDULER
if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) {
MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
}
#endif
}
#endif
void mp_hal_delay_ms(mp_uint_t ms) {

View File

@ -64,6 +64,7 @@ extern const byte mp_binary_op_method_name[];
void mp_init(void);
void mp_deinit(void);
void mp_keyboard_interrupt(void);
void mp_handle_pending(bool raise_exc);
void mp_handle_pending_tail(mp_uint_t atomic_state);

View File

@ -28,6 +28,17 @@
#include "py/runtime.h"
#if MICROPY_KBD_EXCEPTION
void mp_keyboard_interrupt(void) {
MP_STATE_VM(mp_pending_exception) = MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception));
#if MICROPY_ENABLE_SCHEDULER
if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) {
MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
}
#endif
}
#endif
#if MICROPY_ENABLE_SCHEDULER
#define IDX_MASK(i) ((i) & (MICROPY_SCHEDULER_DEPTH - 1))