首页 文章

NVIC用户中断优先级

提问于
浏览
0

我在Cortex M3(Silicon Labs EFM32GG380F1024)上使用FreeRTOX V9.0.0 . 当我通过GPIO Irq Handler使用TaskResumeFromISR时,我得到断言失败 .

断言中的断言在port.c(GCC ARM CM3)中的函数“void vPortValidateInterruptPriority(void)”中的行“configASSERT(ucCurrentPriority> = ucMaxSysCallPriority);”值为:ucCurrentPriority为0,ucMaxSysCallPriority为160 .

// NVIC CORTEX M3
#define configPRIO_BITS 3

// FreeRTOS Config
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ( 0x05 )
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

// port.c
ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; // ( ( 0x05 ) << (8 - ( 3 )) ) & 224 = 160

在用户代码中,当我读取中断优先级(我当前使用默认值“0”)时,除了由内核(PendSV和Systick)设置的2(7)之外,所有中断优先级都为零 .

// user code
prio = hal::nvic::getPriority(NonMaskableInt_IRQn); // =0
prio = hal::nvic::getPriority(HardFault_IRQn); // =0
prio = hal::nvic::getPriority(MemoryManagement_IRQn); // =0
prio = hal::nvic::getPriority(BusFault_IRQn); // =0
prio = hal::nvic::getPriority(UsageFault_IRQn); // =0
prio = hal::nvic::getPriority(SVCall_IRQn); // =0
prio = hal::nvic::getPriority(DebugMonitor_IRQn); // =0
prio = hal::nvic::getPriority(PendSV_IRQn); // =7
prio = hal::nvic::getPriority(SysTick_IRQn); // =7
prio = hal::nvic::getPriority(GPIO_EVEN_IRQn); // =0
prio = hal::nvic::getPriority(GPIO_ODD_IRQn); // =0
prio = hal::nvic::getPriority(USART1_RX_IRQn); // =0
prio = hal::nvic::getPriority(USART1_TX_IRQn); // =0
prio = hal::nvic::getPriority(LETIMER0_IRQn); // =0
prio = hal::nvic::getPriority(RTC_IRQn); // =0
prio = hal::nvic::getPriority(BURTC_IRQn); // =0

一旦我将中断优先级定义为7或更高,我就没有麻烦了 .

当我现在为每个中断定义每个优先级时,我可以使用哪些值(较低的是较高的优先级,我应该大于7,因为我的中断应该比内核具有更低的prio) .

那么我应该从8开始直到哪里?

谢谢

1 回答

  • 0

    中断优先级数越低,实际优先级越高 . 所以0是最高优先级 .

    我认为在EFM32GG上只有3个优先级位,因此可用优先级为0到7.(如果有4个优先级位,则可用优先级为0到15) .

    该优先级位被左移到最高位 . 因此,可用的优先事项是:

    • 0 << 5(0) - 最高 .

    • 1 << 5(32)

    • 2 << 5(64)

    • 3 << 5(96)

    • 4 << 5(128)

    • 5 << 5(160)

    • 6 << 5(192)

    • 7 << 5(224) - 最低

    有时5个未使用的位用零填充 . 因此,例如224具有与255相同的优先级,因为最低5位对处理器的操作没有影响(但是它们将影响断言) .

    您不能从优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断进行FreeRTOS API调用 . 但是,您可以更改此值以满足您的需求 .

相关问题