usando exit (EXIT_SUCCESS) o exit (EXIT_FAILURE) en AVR o cualquier otro microcontrolador

0

¿Cómo se usa exit(EXIT_SUCCESS) o exit(EXIT_FAILURE) en la programación C del microcontrolador? Sé que funciona en programas de nivel de aplicación C cuando incluyes #include<stdlib.h> .

La idea es salir del bucle principal por completo cuando se devuelve algún valor inesperado, por ejemplo. ¿Cuál sería exactamente el enfoque común en tal caso? Podría hacer un reinicio, pero quiero ver si algo salió mal en la pantalla principal. ¿Es una buena práctica usar goto: exit_main o algo similar?

    
pregunta Abel Tom

2 respuestas

3

exit() no es la forma correcta de manejar resultados inesperados en plataformas integradas. Podría usarlo, pero causará un reinicio del sistema. Ya sea por diseño o por el tiempo de espera del perro guardián. O simplemente ingrese un bucle infinito.

Por ejemplo, ARM hará esto, después de algunos saltos de salida de la biblioteca.
(ver por ti mismo en el simulador)

_sys_exit:
0x08000258 4901      LDR      r1,[pc,#4]  ; @0x08000260
0x0800025A 2018      MOVS     r0,#0x18
0x0800025C BEAB      BKPT     0xAB
0x0800025E E7FE      B        0x0800025E
0x08000260 0026      DCW      0x0026
0x08000262 0002      DCW      0x0002

BKPT está codificado punto de quiebre Además, la instrucción B aquí formará un bucle infinito.

En los errores críticos que no se pueden recuperar, puede hacer NVIC_SystemReset() en el brazo, o dejar que se agote el tiempo de vigilancia. Creo que AVR, como se menciona en una respuesta, no tiene un bit de restablecimiento del sistema dedicado.

    
respondido por el Jeroen3
3

C11 5.1.2.1 (2)

  

El efecto de la terminación del programa en un entorno independiente está definido por la implementación.

exit () puede o, puede que no, hacer lo que quieras.

enlace

parece que se detendrá un poco.

si desea reiniciar, haga esto en su lugar:

enlace

código:

#include <avr/wdt.h>

...

#define soft_reset()        \
do                          \
{                           \
    wdt_enable(WDTO_15MS);  \
    for(;;)                 \
    {                       \
    }                       \
} while(0)

Otros microcontroladores tendrán otros medios para realizar un reinicio activado por software.

    
respondido por el Jasen

Lea otras preguntas en las etiquetas