Hello everyone,
While implementing a cross-core API in my RTOS, I found that "SIO_IRQ_BELL" on ARM-CM33 Core1 is routed to the wrong vector entry 10 (Reserved entry) instead of vector 42.
I got a HardFault exception (INVSTATE bit set) on core1 when I set the doorbell flag on core0 to trigger the "SIO_IRQ_BELL" interrupt on core1.
After some deep investigation I found that INVSTATE was set because of vector fetch at index 10 of the interrupt vector table which is NULL as it's a reserved vector entry on ARM !
so just I replaced the NULL entry by an ISR handler to avoid the HardFault exception and I confirmed that IRQ42 ISR fetched from IVT index 10 :
To reproduce the issue just set one of the doorbell flag on core0 to trigger the interrupt on core1.
Code on core0 :Code on Core1 :The interrupt vector table must be aligned to 128 as described in the RP2350 document.
Has anyone else experienced this behavior?
Would appreciate any confirmation.
Thanks!
While implementing a cross-core API in my RTOS, I found that "SIO_IRQ_BELL" on ARM-CM33 Core1 is routed to the wrong vector entry 10 (Reserved entry) instead of vector 42.
I got a HardFault exception (INVSTATE bit set) on core1 when I set the doorbell flag on core0 to trigger the "SIO_IRQ_BELL" interrupt on core1.
After some deep investigation I found that INVSTATE was set because of vector fetch at index 10 of the interrupt vector table which is NULL as it's a reserved vector entry on ARM !
so just I replaced the NULL entry by an ISR handler to avoid the HardFault exception and I confirmed that IRQ42 ISR fetched from IVT index 10 :
To reproduce the issue just set one of the doorbell flag on core0 to trigger the interrupt on core1.
Code on core0 :
Code:
SIO->DOORBELL_OUT_SET.reg |= (1ul << 0);Code:
#define NVIC_ISER ((volatile uint32*)(0xE000E100UL))#define InterruptIndex 42/* enable global interrupt flag */__asm("cpsie i");/* enable IRQ26 (vector table index 42) */NVIC_ISER[(InterruptIndex - 16U) / 32U] |= (1UL << ((InterruptIndex - 16U) % 32U));/* endless loop */__asm("b .");Code:
//=============================================================================// Types definition//=============================================================================typedef void (*InterruptHandler)(void);void UndefinedHandler(void);void UndefinedHandler(void) { for(;;); }void UndefinedHandler_4(void) { for(;;); }void UndefinedHandler_5(void) { for(;;); }void UndefinedHandler_6(void) { for(;;); }void UndefinedHandler_7(void) { for(;;); }void UndefinedHandler_8(void) { for(;;); }void UndefinedHandler_9(void) { for(;;); }void UndefinedHandler_10(void) { for(;;); }void UndefinedHandler_11(void) { for(;;); }void UndefinedHandler_12(void) { for(;;); }//=============================================================================// Functions prototype//=============================================================================void main_Core1 (void) __attribute__((weak, alias("UndefinedHandler")));void __CORE1_STACK_TOP(void);//=============================================================================// Default interrupts handler //=============================================================================void NMI(void) __attribute__((weak, alias("UndefinedHandler")));void HardFault(void) __attribute__((weak, alias("UndefinedHandler")));void SVCall(void) __attribute__((weak, alias("UndefinedHandler")));void PendSV(void) __attribute__((weak, alias("UndefinedHandler")));void SysTickTimer(void) __attribute__((weak, alias("UndefinedHandler")));void TIMER0_IRQ_0_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void TIMER0_IRQ_1_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void TIMER0_IRQ_2_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void TIMER0_IRQ_3_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void TIMER1_IRQ_0_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void TIMER1_IRQ_1_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void TIMER1_IRQ_2_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void TIMER1_IRQ_3_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PWM_IRQ_WRAP_0_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PWM_IRQ_WRAP_1_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void DMA_IRQ_0_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void DMA_IRQ_1_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void DMA_IRQ_2_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void DMA_IRQ_3_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void USBCTRL_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PIO0_IRQ_0_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PIO0_IRQ_1_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PIO1_IRQ_0_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PIO1_IRQ_1_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PIO2_IRQ_0_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PIO2_IRQ_1_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void IO_IRQ_BANK0_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void IO_IRQ_BANK0_NS_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void IO_IRQ_QSPI_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void IO_IRQ_QSPI_NS_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_FIFO_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_BELL_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_FIFO_NS_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_BELL_NS_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_MTIMECMP_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void CLOCKS_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void SPI0_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void SPI1_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void UART0_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void UART1_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void ADC_IRQ_FIFO_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void I2C0_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void I2C1_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void OTP_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void TRNG_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PLL_SYS_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void PLL_USB_IRQ_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void POWMAN_IRQ_POW_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void POWMAN_IRQ_TIMER_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));//=============================================================================// Interrupt vector table Core1//=============================================================================const InterruptHandler __attribute__((section(".intvect_c1"), aligned(128))) __INTVECT_Core1[] ={ (InterruptHandler)&__CORE1_STACK_TOP, (InterruptHandler)&main_Core1, (InterruptHandler)&NMI, (InterruptHandler)&HardFault, (InterruptHandler)&UndefinedHandler_4, (InterruptHandler)&UndefinedHandler_5, (InterruptHandler)&UndefinedHandler_6, (InterruptHandler)&UndefinedHandler_7, (InterruptHandler)&UndefinedHandler_8, (InterruptHandler)&UndefinedHandler_9, (InterruptHandler)&UndefinedHandler_10, (InterruptHandler)&SVCall, (InterruptHandler)&UndefinedHandler_11, (InterruptHandler)&UndefinedHandler_12, (InterruptHandler)&PendSV, (InterruptHandler)&SysTickTimer, (InterruptHandler)&TIMER0_IRQ_0_IRQn, (InterruptHandler)&TIMER0_IRQ_1_IRQn, (InterruptHandler)&TIMER0_IRQ_2_IRQn, (InterruptHandler)&TIMER0_IRQ_3_IRQn, (InterruptHandler)&TIMER1_IRQ_0_IRQn, (InterruptHandler)&TIMER1_IRQ_1_IRQn, (InterruptHandler)&TIMER1_IRQ_2_IRQn, (InterruptHandler)&TIMER1_IRQ_3_IRQn, (InterruptHandler)&PWM_IRQ_WRAP_0_IRQn, (InterruptHandler)&PWM_IRQ_WRAP_1_IRQn, (InterruptHandler)&DMA_IRQ_0_IRQn, (InterruptHandler)&DMA_IRQ_1_IRQn, (InterruptHandler)&DMA_IRQ_2_IRQn, (InterruptHandler)&DMA_IRQ_3_IRQn, (InterruptHandler)&USBCTRL_IRQ_IRQn, (InterruptHandler)&PIO0_IRQ_0_IRQn, (InterruptHandler)&PIO0_IRQ_1_IRQn, (InterruptHandler)&PIO1_IRQ_0_IRQn, (InterruptHandler)&PIO1_IRQ_1_IRQn, (InterruptHandler)&PIO2_IRQ_0_IRQn, (InterruptHandler)&PIO2_IRQ_1_IRQn, (InterruptHandler)&IO_IRQ_BANK0_IRQn, (InterruptHandler)&IO_IRQ_BANK0_NS_IRQn, (InterruptHandler)&IO_IRQ_QSPI_IRQn, (InterruptHandler)&IO_IRQ_QSPI_NS_IRQn, (InterruptHandler)&SIO_IRQ_FIFO_IRQn, (InterruptHandler)&SIO_IRQ_BELL_IRQn, (InterruptHandler)&SIO_IRQ_FIFO_NS_IRQn, (InterruptHandler)&SIO_IRQ_BELL_NS_IRQn, (InterruptHandler)&SIO_IRQ_MTIMECMP_IRQn, (InterruptHandler)&CLOCKS_IRQ_IRQn, (InterruptHandler)&SPI0_IRQ_IRQn, (InterruptHandler)&SPI1_IRQ_IRQn, (InterruptHandler)&UART0_IRQ_IRQn, (InterruptHandler)&UART1_IRQ_IRQn, (InterruptHandler)&ADC_IRQ_FIFO_IRQn, (InterruptHandler)&I2C0_IRQ_IRQn, (InterruptHandler)&I2C1_IRQ_IRQn, (InterruptHandler)&OTP_IRQ_IRQn, (InterruptHandler)&TRNG_IRQ_IRQn, (InterruptHandler)&PLL_SYS_IRQ_IRQn, (InterruptHandler)&PLL_USB_IRQ_IRQn, (InterruptHandler)&POWMAN_IRQ_POW_IRQn, (InterruptHandler)&POWMAN_IRQ_TIMER_IRQn, (InterruptHandler)0, (InterruptHandler)0, (InterruptHandler)0, (InterruptHandler)0, (InterruptHandler)0, (InterruptHandler)0};Would appreciate any confirmation.
Thanks!
Statistics: Posted by chalandi — Thu May 01, 2025 11:37 pm — Replies 4 — Views 138