PIC32 bloqueado después de mucho tiempo

0

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.

    
pregunta Delusion

1 respuesta

2

Resultó que la memoria dinámica era de hecho el problema. Terminé usando la implementación de ringbuffer documentada aquí: enlace

    
respondido por el Delusion

Lea otras preguntas en las etiquetas