Tengo un error extraño en mi código que desaparece cuando intento depurarlo.Error de Schrödinger cuando se establece un punto de interrupción
En mi interrupción del temporizador (siempre corriendo ticker sistema) Tengo algo como esto:
if (a && lot && of && conditions)
{
some_global_flag = 1; // breakpoint 2
}
en mi bucle principal tengo
if (some_global_flag)
{
some_global_flag = 0;
do_something_very_important(); // breakpoint 1
}
Esta condición en el bucle principal nunca es llamado cuando las condiciones en el temporizador están (creo) cumplidas. Las condiciones son externas (portpins, resultados de ADC, etc.). Primero puse un punto de interrupción en la posición 1, y nunca se desencadena.
Para verificarlo, puse breakpoint nr. 2 en la línea some_global_flag = 1;
, y en este caso el código funciona: ambos puntos de interrupción se activan cuando las condiciones son verdaderas.
Actualización 1:
Para investigar si alguna condición de tiempo es responsable, y la if
en el temporizador no se introduce si se ejecuta sin depurar, añadí lo siguiente en mi contador de tiempo:
if (a && lot && of && conditions)
{
some_global_flag = 1; // breakpoint 2
}
if (some_global_flag)
{
#asm("NOP"); // breakpoint 3
}
La bandera no se usa en ningún otro lado en el código. Está en la RAM, y la RAM se borra a cero al comienzo.
Ahora, cuando todos los puntos de interrupción están desactivados (o solo está habilitado el punto de interrupción 1 en el principal), el código no funciona correctamente, la función no se ejecuta. Sin embargo, si habilito solo el punto de interrupción 3 en el NOP, ¡el código funciona! El punto de interrupción se activa y, después de continuar, se ejecuta la función. (Tiene salida visible y audible, por lo que es evidente si se ejecuta)
Actualización 2:
la interrupción de temporizador fue interrumpible, por medio de un "SEI" en su comienzo. Eliminé esa línea, pero el comportamiento no se modifica de manera notable.
Actualización 3:
No estoy usando cualquier memoria externa. Como estoy muy cerca del límite en el flash, tengo la optimización de tamaño en el compilador al máximo.
¿Puede el compilador (CodeVision) ser responsable, o hice algo muy mal?
¿Hay alguna manera de intentar agregar algún tipo de registro, en lugar de establecer puntos de interrupción? Normalmente dudaría en sugerir eso, pero en este caso puede ser menos perturbador para el sistema. En particular, lo que registraría es el estado de sus condiciones en cada pasada a través del código de interrupción del temporizador. –
¿Cómo se define some_global_flag? ¿Estás usando 'volatile int some_global_flag'? – DipSwitch
¿Está usando memoria externa? ¿O solo la SRAM interna? ¿Qué chip estás usando exactamente? – DipSwitch