NVIC用户中断优先级

时间:2018-05-22 16:45:02

标签: freertos cortex-m3

我在Cortex M3上使用FreeRTOX V9.0.0(Silicon Labs EFM32GG380F1024)。 当我通过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”)时,我得到的所有中断优先级都为零,除了2 由内核(PendSV和Systick)设置的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或更高,我就不会有麻烦了。

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

所以我应该从8开始直到哪里?

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

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

  • 0&lt;&lt; 5(0) - 最高。
  • 1&lt;&lt; 5(32)
  • 2&lt;&lt; 5(64)
  • 3&lt;&lt; 5(96)
  • 4&lt;&lt; 5(128)
  • 5&lt;&lt; 5(160)
  • 6&lt;&lt; 5(192)
  • 7&lt;&lt; 5(224) - 最低

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

您无法从优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断进行FreeRTOS API调用。但是,您可以根据需要更改此值。