首页 文章

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

提问于
浏览
5

我试图在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因为它没有占用我的控制器,它将是STM32L162上的AES中断处理程序,但我有点担心 . 我应该选择不同的IRQ,也许是未使用的DMA通道中断?使用Cortex-M3内核定义的中断57-67是否安全,而STM32L系列中没有?有没有更好的方法呢?

1 回答

  • 4

    使用Cortex-M3内核定义的中断57-67是否安全,但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,请参阅此answer .

相关问题