From a66ba7a942dce2060dd0dd717fbfc08554568289 Mon Sep 17 00:00:00 2001 From: Graham Sanderson Date: Tue, 24 Jan 2023 08:58:01 -0600 Subject: [PATCH] user_irqs should be claimed globally not per core, since vector tabes are shared (#1183) --- .../hardware_irq/include/hardware/irq.h | 5 +++++ src/rp2_common/hardware_irq/irq.c | 18 ++++++++++++++---- src/rp2_common/pico_multicore/multicore.c | 4 ++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/rp2_common/hardware_irq/include/hardware/irq.h b/src/rp2_common/hardware_irq/include/hardware/irq.h index 6937f63..3fca001 100644 --- a/src/rp2_common/hardware_irq/include/hardware/irq.h +++ b/src/rp2_common/hardware_irq/include/hardware/irq.h @@ -18,6 +18,11 @@ #define PICO_DISABLE_SHARED_IRQ_HANDLERS 0 #endif +// PICO_CONFIG: PICO_VTABLE_PER_CORE, user is using separate vector tables per core, type=bool, default=0, group=hardware_irq +#ifndef PICO_VTABLE_PER_CORE +#define PICO_VTABLE_PER_CORE 0 +#endif + #ifndef __ASSEMBLER__ #include "pico.h" diff --git a/src/rp2_common/hardware_irq/irq.c b/src/rp2_common/hardware_irq/irq.c index 40af5fe..7c09934 100644 --- a/src/rp2_common/hardware_irq/irq.c +++ b/src/rp2_common/hardware_irq/irq.c @@ -15,7 +15,17 @@ extern void __unhandled_user_irq(void); +#if PICO_VTABLE_PER_CORE static uint8_t user_irq_claimed[NUM_CORES]; +static inline uint8_t *user_irq_claimed_ptr(void) { + return &user_irq_claimed[get_core_num()]; +} +#else +static uint8_t user_irq_claimed; +static inline uint8_t *user_irq_claimed_ptr(void) { + return &user_irq_claimed; +} +#endif static inline irq_handler_t *get_vtable(void) { return (irq_handler_t *) scb_hw->vtor; @@ -435,20 +445,20 @@ static uint get_user_irq_claim_index(uint irq_num) { } void user_irq_claim(uint irq_num) { - hw_claim_or_assert(&user_irq_claimed[get_core_num()], get_user_irq_claim_index(irq_num), "User IRQ is already claimed"); + hw_claim_or_assert(user_irq_claimed_ptr(), get_user_irq_claim_index(irq_num), "User IRQ is already claimed"); } void user_irq_unclaim(uint irq_num) { - hw_claim_clear(&user_irq_claimed[get_core_num()], get_user_irq_claim_index(irq_num)); + hw_claim_clear(user_irq_claimed_ptr(), get_user_irq_claim_index(irq_num)); } int user_irq_claim_unused(bool required) { - int bit = hw_claim_unused_from_range(&user_irq_claimed[get_core_num()], required, 0, NUM_USER_IRQS - 1, "No user IRQs are available"); + int bit = hw_claim_unused_from_range(user_irq_claimed_ptr(), required, 0, NUM_USER_IRQS - 1, "No user IRQs are available"); if (bit >= 0) bit = (int)NUM_IRQS - bit - 1; return bit; } bool user_irq_is_claimed(uint irq_num) { - return hw_is_claimed(&user_irq_claimed[get_core_num()], get_user_irq_claim_index(irq_num)); + return hw_is_claimed(user_irq_claimed_ptr(), get_user_irq_claim_index(irq_num)); } diff --git a/src/rp2_common/pico_multicore/multicore.c b/src/rp2_common/pico_multicore/multicore.c index 121b4fb..96f5065 100644 --- a/src/rp2_common/pico_multicore/multicore.c +++ b/src/rp2_common/pico_multicore/multicore.c @@ -114,6 +114,10 @@ void multicore_launch_core1_with_stack(void (*entry)(void), uint32_t *stack_bott stack_ptr[0] = (uintptr_t) entry; stack_ptr[1] = (uintptr_t) stack_bottom; stack_ptr[2] = (uintptr_t) core1_wrapper; +#if PICO_VTABLE_PER_CORE +#warning PICO_VTABLE_PER_CORE==1 is not currently supported in pico_multicore + panic_unsupported(); +#endif multicore_launch_core1_raw(core1_trampoline, stack_ptr, scb_hw->vtor); }