vTaskStartScheduler()之后无法读取中断优先级

时间:2018-12-12 14:52:00

标签: microcontroller stm32 freertos rtos

我想在FreeRtos中使用NVIC_GetPriority(DMA1_Channel4_IRQn)函数。我可以在vTaskStartScheduler();之前使用此功能,但是当我在NVIC_GetPriority(DMA1_Channel4_IRQn)之后调用vTaskStartScheduler();函数时,它不起作用,您有什么建议吗?

#include <FreeRTOS.h>
#include <queue.h>
#include <task.h>
/* -- */
static void vTest_NVIC( void *pvParameters )
{
 tprintf("\r\nTask Started..."); 
  /* -- */
  while(1) {
    /* -- */   
    taskENTER_CRITICAL();  
    tprintf("\r\npriority= %d",NVIC_GetPriority(DMA1_Channel4_IRQn));   
    taskEXIT_CRITICAL();
    vTaskDelay(3000);;      
  }
}
int main()
{
  portBASE_TYPE xReturn;        
  /* -- */
  xReturn = xTaskCreate ( vTest_NVIC, ( const signed portCHAR * const )"Test_NVIC", configMINIMAL_STACK_SIZE<<4, NULL, tskIDLE_PRIORITY, NULL );
  if( xReturn != pdPASS ) {
    tprintf("\n\rTest_NVIC initilisation problem.\n\r");
  }

  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_SetPriorityGrouping(3);
  /* DMA1 Channel4 interrupt setting */
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 11;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);   

  tprintf("\r\npriority= %d",NVIC_GetPriority(DMA1_Channel4_IRQn));   
  /* Now all the tasks have been started - start the scheduler. */
  vTaskStartScheduler();

程序的输出就是这样。

priority= 11

Task Started...

您对读取中断优先级aftevTaskStartScheduler()开始有任何建议吗?从现在开始谢谢。

1 个答案:

答案 0 :(得分:-2)

我不知道您使用的是什么微控制器,但是有时printf使用中断来通过UART等发送字符,如果您将其设为关键部分,则意味着该中断将永远不会触发。注释掉关键部分的行,以查看是否是这种情况。

另一种可能性是您已启用MPU(内存保护单元),并且不允许用户任务访问NVIC寄存器。 AFAIK FreeRTOS支持Cortex-M微控制器中的MPU,请检查您是否启用了该功能。