Go Down

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

leo72


Che il wdt_enable(WDTO_4S); non funzionasse sulla mega già lo avevi affrontato ti ricordi di questa discussione?
http://arduino.cc/forum/index.php?topic=108620.0

Non mi ricordavo di questo bug. Non avendo la MEGA, era una problematica affrontata in quella discussione e poi scordata del tutto.

Quote

magari c'e' qualche link che può servirti, sembrerebbe che bisogna caricare un altro bootloader
Comunque da quando leggo in giro, nessuno è riuscito a fare sto benedetto reset usando WDT sul 2560, senza toccare il bootloader

Sì, esatto. Ma di questo me n'ero accorto anch'io. Ti avevo infatti già detto che una delle differenze del bootloader della MEGA rispetto all'Optiboot stesse proprio nel fatto che l'Optiboot resetta il Watchdog di suo perché poi lo usa come timeout.
Ad abbondanza, ho trovato anche un'altra discussione su un altro forum in cui si parla di un problema identico al tuo:
http://www.electroyou.it/phpBB2/viewtopic.php?f=17&t=32610
Usando una 2009 la scheda non si resetta ma va in blocco proprio quando dovrebbe venir resettata dal WDT. Questo mi fa pensare che questa caratteristica non possa essere usata su chip dove c'è un bootloader che non prevede la disabilitazione del watchdog al suo riavvio. Per contro, un chip standalone senza bootloader non soffre di questi problemi (vedi il mio test con un Tiny85) né l'Arduino UNO né la LEONARDO per via del fatto che i loro bootloader resettano il watchdog.

Quindi con la MEGA devo per forza usare il jmp $0000 al posto del watchdog per resettare la scheda.

leo72

Prova la versione allegata.
E' la 2.1.3. Ho inserito un check per cui se trova un certo #define, sa di avere a che fare con una Arduino MEGA e dovrebbe usare il jmp $0000 al posto del reset HW. Non è un reset HW , quindi al micro non viene mandato il segnale di reset ma viene fatta ripartire l'esecuzione del programma in memoria (bootloader compreso).
Per far ciò inserisci questa riga:
Code: [Select]
#define ARDUINO_MEGA
prima dell'inclusione della leOS2.

Quindi lo sketch di test "leOS2_reset_after_timeout" deve iniziare così:
Code: [Select]
#define ARDUINO_MEGA
#include "leOS2.h" //include the scheduler
leOS2 myOS; //create a new istance

Fammi sapere.

pablos

Ho cambiato la CPP e aggiunto la riga #define ARDUINO_MEGA, compila, tutto ok ma mi addolora dirtelo si inchioda ancora dopo il 3 lampeggio.  :smiley-sweat:

ho visto che hai aggiunto questo

#ifdef ARDUINO_MEGA
   __asm__ __volatile__ ("jmp 0x0000");

ma con il jump a 0x0000 dici al micro di ricaricare il boot dalla posiz di memoria 0?

ciao
no comment

leo72


ma con il jump a 0x0000 dici al micro di ricaricare il boot dalla posiz di memoria 0?

Dico al micro di riavviare il programma. Siccome nella locazione $0000 c'è il jump all'inizio del codice eseguibile (allo sketch se non c'è il bootloader, a quest'ultimo se invece esso è presente) in pratica dovrei riavviare l'esecuzione del firmware. Se mi dici che non va, sono ad un vicolo cieco....  8)

leo72

Mi puoi fare un ultimo tentativo col file .cpp allegato?

Go Up