2016-11-22 115 views
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系列上?有沒有更好的方法來做到這一點?

回答

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 
} 

另見本answer約PendSV的。

+0

這就是我正在尋找的,謝謝 – berendi

+0

您可以更改優先級。 'PendSV通常用於RTOS而不是用戶中斷處理程序,除此之外它不能用於多個處理程序。這與使用未實現的中斷完全無關。 – Olaf