我想在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()开始有任何建议吗?从现在开始谢谢。
答案 0 :(得分:-2)
我不知道您使用的是什么微控制器,但是有时printf
使用中断来通过UART等发送字符,如果您将其设为关键部分,则意味着该中断将永远不会触发。注释掉关键部分的行,以查看是否是这种情况。
另一种可能性是您已启用MPU(内存保护单元),并且不允许用户任务访问NVIC寄存器。 AFAIK FreeRTOS支持Cortex-M微控制器中的MPU,请检查您是否启用了该功能。