가 나는 피질 - 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을 사용하는 것이 안전합니까? 더 좋은 방법이 있습니까?
그게 바로 내가 뭘 찾고있어, 감사합니다 – berendi
당신은 우선 순위를 아주 잘 변경할 수 있습니다. 'PendSV는 일반적으로 사용자 인터럽트 핸들러가 아닌 RTOS에 사용되며, 여러 핸들러에서 사용할 수 없게됩니다. 이것은 구현되지 않은 인터럽트를 사용하는 것과 전혀 관련이 없습니다. – Olaf