We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I have task waiting on event flags that are triggered from ISR base on TX buffer empty or RX frame received. But I am observing RTOS locking up after a random period ranging from 5 min to few hours. I am not able to figure out why RTOS would be locking up. Using the debugger I can see SysTickTimer not increment, tasks don't switch, no hard faults but ISRs (timers & uarts) triggering.
If I do not receive any data on this uart, no lockups ever. Sending is very busy but data received is very tiny (50-100 bytes/5sec). Uart runs @1MBit baudrate. I have narrow down issue to receiving any data on this uart.
I will appreciate any insight on this issue. Here is the part of the code:
/** * */ #ifdef USART2 void USART2_IRQHandler(void) { static uint8_t ChB; if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) { if (CBUF_Getch(&UsartBOutCBuf, &ChB)) { USART_SendData(USART2, ChB); } else { // Uart TX buffer empty, Set event for task to check if endpoints have data to be send. isr_evt_set(EVT_FLG_SMPP, TASKID_SMPP); USART_ITConfig(USART2, USART_IT_TXE, DISABLE); } } if((USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) || (USART_GetITStatus(USART2, USART_IT_ORE) != RESET)) { ChB = USART_ReceiveData(USART2); CBUF_Putch(&UsartBInCBuf, ChB); if (1 == SMPP_CheckFrame(ChB)) { // SMPP frame received, Set event for task to read frame, parse and write data to endpoint. isr_evt_set(EVT_FLG_SMPP, TASKID_SMPP); } } } #endif /** * */ __task void task_smpp(void) { OS_RESULT result; uint16_t myTaskId; const uint16_t strLen = 64; uint8_t str[strLen]; int8_t byte; uint16_t indx; myTaskId = TASKID_SMPP; for (;;) { TASKCNT_SMPP++; result = os_evt_wait_or (EVT_FLG_SMPP, 1000); if (result == OS_R_TMO) { //postLog ( LogTag_SMPP, "In task_smpp - OS_R_TMO \r\n" ); } else { // Event received //postLog ( LogTag_SMPP, "In task_smpp - OS_R_EVT \r\n" ); SMPP_WriteFrame(); SMPP_ReadFrame(); } } }