更改运行中断处理程序的优先级级别



我试图在Cortex-M3控制器上实现以下伪代码(尤其是STM32L151)

void SysTick_Handler() {
    do_high_priority_periodic_tasks(); // not to be interrupted
    lower_interrupt_priority();
    do_low_priority_periodic_tasks();  // these may be interrupted
}

换句话说,以优先级级别为0,然后以某种方式将当前中断优先级降低到15,以便其余的可以被其他硬件中断抢占。

一个想法是将do_low_priority_periodic_tasks();移动到单独的中断处理程序中,并通过NVIC_SetPendingIRQ()调用该处理程序,该处理程序在NVIC->ISPR[]寄存器中设置了一个待处理位。这样,另一个中断将立即遵循SysTick,除非有0到14待定的优先级。

#define LOWPRIO_IRQn 55
void IRQ55_Handler() {
    do_low_priority_periodic_tasks();  // these may be interrupted
}
void SysTick_Handler() {
    do_high_priority_periodic_tasks(); // not to be interrupted
    NVIC_SetPendingIRQ(LOWPRIO_IRQ);
}
void main() {
    HAL_Init();
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    HAL_NVIC_SetPriority(LOWPRIO_IRQn, 15, 0);
    HAL_NVIC_EnableIRQ(LOWPRIO_IRQn);
    while(1) {
        /* main loop */
    }
}

我选择了IRQ 55,因为它没有在我的控制器上占用,它将是AES中断STM32L162上的处理程序,但我在那里有些担心。我应该选择其他IRQ,也许是未使用的DMA频道中断?使用在Cortex-M3 Core中定义的中断57-67,但在STM32L系列中不确定吗?有什么更好的方法吗?

使用中断57-67,在Cortex-M3核心中定义的中断是安全的,但在STM32L系列中不确定?

否。您的NVIC实际上可能不会实现它们。

,但Pendsv完全针对此任务:

void SysTick_Handler() {
  do_high_priority_periodic_tasks(); // not to be interrupted
  // Set the PENDSVSET to trigger a PendSV exception
  SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
}
void PendSV_Handler() {
    do_low_priority_periodic_tasks();  // these may be interrupted
}

另请参见有关pendsv。

的答案

最新更新