Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Schedulatore

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Schedulatore

Messaggioda Foto UtenteTheMask » 14 giu 2019, 8:12

Ciao a tutti, sto cercando di implementare uno schedulatore per STM8 molto semplice. In modo da avere due task da 100ms e uno da 200ms per accendere due leds diversi con codice non bloccante. Qualcuno ha qualche esempio di come farlo?
Avatar utente
Foto UtenteTheMask
35 3
New entry
New entry
 
Messaggi: 72
Iscritto il: 14 gen 2015, 16:05

0
voti

[2] Re: Schedulatore

Messaggioda Foto UtenteDrCox » 14 giu 2019, 10:27

Hai già fatto ricerche in rete? Si trova di tutto e di più...
Ecco un esempio che trovi su github
"The past is not really the past until it has been registered. Or put another way, the past has no meaning or existence unless it exists as a record in the present."
John Archibald Wheeler
Avatar utente
Foto UtenteDrCox
2.587 2 8 12
Master EY
Master EY
 
Messaggi: 678
Iscritto il: 8 giu 2010, 21:42

0
voti

[3] Re: Schedulatore

Messaggioda Foto UtenteTheMask » 15 giu 2019, 9:48

Ciao, certo l'ho visto però detto sinceramente per gestire due task semplici mi sembra assurdo dover ricorrere a tutto quel codice. Sicuramente c'è qualche metodo piu semplice. In passato aveso scritto per arduino un codice del genere:
Codice: Seleziona tutto
void loop()
{
  time_tmp = millis();

  //Task 1msec
  if (time_tmp > task_1 + 1)
  {
    Task_1ms();
    task_1 = millis();
  }

  //Task 10msec
  if (time_tmp > task_2 + 10)
  {
    Task_10ms();
    task_2 = millis();
  }
}

Credo possa funzionare in stm8, usando TIM2_GetCounter() al posto di millis()
Avatar utente
Foto UtenteTheMask
35 3
New entry
New entry
 
Messaggi: 72
Iscritto il: 14 gen 2015, 16:05

2
voti

[4] Re: Schedulatore

Messaggioda Foto Utentexyz » 15 giu 2019, 11:18

TheMask ha scritto:
Codice: Seleziona tutto
void loop()
{
...
}


Uno scheduler fatto in quel modo non è preciso e anche brutto da vedere. Di solito quelli più semplici si implementano con uno o più timer hardware programmati in modo da scatenare nei giusti tempi degli interrupt e il codice che gestisce interrupt è il tuo task.
Avatar utente
Foto Utentexyz
5.930 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1572
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[5] Re: Schedulatore

Messaggioda Foto UtenteTheMask » 15 giu 2019, 17:19

Su questo non ne dubitavo...Però anche gestendolo con degli interrupt il codice non si blocca? Comunque volevo evitare di complicarmi la vita con l’assembly per questo che chiedevo se c’era qualcosa di molto semplice per implementare quello che mi serve
Avatar utente
Foto UtenteTheMask
35 3
New entry
New entry
 
Messaggi: 72
Iscritto il: 14 gen 2015, 16:05

1
voti

[6] Re: Schedulatore

Messaggioda Foto Utentexyz » 15 giu 2019, 20:42

Se si blocca hai del codice con almeno un baco.

Non ho mai parlato di assembler, in molti micro controllori puoi gestire gli interrupt direttamente in C, di solito è spiegato nella documentazione su come programmarlo.
Avatar utente
Foto Utentexyz
5.930 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1572
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[7] Re: Schedulatore

Messaggioda Foto UtenteTheMask » 16 giu 2019, 1:53

Non intendevo dire che si pianta ma che mette in pausa il micro come può essere un classico delay per far lampeggiare un led...
Avatar utente
Foto UtenteTheMask
35 3
New entry
New entry
 
Messaggi: 72
Iscritto il: 14 gen 2015, 16:05

0
voti

[8] Re: Schedulatore

Messaggioda Foto Utenteluxinterior » 16 giu 2019, 10:53

