2016-11-22 13 views
5

가 나는 피질 - 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[] 레지스터의 보류중인 비트를 설정하는 것입니다. 이 방법은 다른 인터럽트가 우선 0과 14 사이에 우선 순위가없는 한 SysTick을 따릅니다. 그것은 내 컨트롤러에 점유하지 있기 때문에

#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을 사용하는 것이 안전합니까? 더 좋은 방법이 있습니까?

답변

4

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 
} 

도하는 PendSV에 대한이 answer를 참조하십시오.

+0

그게 바로 내가 뭘 찾고있어, 감사합니다 – berendi

+0

당신은 우선 순위를 아주 잘 변경할 수 있습니다. 'PendSV는 일반적으로 사용자 인터럽트 핸들러가 아닌 RTOS에 사용되며, 여러 핸들러에서 사용할 수 없게됩니다. 이것은 구현되지 않은 인터럽트를 사용하는 것과 전혀 관련이 없습니다. – Olaf