Hi,
We are running FreeRTOS and FreeRTOS TCP IP Stack on TI uController TM4C129 series.
We have only one task (we call task1) with priority of tskIDL_PRIORITY other than the FreeRTOS_IPInit task.
Task1 has bunch of items to take care of at 250m sec. Task1 also blinks an LED and gives us a visual indication that the task1 is running.
We are able to communicate with the device remotely using FreeRTOS-TCP Stack using UDP-IP protocol and initially the program runs without any issue. We collect data from the device at approximately 30Hz via Ethernet.
However we have noticed the Task1 will stop running after 24-30 hours while the device still communicate on UDP-IP to the remote server.
Here is how I initiate the Task1 and the FreeRTOS_IPInit().
xTaskCreate(Task1, (const portCHAR *)"Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
FreeRTOS_IPInit( ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress );
vTaskStartScheduler();
Following is the call back associated with Task 1;
void Task1(void *p)
{
for (;;)
{
Faults_Status = I2C_read(IOChip_I2C_BASE, IOChip_I2C_CHIP_ADDRESS, IOChip_I2C_INPORT0);
IntADC_Collect_Data(IntADCRawData);
//Read variables
Fan1.data.value16bits = 0x0000FFFF & IntADCRawData[4];
Fan2.data.value16bits = 0x0000FFFF & IntADCRawData[3];
volt3.data.value16bits = 0x0000FFFF & IntADCRawData[2];
volt5.data.value16bits = 0x0000FFFF & IntADCRawData[1];
volt15.data.value16bits = 0x0000FFFF & IntADCRawData[0];
if(GPIOPinRead(ComMode_PORT,COM_MODE_PIN) == LOCAL)
{
ComMode = LOCAL;
GPIOPinWrite(ComMode_PORT,COM_REMOTESTATUS_PIN,0);
GPIOPinWrite(ComMode_PORT,COM_LOCALSTATUS_PIN,COM_LOCALSTATUS_PIN);
}
else
{
ComMode = REMOTE;
GPIOPinWrite(ComMode_PORT,COM_LOCALSTATUS_PIN,0);
GPIOPinWrite(ComMode_PORT,COM_REMOTESTATUS_PIN,COM_REMOTESTATUS_PIN);
}
if(ComMode == LOCAL)
{
if(Reset_PS_Flag == 1)
{
Reset_PS_Flag = 0;
GPIOPinWrite(PS_PORT1,PS_RESET_PIN,0);
vTaskDelay(1/portTICK_PERIOD_MS);
GPIOPinWrite(PS_PORT1,PS_RESET_PIN,PS_RESET_PIN);
DAC_Init();
}
if(OnOff_PS_Flag == 1 )
{
OnOff_PS_Flag = 0;
if(PS_Status == PS_OFF){Switch_PS_ON();}
else {Switch_PS_OFF();}
}
}
if(EncoderServiceReqFlag == 1)
{
switch (EncoderServiceReqType)
{
case EncoderCW:
if(Iref_SetType == 0){ DAC_SetVal += DAC_FineSetVal; }
else{ DAC_SetVal += DAC_CoarseSetVal; }
if(DAC_SetVal > DAC_MaxVal){DAC_SetVal = DAC_MaxVal;}
DAC_Write(DAC_DACREG, DAC_SetVal);
break;
case EncoderCCW:
if(DAC_SetVal != DAC_MinVal) //Make sure the counter doesnt go bellow 0x0 as it will result in negative value.
{
if(Iref_SetType == 0){ DAC_SetVal -= DAC_FineSetVal; }
else{ DAC_SetVal -= DAC_CoarseSetVal; }
if((DAC_SetVal <= 8191) | DAC_SetVal >= DAC_MaxVal){DAC_SetVal = DAC_MinVal;}
}
DAC_Write(DAC_DACREG, DAC_SetVal);
break;
case EncoderMBtn:
Iref_SetType = ~Iref_SetType;
break;
default:
break;
}
EncoderServiceReqFlag = 0;
}
LED1_HIGH;
vTaskDelay(50/portTICK_PERIOD_MS);
LED1_LOW;
//counter += 1;
vTaskDelay(200/portTICK_PERIOD_MS);
}
}
Please note the following defines in FreeRTOSConfig.h. Specially the Stack size and Heap size.
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 500 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 128*1024 ) )
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1
#define INCLUDE_eTaskGetState 1
#define INCLUDE_pcTaskGetTaskName 1
#define INCLUDE_xTaskGetSchedulerState 1
Please note above INCLUDE_vTaskCleanUpResources is set to 0.
I thank you all for your time and help.

