【问题标题】:Change priority level level of running interrupt handler?更改正在运行的中断处理程序的优先级级别?
【发布时间】:2016-11-22 16:54:37
【问题描述】:

我正在尝试在 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 内核中定义但在 STM32L 系列上没有定义的中断 57-67 是否安全?有没有更好的办法?

【问题讨论】:

    标签: arm embedded stm32 cortex-m3


    【解决方案1】:

    使用在 Cortex-M3 内核中定义但在 STM32L 系列上未定义的中断 57-67 是否安全?

    没有。您的 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
    }
    

    另请参阅answer 关于 PendSV。

    【讨论】:

    • 你可以很好的改变优先级。 `PendSV 通常用于 RTOS 而不是用户中断处理程序,除此之外,它不能用于多个处理程序。这与使用未实现的中断完全无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    相关资源
    最近更新 更多