summaryrefslogtreecommitdiff
path: root/ports/zephyr/machine_pin.c
diff options
context:
space:
mode:
authorChris Webb <chris@arachsys.com>2025-09-09 15:40:51 +0100
committerDamien George <damien.p.george@gmail.com>2025-09-25 23:59:24 +1000
commit81985d20c98e1550c355263f1d6c7bd6150ee0b4 (patch)
tree94a7e824b29d4fdbc41fb75cfed91d1bbb2ed693 /ports/zephyr/machine_pin.c
parentb9523fd58c02dba74239015bf6b2a1983342a06b (diff)
shared/runtime/mpirq: Check separate hard IRQ stack correctly.
On the zephyr port, hard IRQ handlers run with a separate stack on a different thread, so each call to mp_irq_dispatch() and mp_irq_handler() has to be wrapped with adjustments to the stack-limit checker. Move these adjustments into the shared mp_irq_dispatch(), introducing MICROPY_STACK_SIZE_HARD_IRQ which a port can define to non-zero if it uses a separate stack for hard IRQ handlers. We only need wrap the hard dispatch case. This should reduce binary size on zephyr without affecting other ports. Signed-off-by: Chris Webb <chris@arachsys.com>
Diffstat (limited to 'ports/zephyr/machine_pin.c')
-rw-r--r--ports/zephyr/machine_pin.c15
1 files changed, 0 insertions, 15 deletions
diff --git a/ports/zephyr/machine_pin.c b/ports/zephyr/machine_pin.c
index e0718588d..1ae262419 100644
--- a/ports/zephyr/machine_pin.c
+++ b/ports/zephyr/machine_pin.c
@@ -64,22 +64,7 @@ void machine_pin_deinit(void) {
static void gpio_callback_handler(const struct device *port, struct gpio_callback *cb, gpio_port_pins_t pins) {
machine_pin_irq_obj_t *irq = CONTAINER_OF(cb, machine_pin_irq_obj_t, callback);
- #if MICROPY_STACK_CHECK
- // This callback executes in an ISR context so the stack-limit check must be changed to
- // use the ISR stack for the duration of this function (so that hard IRQ callbacks work).
- char *orig_stack_top = MP_STATE_THREAD(stack_top);
- size_t orig_stack_limit = MP_STATE_THREAD(stack_limit);
- MP_STATE_THREAD(stack_top) = (void *)&irq;
- MP_STATE_THREAD(stack_limit) = CONFIG_ISR_STACK_SIZE - 512;
- #endif
-
mp_irq_handler(&irq->base);
-
- #if MICROPY_STACK_CHECK
- // Restore original stack-limit checking values.
- MP_STATE_THREAD(stack_top) = orig_stack_top;
- MP_STATE_THREAD(stack_limit) = orig_stack_limit;
- #endif
}
static void machine_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {