ports: Move definitions of ATOMIC_SECTION macros to mphalport.h.
Also move MICROPY_PY_PENDSV_ENTER/REENTER/EXIT to mphalport.h, for ports where these are not already there. This helps separate the hardware implementation of these macros from the MicroPython configuration (eg for renesas-ra and stm32, the IRQ static inline helper functions can now be moved to irq.h). Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
@@ -151,30 +151,8 @@ uint32_t trng_random_u32(void);
|
||||
#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-mimxrt"
|
||||
#endif
|
||||
|
||||
// For regular code that wants to prevent "background tasks" from running.
|
||||
// These background tasks (LWIP, Bluetooth) run in PENDSV context.
|
||||
// TODO: Check for the settings of the STM32 port in irq.h
|
||||
#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003)
|
||||
#define IRQ_PRI_PENDSV NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 15, 0)
|
||||
#define MICROPY_PY_PENDSV_ENTER uint32_t atomic_state = raise_irq_pri(IRQ_PRI_PENDSV);
|
||||
#define MICROPY_PY_PENDSV_REENTER atomic_state = raise_irq_pri(IRQ_PRI_PENDSV);
|
||||
#define MICROPY_PY_PENDSV_EXIT restore_irq_pri(atomic_state);
|
||||
|
||||
// Hooks to add builtins
|
||||
|
||||
__attribute__((always_inline)) static inline void enable_irq(uint32_t state) {
|
||||
__set_PRIMASK(state);
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline uint32_t disable_irq(void) {
|
||||
uint32_t state = __get_PRIMASK();
|
||||
__disable_irq();
|
||||
return state;
|
||||
}
|
||||
|
||||
#define MICROPY_BEGIN_ATOMIC_SECTION() disable_irq()
|
||||
#define MICROPY_END_ATOMIC_SECTION(state) enable_irq(state)
|
||||
|
||||
#if defined(IOMUX_TABLE_ENET)
|
||||
extern const struct _mp_obj_type_t network_lan_type;
|
||||
#define MICROPY_HW_NIC_ETH { MP_ROM_QSTR(MP_QSTR_LAN), MP_ROM_PTR(&network_lan_type) },
|
||||
|
||||
@@ -36,6 +36,18 @@
|
||||
|
||||
#define MICROPY_HAL_VERSION "2.8.0"
|
||||
|
||||
#define MICROPY_BEGIN_ATOMIC_SECTION() disable_irq()
|
||||
#define MICROPY_END_ATOMIC_SECTION(state) enable_irq(state)
|
||||
|
||||
// For regular code that wants to prevent "background tasks" from running.
|
||||
// These background tasks (LWIP, Bluetooth) run in PENDSV context.
|
||||
// TODO: Check for the settings of the STM32 port in irq.h
|
||||
#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003)
|
||||
#define IRQ_PRI_PENDSV NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 15, 0)
|
||||
#define MICROPY_PY_PENDSV_ENTER uint32_t atomic_state = raise_irq_pri(IRQ_PRI_PENDSV);
|
||||
#define MICROPY_PY_PENDSV_REENTER atomic_state = raise_irq_pri(IRQ_PRI_PENDSV);
|
||||
#define MICROPY_PY_PENDSV_EXIT restore_irq_pri(atomic_state);
|
||||
|
||||
#define MICROPY_HW_USB_CDC_TX_TIMEOUT (500)
|
||||
|
||||
#define MP_HAL_PIN_FMT "%q"
|
||||
@@ -82,6 +94,16 @@ extern ringbuf_t stdin_ringbuf;
|
||||
#define mp_hal_quiet_timing_enter() raise_irq_pri(1)
|
||||
#define mp_hal_quiet_timing_exit(irq_state) restore_irq_pri(irq_state)
|
||||
|
||||
__attribute__((always_inline)) static inline void enable_irq(uint32_t state) {
|
||||
__set_PRIMASK(state);
|
||||
}
|
||||
|
||||
__attribute__((always_inline)) static inline uint32_t disable_irq(void) {
|
||||
uint32_t state = __get_PRIMASK();
|
||||
__disable_irq();
|
||||
return state;
|
||||
}
|
||||
|
||||
void mp_hal_set_interrupt_char(int c);
|
||||
|
||||
static inline mp_uint_t mp_hal_ticks_ms(void) {
|
||||
|
||||
Reference in New Issue
Block a user