Estoy usando un PIC32MX795F512L que envía mensajes CAN a un módulo WiFly (RN-171) usando UART.
Recibo mensajes a través de WiFi, pero después de un tiempo más largo (20-60 minutos), parece que el PIC está bloqueado y tengo que restablecerlo. A continuación se muestra el código para la inicialización de UART, la cola de mensajes y el envío de mensajes.
Se llama a TCPSending () cada 200 ms en una rutina de interrupción y se llama a PutInTXBuffer () cada vez que se recibe un mensaje CAN (y luego la ID y los datos se pasan a la función PutInTXBuffer).
void InitUART()
{
UARTConfigure(UART1, UART_ENABLE_PINS_TX_RX_ONLY);
UARTSetFifoMode(UART1, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
UARTSetLineControl(UART1, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
UARTSetDataRate(UART1, GetPeripheralClock(), 57600);
UARTEnable(UART1, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
}
void TCPSending()
{
if(UARTTransmitterIsReady(UART1) && U1STAbits.UTXBF == 0)
{
int i;
for (i = 0; i < TXelements; i++)
{
putcUART1(WiFiTXBuffer[i].id >> 8);
putcUART1(WiFiTXBuffer[i].id);
putcUART1(WiFiTXBuffer[i].data >> 56);
putcUART1(WiFiTXBuffer[i].data >> 48);
putcUART1(WiFiTXBuffer[i].data >> 40);
putcUART1(WiFiTXBuffer[i].data >> 32);
putcUART1(WiFiTXBuffer[i].data >> 24);
putcUART1(WiFiTXBuffer[i].data >> 16);
putcUART1(WiFiTXBuffer[i].data >> 8);
putcUART1(WiFiTXBuffer[i].data);
}
free(WiFiTXBuffer); // Deallocate the buffers memory
WiFiTXBuffer = NULL; // Re-initialize the buffer
TXelements = 0; // Keeps track of the number of elements used
TXallocated = 0; // This is essentially how large the array is
}
}
void PutInTXBuffer(WORD id, QWORD data)
{
int MoreAllocation = 50;
WiFiTXPacket packet;
packet.id = id;
packet.data = data;
if(TXelements == TXallocated) // Are more refs required?
{
TXallocated += MoreAllocation;
// Make the reallocation transactional by using a temporary variable first
void* temp = realloc(WiFiTXBuffer, (TXallocated * sizeof(WiFiTXPacket)));
// If the reallocation fails:
if (!temp)
{
TXallocated -= MoreAllocation;
}
WiFiTXBuffer = (WiFiTXPacket*)temp;
free(temp);
temp = NULL;
}
WiFiTXBuffer[TXelements] = packet;
TXelements++;
}
Creo que el problema tiene que ver con una pérdida de memoria, pero parece que no puedo encontrarlo.