Schedulatore
Moderatore:
Paolino
24 messaggi
• Pagina 1 di 3 • 1, 2, 3
0
voti
[1] Schedulatore
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?
0
voti
[2] Re: Schedulatore
Hai già fatto ricerche in rete? Si trova di tutto e di più...
Ecco un esempio che trovi su github
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
John Archibald Wheeler
0
voti
[3] Re: Schedulatore
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:
Credo possa funzionare in stm8, usando TIM2_GetCounter() al posto di millis()
- 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()
2
voti
[4] Re: Schedulatore
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.
0
voti
[5] Re: Schedulatore
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
1
voti
[6] Re: Schedulatore
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.
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.
0
voti
[7] Re: Schedulatore
Non intendevo dire che si pianta ma che mette in pausa il micro come può essere un classico delay per far lampeggiare un led...
0
voti
[8] Re: Schedulatore
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...
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...
-

luxinterior
4.311 3 4 9 - Master EY

- Messaggi: 2690
- Iscritto il: 6 gen 2016, 17:48
3
voti
[9] Re: Schedulatore
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".
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! Ausili per disabili e anziani su ⋮ƎlectroYou
Caratteri utili: À È É Ì Ò Ó Ù α β γ δ ε η θ λ μ π ρ σ τ φ ω Ω º ª ² ³ √ ∛ ∜ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ∃ ∄ ∆ ∈ ∉ ± ∓ ∾ ≃ ≈ ≠ ≤ ≥
Caratteri utili: À È É Ì Ò Ó Ù α β γ δ ε η θ λ μ π ρ σ τ φ ω Ω º ª ² ³ √ ∛ ∜ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ∃ ∄ ∆ ∈ ∉ ± ∓ ∾ ≃ ≈ ≠ ≤ ≥
0
voti
[10] Re: Schedulatore
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
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
24 messaggi
• Pagina 1 di 3 • 1, 2, 3
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 27 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)




