FreeRTOS Support Archive
The FreeRTOS support forum is used to obtain active support directly from Real
Time Engineers Ltd. In return for using our top quality software and services for
free, we request you play fair and do your bit to help others too! Sign up
to receive notifications of new support topics then help where you can.
This is a read only archive of threads posted to the FreeRTOS support forum.
The archive is updated every week, so will not always contain the very latest posts.
Use these archive pages to search previous posts. Use the Live FreeRTOS Forum
link to reply to a post, or start a new support thread.
[FreeRTOS Home] [Live FreeRTOS Forum] [FAQ] [Archive Top] [February 2014 Threads]
I transplant FreeRTOS to the HT32 that a chip like STM32. I want use UART interrupt to receive some data, but when the routine run to the UART interrupt routine it can not jump out the interrupt routine ,it just run the interrupt routine over and over. What's the problem?
That a part of my config in FreeRTOS.h:
define configKERNELINTERRUPTPRIORITY 255
define configMAXSYSCALLINTERRUPT_PRIORITY 191
define configUSE_MUTEXES 1
define configUSECOUNTINGSEMAPHORES 1
And a part of my code:
void NVICConfiguration(void)
{
NVICSetVectorTable(NVICVECTTABLEFLASH, 0x0);
NVICSetPriorityGrouping(NVICPRIORITYGROUP3);// Preemption: 4 bits / Subpriority: 0 bits
NVICSetPriority(USART1IRQn, NVICEncodePriority(NVICPRIORITYGROUP3, 12, 0));
}
xSemaphoreHandle xhighSemaphore;
void vultrasonicTask(void *pvParameters)
{
char i=0;
char HDATA=0;
char LDATA=0;
u16 high;
xhighSemaphore = xSemaphoreCreateCounting( 10, 0 );
while(1)
{
USARTSendData(USART1,0x55 );
xSemaphoreTake( xhighSemaphore, 500 / portTICKRATEMS );
if(i==0)
{
HDATA=USARTReceiveData(USART1);
i++;
return;
}
if(i==1)
{
LDATA=USARTReceiveData(USART1);
i--;
high=(HDATA<<8)+LDATA;
printf("high=%drn",high);
}
vTaskDelay( 1000 / portTICKRATEMS );
}
}
void USART1IRQHandler(void)
{
static portBASETYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR( xhighSemaphore, &xHigherPriorityTaskWoken );
portENDSWITCHINGISR(xHigherPriorityTaskWoken );
}
Presumably that is because you are not clearing the interrupt so it is immediately retaken as soon as you exit the handler. What makes you think the problem is related to FreeRTOS?
Generally the ISR needs to do the immediate actions that trigger the interrupt. That generally includes for a serial port getting the character and putting it some where. (This doesn't apply for using DMA, but then when you use DMA, you don't get character ready interrupts, you get DMA complete interrupts).
The ISR could put the character in a queue if the data rate is somewhat slow. For faster channels it should build up a "message" and on receipt of a complete message signal a task to process it.
If I did not use the FreeRTOS API in the interrupt routine, it display normal. But when I use the FreeRTOS API in the interrupt routine the problem came. So I think it may related to FreeRTOS.
Thank you very much! I solved the problem in your reminder!
I had solved the problem. Proof by facts, the problem is not related to FreeRTOS. It is because i didn't get the character and put it some where. Thank you for you answer.
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.