Scusate ma qual'è l'obbiettivo?
Rendere sordo il bootloader per tot tempo?
Con sordo intendo che anche se gli arrivano dati esso non li prende in considerazione per x secondi.
Questo è il codice originale che ho io.
ps. non so se è lo stesso che avete voi.
// siamo nel main
// Non ho idea se BLINK_LED_WHILE_WAITING è definito sulla riga di comando di GCC,
// ma supponiamo che boot_timeout è 20000
#ifdef BLINK_LED_WHILE_WAITING
boot_timeout = 20000; //* should be about 1 second
// boot_timeout = 170000;
#else
boot_timeout = 3500000; // 7 seconds , approx 2us per step when optimize "s"
#endif
// boot_state deve essere 0 per rimanere intrappolato qui
while (boot_state==0)
{
while ((!(Serial_Available())) && (boot_state == 0)) cicla fintanto che boot_state è zero && non cè niente nel serial buffer
{
_delay_ms(0.001); // per eseguire questa istruzione ci vuole 1us
boot_timer++;
if (boot_timer > boot_timeout)
{
boot_state = 1; // (after ++ -> boot_state=2 bootloader timeout, jump to main 0x00000 )
}
#ifdef BLINK_LED_WHILE_WAITING
if ((boot_timer % 7000) == 0)
{
//* toggle the LED
PROGLED_PORT ^= (1<<PROGLED_PIN); // turn LED ON
}
#endif
}
_delay_ms(1000); // non originale: aspetta 1 secondo prima di incrementare boot_state
boot_state++; // ( if boot_state=1 bootloader received byte from UART, enter bootloader mode)
}
if (boot_state==1)
{
//* main loop
Si esce dal ciclo sulla seriale solo se arriva un dato, allora aspetta 1 secondo circa e incrementa boot_state che comporta l'uscita
dal primo while. Purtroppo si deve aumentare anche il boot_timeout che deve essere maggiore di un secondo o comunque superiore a valore impostato qui _delay_ms(1000); // non originale: aspetta 1 secondo prima di incrementare boot_state.
mmm... non funge neanche così perchè rimangono dati nel buffer e alla fine il risultato è che parte il bootloader ma con ritardo, ma parte comunque.
Ciao.