No TheMask non devi usare delay Se hai uno scheduler che esegue un task con un periodo preciso.
Il micro viene interrotto periodicamente esegue il task associato all'interrupt, che nel tuo caso deve solo commutare il pin che pilota il led, e riprende da dove ha lasciato.
L'interruzione dura poco o null agiusto il tempo di entrare commutare l'uscita e uscire.
Di solito per tempi relativamente lunghi di centinaia di millisecondi si associa un task ad un interrupt ad esempio a 1ms oppure 5ms o 10ms come ti va meglio. In questo task utilizzi dei contatori per ritardare l'esecuzione di altre procedure.
Se hai un task a 5ms e ti serve un periodo a 100ms usi una variabile precaricata a 20 che decrementi e controlli quando arriva a zero per eseguire il task a 100ms.
Generalmente questo task periodico non fa cose pesanti cambia alcuni bit o modifica le variabili di stato perché deve concludersi rapidamente o comunque in un tempo trascuraile riseptto al periodo selezionato . Se durasse 4ms con peirodo impostato a 5ms il micro non avrebbe tempo di fare nulla oltre al task periodico.
Il lavoro pessante lo fai nel task principale dove controlli bit e variabili di stato che il task periodico modifica.
So che non è chiaro...
Avatar utente
Foto Utenteluxinterior
2.497 2 4 8
Expert EY
Expert EY
 
Messaggi: 1470
Iscritto il: 6 gen 2016, 17:48

3
voti

[9] Re: Schedulatore

Messaggioda Foto UtenteGuidoB » 16 giu 2019, 23:50

Normalmente si scrivono dei "generatori di evento", che sono procedure di interruzione che generano eventi che vengono messi in una coda.

La coda viene letta, nel ciclo principale (fuori dalle procedure di interruzione) da un "dispatcher" che, a seconda dell'evento, chiama l'appropriato "event handler".

Quando il dispatcher vede che la coda è vuota mette il processore in sleep.

Quindi:

1) Quando arriva un evento viene generata un'interruzione, che sveglia il processore. Viene quindi eseguita la corrispondente brevissima procedura di interrupt che legge l'evento e lo mette nella coda.

2) Poi, uscendo dalla procedura di interrupt, essendo il processore sveglio, esegue il ciclo principale del dispatcher, che vede un evento in coda e chiama il corrispondente event handler.

3) Quando la coda è vuota, il dispatcher mette il processore in sleep per risparmiare energia (altrimenti il ciclo principale girerebbe a vuoto senza far nulla).

Vedi qui per esempio, e scarica il corrispondente PDF "Event-driven programming". Guarda in particolare l'"Extended Handlers pattern".
Big fan of ƎlectroYou!
Avatar utente
Foto UtenteGuidoB
14,5k 6 12 13
G.Master EY
G.Master EY
 
Messaggi: 2253
Iscritto il: 3 mar 2011, 16:48
Località: Madrid

0
voti

[10] Re: Schedulatore

Messaggioda Foto UtenteTheMask » 18 giu 2019, 8:52

Ciao,
grazie per le risposte, però inizio ad avere un po' di confusione per cui portate pazienza.
Cerco di spiegare meglio quello che devo realizzare. In pratica ogni 100ms devo leggere un sensore e ogni 500ms far lampeggiare un led.

Da quello che posso aver capito mi conviene impostare il timer 2 con una base tempi di 10ms (?) e incrementare un contatore in modo da eseguire la funzione di lettura sensore e lampeggio led. Ho capito giusto?

Devo fare in modo che ogni 10ms si generi un interrupt per incrementare la variabile count. Una volta raggiunto il 50 alla fine del lampeggio resetto la variabile count.
In questo modo ogni 10ms il timer 2 mi incrementa questa variabile quindi
Funzione lettura sensore avverrà quando in count = 10 mentre il lampeggio quando count = 50.
Resetto count e rincomincia da capo
Avatar utente
Foto UtenteTheMask
35 3
New entry
New entry
 
Messaggi: 72
Iscritto il: 14 gen 2015, 16:05

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti