【发布时间】: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