astrobeed:
Per me state usando un approccio sbagliato, potete mettere tutti i delay che volete però non serve a nulla per il semplice motivo che il bootloader si aspetta di vedere dei dati sulla seriale per attivarsi, solo se per un certo tempo non arriva nulla cede il controllo al programma principale.
Dato che in questo caso specifico la seriale è connessa ad un bus dati con un certo traffico alla fine il bootloader vedrà sempre arrivare dei byte con la conseguente attivazione e blocco della scheda.
La soluzione è una sola, il bootloader si deve attivare solo se riceve una ben precisa sequenza di caratteri entro un certo timeout, p.e. la stringa "@***#", va da se che poi tocca usare uno script per inviare questa stringa e subito dopo far partire AvrDude per la programmazione, il timeout del bootloader dovrebbe essere di almeno 1 secondo per dare modo ad AvrDude di partire.
non sono d'accordo. anzi, ho osservato il codice ed è più facile del previsto.
lasciamo intatto il codice che abbiamo visto fin'ora. riceveremo il carattere che fa entrare il boot-loader in stato di programmzione (boot_state==1).
osserviamo questa parte di codice;
- notiamo che il ciclo è condizionato da isLeave
- ciclo che legge un byte fino a formare un comando
- switch che contrlla il comando.
notamo nello switch 2 cose interessanti:
a. il comando
case CMD_LEAVE_PROGMODE_ISP:
isLeave = 1;
//* fall thru
b. il caso default:
default:
msgLength = 2;
msgBuffer[1] = STATUS_CMD_FAILED;
break;
iniziamo a dire di uscire dal while se trova un comando che non è valido:
default:
msgLength = 2;
msgBuffer[1] = STATUS_CMD_FAILED;
isLeave = 1; //<<<<<<< modified by lesto, start sketch if command not found
break;
ora passiamo al ciclo acquisiszione comando. (che nel ciclo è precedente, riga 571)
come si può notare il ciclo è condizionasto da while ( msgParseState != ST_PROCESS )
e nello switch, in caso che il comando rilevato sia erroneo, viene azzerato tutto il processo di lettura messaggio attarverso l'istruzione
msgParseState = ST_START;
ma noi non vogliamo che lui ricominci la lettura, quindi nei vari casi dello switch sostituiamo il reset del comando con invece il termine comando:
msgParseState = ST_PROCESS;
i casi da modificare sono ST_GET_SEQ_NUM, ST_GET_TOKEN, ST_GET_CHECK
ed ecco che il nostro boot-loader sarà molto schizzinoso sui comandi che gli arrivano: mentre prima un comando che arrivava con sequenza o sintassi errata veniva scartato e ci si metteva in attesa del prossimo comando, ora si esce dai vari cicli e si procede ad eseguire il codice utente.