funzione e tempo massimo di esecuzione

Devo programmare il mio Arduino Ethernet per svolgere una funzione che chiamerò pippo().
Vorrei però dare un tempo massimo a questa funzione, dopo farle ritornare un valore di default.
Ho visto che c'è la libreria Timer.h ma non credo possa fare al caso mio.
In sostanza, se la funzione pippo si pianta (dovrà inviare dei byte al server e potrebbero esserci ritardi di rete o cadute di connessione), invece di lanciare un reset di tutto Arduino, vorrei che ritornasse un valore di default (corrispondente a un errore generico).

Questa operazione mi sembra facilmente gestibile con Yun, giusto?

no, su una arduino non pui fare questo. Ti serve un sistema operativo che supporti il multitsking, e quindi creare un thread/processo per ogni esecuzione e killare il processo in caso non faccia in tempo.

Ma è uin concetto SBAGLIATO alla base, semplicemente invece che usare funzioni bloccanti devi usare quelle asincrone, il che di solito è più efficiente perchè fai lavorare il SO/HW in modo indipendente menrte bellamente fai altro :slight_smile:
Se spieghi cosa vuoi fare...

Spiego meglio quello che deve fare la scheda Arduino.
All'interno di loop() devo inviare e ricevere n volte un'array di byte ad altre n schede Arduino. In sequenza ad ogni scheda invio un'array e attendo un'array in risposta.
Se nascono problemi di comunicazione con una sola scheda, entra in funzione il watchdog e resetta.
Il rischio però è che con problemi su una scheda, il watchdog impedisca di comunicare anche con le altre. Per ovviare a questo volevo impostare un tempo massimo di esecuzione o in alternativa (se possibile) forzare il return della funzione invece del reset.

Con una scheda Yun sarebbe possibile? Vedo che Python ammette try - catch.
Per me non è obbligatorio usare Arduino Ethernet

allora, questo si può fare tranquillamente con un arduino.

Se nascono problemi di comunicazione con una sola scheda, entra in funzione il watchdog e resetta.

qui è sbagliato il tuo codice, perchè è bloccante. Con le classi della Ethernet poi benissimo sapere se un client è ancora connesso e se ci sono dati disponibili da leggere, in oltre se leggi dati non disponibili essa ritorna -1 invece che il carattere da leggere, quindi hai tutti gli strumenti per evitare di essere bloccante. Ora, non so che protocollo hai implementato, ma immagino sia qualcosa del genere:

A si connette a B
A chiede l’array
B risponde con il numero (int) di elementi, seguito dagli stessi e chiude la connessione

quindi A sarà quialcosa del tipo

timeOutMax = 1000; //in ms, quindi 1 secondo
connettiti
timeoutInizio = millis();
FINCHE connesso && millis() -timeoutInizio < timeOutMax
  SE disponibile un byte
    SE è il primo o il secondo
       memorizzalo
         SE è il secondo alloca l'array
    ALTRIMENTI
      mettilo nell'array

SE byte letti < 2 OPPURE byte letti < celle attese * dimensione dato in byte
  ERRORE DI COMUNICAZIONE
ALTRIMENTI
  OK!

Mi pare che il WatchDog possa chiamare un'interrupt prima del reset.
Legando all'interrupt una funzione che resetta il watchdog hai un sistema che in caso di blocco esegue il codice programmato.
Per maggiori info chiedete a Leo.
Comunque non credo che questa sia la soluzione che tu stavi cercando.

Sì, il watchdog può essere impostato in una modalità detta "interrupt+reset": la prima volta solleva un interrupt che puoi intercettare con una ISR; qui dentro esegui il tuo codice, poi reimposti il flag affinché il watchdog sollevi sempre un interrupt anche al prossimo overflow del suo contatore. Se il micro si è piantato, ovviamente il reset di quel flag non avviene per cui alla successiva attivazione del watchdog questo resetta il chip.
Se ti scarichi la mia lib leOS2 (dal mio sito, link in calce) troverai a come impostare questa cosa. Oppure usi direttamente la leOS2 e fai fare tutto a lei :wink: