我試圖實現一個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系列上?有沒有更好的方法來做到這一點?
這就是我正在尋找的,謝謝 – berendi
您可以更改優先級。 'PendSV通常用於RTOS而不是用戶中斷處理程序,除此之外它不能用於多個處理程序。這與使用未實現的中斷完全無關。 – Olaf