Autor Tema: BusCAN y general exception handler  (Leído 2893 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
BusCAN y general exception handler
« en: 10 de Junio de 2014, 07:33:59 »
Buenas!!

tengo un problema que me está empezando a desesperar.

Tengo un programa para un pic32MX575f512h en el cual controlo el bus CAN y el SPI.

Cuando llevo un rato ejecutando el programa (el rato depende de la cantidad de paquetes que se envíen por el CAN) se me va a excepción tipo DBE (bus error (load/store)) y alguna que otra vez a IBE (bus error (ifetch))

He incrementado el tamaño del SP y del Heap por si era el tema, he revisado todas las variables de las funciones y no he encontrado ningún puntero no inicializado.

He comprobado esto "- When both prefetch and instruction cache are enabled, a Data Bus Exception (DBE) may occur if an interrupt is encountered by the CPU while it is accessing constant data (not instructions) from Flash memory." que viene en la erratas.

Y nada....

siempre me salta al salir de una rutina en la que compruebo los flags de envío y envío los datos.

Pero si comento la recepción o el envío del CAN no pasa nada.

El pic tiene alguna limitación por tiempo entre lectura y escritura del CAN? no me suena, pero es que ya no sé qué pasa....

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: BusCAN y general exception handler
« Respuesta #1 en: 10 de Junio de 2014, 17:14:58 »
he conseguido localizar el puntero que se va, pero no sé porqué.

Este es el código

Código: [Seleccionar]
BOOL CAN1RxMsgProcess( void){

    if (isCAN1MsgReceived == FALSE) {

        return FALSE;
    }

    isCAN1MsgReceived = FALSE;

    messageRX = (CANRxMessageBuffer *)CANGetRxMessage(CAN1,CAN_CHANNEL1);
   
    CANUpdateChannel(CAN1, CAN_CHANNEL1);
    CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, TRUE);

    return TRUE;
}

la variable isCAN1MsgReceived  se activa en la interrupción del can, si recibo algo y el puntero messageRX  está definido en la librería


el código va perfectamente salvo si recibo datos rápido, con 1s ya se va a la excepción

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: BusCAN y general exception handler
« Respuesta #2 en: 11 de Junio de 2014, 07:05:40 »
viendo el desensamblado, parece que no es lo que decía...

al parecer es al volver de una función en la que compruebo unos flags y si están activos envío por el CAN el dato correspondiente.

El problema es que salta la excepción independientemente si hay algún flag activo o no...

parece cosa del stack pointer, pero lo he incrementado y nada

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: BusCAN y general exception handler
« Respuesta #3 en: 11 de Junio de 2014, 09:38:58 »
creo que al fin lo he solucionado

definiendo la interrupción del can con prioridad 4 y el vector de la interrupción como 7  :shock: :shock: :shock: