Go Down

Topic: leOS - un semplice OS per schedulare piccoli task (Read 42 times) previous topic - next topic

pablos

no comment

leo72


versione che ho provato 2.1.1, ho preso l'ultima qui
http://www.leonardomiliani.com/?p=516

ciao

OK. Ti ringrazio. Investigherò il problema.

pablos

Se hai bisogno, mi mandi la lib modificata e te lo provo... ciao
no comment

leo72


Se hai bisogno, mi mandi la lib modificata e te lo provo... ciao

OK, grazie dell'aiuto. Prima però mi studio il datasheet: devo capire cosa c'è di differente nella gestione del WD tra il 2560 ed il 328.

leo72


Lo sketch di esempio leOS2_use_of_reset.ino mi ha creato per 2 volte il blocco dell'AVR sul mio 2560, entrambe le volte ho dovuto applicare la manovra di emergenza.

ciao

Ho studiato un po' la questione e sono giunto alla conclusione che il problema nasca dal bootloader della MEGA.
Per resettare il microcontrollore, la leOS2 utilizza lo stesso Watchdog: se si accorge che un task si blocca, aspetta il timeout e poi poi il Watchdog in modalità System Reset con un tempo di attesa di 30 ms, che genera appunto un reset del micro dopo tale periodo. Una volta riavviato lo sketch, la prima cosa che mi preoccupo di fare è il reset del circuito di Watchdog per evitare che resti acceso. Sull'Arduino UNO tale compito è facilitato dal fatto che il bootloader utilizza il Watchdog per impostare il tempo da attendere prima che qualcosa arrivi sulla seriale: se passa tale tempo senza arrivo di dati, resetta nuovamente il micro e fa partire subito lo sketch utente.
L'Arduino MEGA lavora invece in modo differente, e non inizializza il watchdog. Può essere che il circuito del watchdog resti attivo e continui quindi a resettare il microcontrollore. Prova aumentando il tempo di attesa prima del reset modificando la funzione reset() nel file leOS2.ccp (righe 229-234):

Code: [Select]

//reset the MCU
void leOS2::reset(void) {
    wdt_disable();
    wdt_enable(WDTO_30MS); //<--- MODIFICA QUESTO
    while(1){}; //wait for reset
}


Prova con
WDTO_4S
WDTO_2S
WDTO_1S
WDTO_500MS
WDTO_250MS
WDTO_120MS
WDTO_60MS

ecc...
Parti con un valore alto e guarda se riesci a superare il tempo che attende il bootloader. Ad occhio, ti serve un tempo pari o maggiore di 1 secondo, ma non ne sono certo: il codice del bootloader non è molto chiaro.
Se ce la fai, abbassa tale valore finché non ritorni ad avere il blocco della scheda.

Se non funziona neanche così, devo pensare ad un'altra soluzione.

Go Up