leOS - un semplice OS per schedulare piccoli task

Fatto, mi spiace, non va neanche questo. Meno male che la manovra di emergenza va quasi sempre alla prima. :~

Lascia stare Leo anche se ormai mi sa che per te è diventata una questione personale e di completezza :). Purtroppo non so come aiutarti non conosco i micro così nel dettaglio.

ciao

PS.

Ho cercato un po' qua e la "mega 2560 WDTO reset" e sono capiato qui http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=7318&start=0

in fondo c'e' un pezzetto di sketch

e ho messo su questo velocemente che funziona ... fa il reset della Mega 2560 quando chiamo la reset(), non credo proprio faccia il controllo del blocco tramite watchdog.
non è la stessa cosa di quella che hai fatto tu, ma potrebbero esserci dati che possono indirizzarti o adattarlo alla tua lib, ad esempio perchè usa 0x000000 invece di 0x0000 non so se cambia molto

oppure cos'è quell EIND=0 (che ho provato a levarlo e resetta lo stesso :slight_smile: )

//#include <io.h>
const byte LED = 40; 

void setup() {
    delay(1000);
    Serial.begin(9600);
    Serial.println("Sono nel void setup");
    pinMode(LED, OUTPUT); //pin as output  
    blink3times();   
}

void blink3times() {
    for (byte i=0; i<3; i++) 
    {
        digitalWrite(LED, HIGH);
        delay(250);
        digitalWrite(LED, LOW);
        delay(250);
        Serial.println((String)i);
    }
      reset();
}

void loop() {
}

void reset( void )
{
  Serial.println("Sono nel void reset");
  delay(500);
  //EIND = 0;
  ((void (*)())0x000000)();
  Serial.println("Non dovrebbe stampare niente"); //infatti di qui non ci passa .. non stampa
}

wow FUNZIONA!!
Ho pasticciato un po' la tua lib cercando quale riga dava noia, nostante abbia messo #define ARDUINO_MEGA nello sketch ho come l'impressione che passasse lo stesso da quel #else che è messo per gli altri arduini, mi si inchiodava sempre. Però e tardino, ci ripasso domani.

//reset the MCU
void leOS2::reset(void) {

	SREG &= ~(1<<SREG_I);
	//wdt_reset(); //<<<<<<<<<<<<<<<<<<<<QUESTA lo fa schiantare
    wdt_disable();
    
    //for the Arduino MEGA 2560 we must use a software reset
    //because its bootloader leads to a board freeze!
//#ifdef ARDUINO_MEGA
	__asm__ __volatile__ ("jmp 0x000000"); //<<<<<<<<<<<<<<< ho aggiunto 2 zeri
  
//#else
    //wdt_enable(WDTO_1S);
    //SREG |= (1<<SREG_I);
    //while(1){}; //wait for reset
//#endif
}

fa 3 lampeggi, attende 10 secondi e si resetta!!!! E' quello che volevi no?
Ma questo reset lo dovrebbe fare anche se si inchioda l'MCU per i fatti suoi usando l'interrupt del watchdog ?

Riciao