Lo segundo es que las interrupciones estaban declaradas asi "__attribute__((interrupt, no_auto_psv))" y se lo cambie por "__attribute__((interrupt, auto_psv))", me comento un compañero que vio esto en alguna parte y decía que así debería ir, la verdad no se por que, pero bueno, se lo cambiamos, si alguien sabe el por que, seria bueno que compartiera la información.
El PSV ( Program Space Visibility ) lo que hace es mapear un espacio de la memoria flash como si tuviera la direccion de memoria RAM, De esa forma para el micro es como si hubieras datos en la RAM. Si recordas en los PIC18 estos datos ubicados en la flash debian ser accedido por tablas. Una ves que seteas el la pagina que queres ver en la RAM accedes como si leyeras simplemente una memoria.
El
no_auto_psv, hace que esta pagina elegida ( registro PSVPAG ) no se modifique para nada. Mientras que el
auto_psv, hace que al entrar a la interrupcion se guarde el valor de pagina anterior, se introduzca la que vaya a ser usada y finalmente al salir se reestablezca. O por asi decirlo uno manejado por el compilador y el otro de forma manual.
De todas formas para que una variable sea accedida por desde el PSV, tengo entendido que uno debe definirla de un modo especial:
__psv__ uint32_t __attribute__((space(psv))) VariableGuardadaEnFlash = 10; // Variable guardada en Flash
__psv__ uint32_t * ptr; // Puntero guardado en RAM, pero usada para acceder al PSV
Y mas que obvio no solo se encuentra en el espacio PSV ( lo cual hace que las instrucciones que se usan sean las mismas que la RAM ) sino tambien que son constantes, no pueden ser modificadas. Por obvias razones.
Como debo imaginar no creo que tengas variables creadas en un espacio PSV (ya que sino no preguntarias por el mismo

), por lo cual aca no creo que este el error.
Lo primero es no optimizar todo el código, solo optimizamos algunos métodos, esto se realiza colocándole "__attribute__((optimize("-O1")))" al inicio del nombre del método.
El tema esta para mi con un problema de codigo y no lo anterior. Seguramente le falte algun "volatile" en alguna variable y eso es el problema ( o tal ves hay otro problema latente en el codigo), que al usar optimizaciones termina dejando de funcionar como debe y sin las optimizaciones funciona correctamente o falla menos seguido. O tal ves el compilador la este arruinando.
De todas formas, cuando funciona y por mas que sea feo no se toca mas. Es la ley de la vida.
PD: Para aprender mas del PSV:
PIC24/dsPIC:Section 3. Data Memory
Section 4. Program Memory
XC16:MPLAB® XC16 C Compiler User’s Guide