Не удалось прочитать приоритет прерывания после vTaskStartScheduler () - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу использовать функцию NVIC_GetPriority(DMA1_Channel4_IRQn) с FreeRtos.Я могу использовать эту функцию до 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 () start?Спасибо теперь.

1 Ответ

0 голосов
/ 20 декабря 2018

Я не знаю, какой микроконтроллер вы используете, но иногда printf использует прерывания для отправки символов через UART и т.п., если вы делаете это критическим разделом, который означает, что прерывание никогда не сработает.Закомментируйте критические строки раздела, чтобы увидеть, так ли это.

Другая возможность состоит в том, что у вас включен MPU (модуль защиты памяти), и он не разрешает доступ к регистрам NVIC из пользовательской задачи.AFAIK FreeRTOS поддерживает MPU в микроконтроллерах Cortex-M, проверьте, включен ли он в вашем случае.

...