Cómo diseñar el temporizador de vigilancia que reinicia el sistema si el contador de vigilancia no se borra al menos cada 1/4 segundos

1

Este es el código que tengo para un LED verde que parpadea cada 2 segundos con el modo de vigilancia para MSP432.

#include "msp.h"

void main(void)
 {
     volatile uint32_t i;
     WDT_A->CTL = WDT_A_CTL_PW & 0xFF00;
     WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_IS_5;
     P2DIR |= BIT1;
     while (1) // continuous loop
     {
         P2OUT ^=BIT1; // Blink P1.0 LED
         for (i =6000000; i> 0; i--); // Delay with 3Mhz clock.
     }
 }

¿Cómo diseñar el temporizador de vigilancia que reinicie el sistema si el contador de vigilancia no se borra al menos cada 1/4 segundos?

    
pregunta dhruv

2 respuestas

0

La solución purista / mejor práctica es que su programa solo debe patear al perro guardián una vez, en la parte superior del bucle eterno en main (). Por lo tanto, la mejor práctica es esta:

void main (void)
{
  ...

  uint32_t count = 0;

  for(;;)
  {
    kick_dog();

    if(count < max)
    {
      blink_led();
      delay(n);
      count++;
    }
  } // for(;;)
}

Pero, por supuesto, los bucles de retardo de ocupado son una solución amateur en sí misma. El código profesional en su lugar utilizaría temporizadores de hardware en chip. Tales como:

void main (void)
{
  ...
  init_timer();
  ...

  uint32_t count = 0;
  timer_busy = false;

  for(;;)
  {
    kick_dog();
    led();
  }
}

static void led (void)
{
  if(!timer_busy)
  {
    blink_led();
    timer_busy = true;          
    start_timer(); // some hw timer that will clear the timer_busy flag from its ISR

    count++;
    if(count == max)
    {
      // do something
    }
  }
}
    
respondido por el Lundin
0

No estoy realmente familiarizado con el controlador MSP, pero la respuesta debería ser algo como esto:

#include "msp.h"

void main(void)
{
    volatile uint32_t i, j;
    WDT_A->CTL = WDT_A_CTL_PW & 0xFF00;
    WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_IS_5;
    P2DIR |= BIT1;
    while (1) // continuous loop
    {
        P2OUT ^=BIT1; // Blink P1.0 LED
        for (j = 8; j > 0; j--)
        {
             WDT_A->CTL = WDT_A_CTL_PW & 0XFF00;
             for (i = 750000; i > 0; i--);      // Delay with 3Mhz clock, 0,26s.
        }
    }
 }
    
respondido por el Mike

Lea otras preguntas en las etiquetas