Go Down

Topic: leOS, pauseTask e restartTask! (Read 1 time) previous topic - next topic

leo72

Non dovrebbe. In questo momento ho accanto una Leonardo con lo sketch di test "leOS_tasks_managin" che mette in pausa e riattiva ogni 5 secondi un task e sta funzionando correttamente.

Nik_90


Non dovrebbe. In questo momento ho accanto una Leonardo con lo sketch di test "leOS_tasks_managin" che mette in pausa e riattiva ogni 5 secondi un task e sta funzionando correttamente.


Mmm allora in questo momento in non posso provare sull'arduino uno in cui mi si presenta il problema (dove sta anche collegato un display 16x2 e un'altro bel po di cose xD ). Ma credo di aver capito, ho appena aperto lo sketch che mi hai detto "leOS_tasks_managin" e ho notato che nei tasks sono stati utilizzati variabili con la parola chiave volatile prima. Io effettivamente nel task che ho bisogno utilizzo un paio di flag di tipo byte (tipo il tuo "volatile byte ledStatus") solo che effettivamente senza il volatile.
Il task funziona la prima volta, premendo un pulsante, questo pulsante mette in pausa i task in esecuzione e azzera i vari flag (si tratta in effetti di un ritorno al menu principale, per questo ho bisogno di fermare tutti i task e azzerare ogni tipo di variabile, tipo quelle che fanno rifermento al menu attuale..) ma se rientro la seconda volta, l'ultima cosa che ho notato prima di rientrare a casa è che, tramite un print entro nel task, ma il flag che dovrebbe servire a fare una cosa o un'altra diciamo che non risponde..

Comunque il task è questo:

Code: [Select]

void blink_delay()
{
Serial.println("sono in blink_delay");
if (inMenu == 1)
{
  text = !text;
  if (text == true)
  {
     digitalWrite(13,HIGH);
//Serial.println("testo");
    lcd.setCursor(4,1);
    lcd.print(intervalometer_delay);
  }

  if (text == false)
  {
     digitalWrite(13,LOW);
//Serial.println("spazio");
    lcd.setCursor(4,1);
    lcd.print("   ");
  }
}

}


text in questo caso è un booleano (l'ultima modifica che ho fatto)

Code: [Select]
boolean text;

La prima volta che avvio il task il led 13 si accende e si spegne, se premo il pulsante, fermo i task, rimetto text=false(anche se non dovrebbe servire), e azzero altre variabili che mi interessano, se rientro nel task, il led13 ne si accende e ne si spegne più..

Penso a qesto punto il problema sia che non uso il volatile giusto?

leo72

La parola chiave volatile impedisce al compilatore di applicare ottimizzazioni nella gestione delle variabili o delle funzioni segnate con essa. Essa è indispensabile quando si lavora con gli interrupt proprio per evitare che una variabile possa venir aggiornata all'esterno di una ISR quando essa è maneggiata dalla ISR stessa. Potrebbe essere il tuo caso.

Nik_90

Si deve essere per forza quello! Sennò non so più che pensare, le stavo provando di tutte fino a 3 ore fa! E ora devo aspettare fino a domani mattina per riprovare con volatile noooo...xD Darò notizie domani comunque!

Grazie!

leo72

Resto in attesa anche se prima di domani sera non ti potrò rispondere - domani giornata pienissima.

Go Up