9 votos

Programación de MCU: la optimización de C ++ O2 se rompe mientras se repite

Sé que la gente dice de optimización de código sólo debe llevar a cabo el oculto error en el programa, pero me escuches. Yo me quedo en una pantalla, hasta que la entrada a través de una interrupción se cumple.

Aquí es lo que yo veo en el depurador. Observe la línea inspeccionado y el valor de la expresión interceptado. enter image description here

Código de la imagen:

//...
ui::Context::addEventListener(ui::EventType::JOYSTICK_DOWN, &constant_dynamic_handler);

while (true) {
    if (choice != 0) //debugger pause
        break;
}

ui::Context::removeEventListener(ui::EventType::JOYSTICK_DOWN, &constant_dynamic_handler);

if (choice == 1) goto constant;
else if (choice == 2) goto dynamic;
else if (choice == 3) goto reset;
else if (choice == 4) goto exit;
//...

//debugger view: 
//expression: choice
//value: 1

El constant_dynamic_handler es una función lambda declarado anteriormente, que solo cambia de choice a algunos entero distinto de 0. El hecho de que yo pueda hacer una pausa en el bucle significa que el bucle no está terminada, pero el valor es, de hecho, ha cambiado. Yo no paso más de un paso en el depurador como se podrá leer la memoria en la CPU y requiere un reinicio para la depuración de nuevo.

choice se declara simplemente en el mismo ámbito como el si-bloque de instrucción, como int choice = 0;. Es alterado sólo dentro de una interrupción de escucha activa con una entrada de hardware.

El programa trabaja con O0 indicador en lugar de O1 o O2.

Estoy usando NXP K60 y c++11, si es necesario. Es mi problema? Podría ser cualquier cosa que yo no soy consciente de que? Soy un principiante en el MCU de programación, y este código funciona en el escritorio(Solo probado, no funciona).

55voto

chrisbunney Puntos 228

El optimizador de código ha analizado el código y, por lo que puede ver, el valor de choice nunca cambiará. Y dado que nunca cambiará, no tiene sentido verificarlo en primer lugar.

La solución es declarar la variable volatile para que el compilador se vea obligado a emitir código que verifique su valor independientemente del nivel de optimización utilizado.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X