Go Down

Topic: leOS - un semplice OS per schedulare piccoli task (Read 46542 times) previous topic - next topic

m_ri

@paoloP:si,non è male.. :) grazie

@leo72:vorrei fare uno skimmer con un arduino mini,lettore & co ]:D potresti farmi un progettino?poi ti do la percentuale..

leo72

Non sapevo cos'era uno skimmer, ho cercato... ed ho pensato che ciò che vuoi fare è una cosa molto piratesca  :P

Testato

#212
Aug 30, 2012, 10:15 pm Last Edit: Aug 30, 2012, 10:19 pm by Testato Reason: 1

E lo posso dire senza timore di smentite da parte di testato, che sa questa essere la verità  :P

:) confermo tutto
diciamo che le mie obiezioni ti risultavano coerenti con il progetto, e cmq non dimentichiamoci che io pago in test, e ti ho trovato un bug grande come una casa che in realta' non hai risolto, ma ci hai messo una pezza, o sbaglio ? (mi riferisco al millennium bug)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Alla fine proprio bug non era, veniva fuori un'aggiunta di 1 giorno sul timestamp quando si passava l'anno 2000 per via degli anni quadricentenari, se non ricordo male. Ora però mi cogli alla sprovvista, dovrei andare a rivedere le ultime pagine di quel thread perché non ricordo con esattezza cosa succedeva.

Testato

non ne vale la pena, e' troppo grande quel thread  :)
alla fine l'importante e' che con la data attuale funziona, non e' che una persona si fa un orologio e lo setta per il 1980  :)

dimenticavo, complimenti per l'apparizione sul Blog, ma chi e' la persona che lo ha postato ? puo' postare solo il team credo giusto ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72


non ne vale la pena, e' troppo grande quel thread  :)
alla fine l'importante e' che con la data attuale funziona, non e' che una persona si fa un orologio e lo setta per il 1980  :)

Con la correzione che ho introdotto, la persona lo può fare, volendo. Il problema è aggirato.

Quote

dimenticavo, complimenti per l'apparizione sul Blog, ma chi e' la persona che lo ha postato ? puo' postare solo il team credo giusto ?

Grazie. Anch'io non so chi sia stato, però vedo che è italiano, per lo meno dal nome: Alessandro Paganelli.
Penso però che sia un qualcuno che cura il blog per conto del team, non penso che con tutto quello che hanno da fare i membri del team si mettano a spulciare in giro sulla rete o per il forum alla ricerca di news interessanti.

m_ri

leo leo,come hai fatto tu a sopravvivere tutti questi anni senza skimmer?! :smiley-yell:
..buona giornata..

cassvs

Salve a tutti, ho scaricato e testato la libreria e va alla grande... unico problema è che quando utilizzo anche un'altra libreria chiamata swRTC all'interno dello stesso sketch mi da un errore... l'errore riportato è:
leOS\leOS.cpp.o: In function `__vector_9':

C:\Users\Utente\Desktop\Metering Data Logger\arduino-1.0.1\libraries\leOS/leOS.cpp:185: multiple definition of `__vector_9'
swRTC\swRTC.cpp.o:C:\Users\Utente\Desktop\Metering Data Logger\arduino-1.0.1\libraries\swRTC/swRTC.cpp:144: first defined here

è come se le due librerie risultassero incompatibili... vi prego datemi una mano che mi serve urgentemente!!! grazie e complimenti per i consigli che mi sono risultati molto utili! ;)
Marco Pacifico

Madwriter


Salve a tutti, ho scaricato e testato la libreria e va alla grande... unico problema è che quando utilizzo anche un'altra libreria chiamata swRTC all'interno dello stesso sketch mi da un errore... l'errore riportato è:
leOS\leOS.cpp.o: In function `__vector_9':

C:\Users\Utente\Desktop\Metering Data Logger\arduino-1.0.1\libraries\leOS/leOS.cpp:185: multiple definition of `__vector_9'
swRTC\swRTC.cpp.o:C:\Users\Utente\Desktop\Metering Data Logger\arduino-1.0.1\libraries\swRTC/swRTC.cpp:144: first defined here

è come se le due librerie risultassero incompatibili... vi prego datemi una mano che mi serve urgentemente!!! grazie e complimenti per i consigli che mi sono risultati molto utili! ;)

infatti lo sono utilizzano lo stesso timer,nei post precendenti lo trovi,puoi usare il looper che non va in conflitto con niente se non sbaglio.
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

cassvs

Oh OpSS ora mi son accorto che entrambe le librerie sono state fatte da leo72!!!;)
complimenti sono entrambe utilissime.. solo che dovrei utilizzarle insieme...:(
looper da quel che ho capito non è indipendente, ovvero, il timer dipende anche dalle istruzioni contenute nel'loop principale...
a me serve il leOS in quanto non bada alle istruzioni presenti nel'loop e quindi mi da una precisione che risulta essenziale per il mio progetto...
Marco Pacifico

leo72

Ciao, se ci spieghi che cosa devi fare forse posso darti una mano ad utilizzare al meglio uno dei due strumenti.

leo72

Stasera mi sono divertito a giocare con il leOS.
Qui di seguito un esempio di applicazione del leOS. Un RTC software gestito direttamente dallo schedulatore.
Non ha la precisione di un RTC hardware né la possibilità di correggere la deriva rispetto al tempo reale dell'altra mia libreria swRTC però è divertente vedere come con poche righe di codice si possa usare il leOS per gestire in background un orologio software, utile ad esempio per pianificare compiti a determinati intervalli della giornata.

Code: [Select]
/*
    Creazione di un semplice RTC software mediante l'uso del leOS.
    Viene creato un task che aggiorna ogni secondo una serie di
    variabili temporali per poter gestire ore, minuti, secondi,
    giorno, mese ed anno.
   
    L'orario e la data attuali sono stampati ad intervallo di 1
    secondo direttamente sulla seriale, contemporaneamente al
    lampeggio del led integrato sull'Arduino
   
    Versione: 1.0 - 2012/09/13
   
    Licenza: GNU GPL 3.0 o successive
*/

#include <leOS.h>

leOS myOS;

volatile byte _hours = 0;
volatile byte _minutes = 0;
volatile byte _seconds = 0;
volatile byte _day = 0;
volatile byte _month = 0;
volatile int _year = 0;
volatile byte daysPerMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
byte led1Status = 0;
const byte LED1 = 13;
byte temp = 0;

void setup() {
    myOS.begin();
    Serial.begin(9600);
    pinMode(LED1, OUTPUT);
    myOS.addTask(updateRTC, 1000);
    temp = _seconds;
}

void loop() {
    if(temp != _seconds) {
        led1Status ^= 1;
        digitalWrite(LED1, led1Status);
        temp = _seconds;
        Serial.print("Ore ");
        Serial.print(_hours, DEC);
        Serial.print(":");
        Serial.print(_minutes, DEC);
        Serial.print(":");
        Serial.print(_seconds, DEC);
        Serial.print(" - Data: ");
        Serial.print(_day, DEC);
        Serial.print("/");
        Serial.print(_month, DEC);
        Serial.print("/");
        Serial.println(_year, DEC);   
    }
}

//aggiorna l'orologio software
void updateRTC() {
    byte _dayT;
    _seconds++;

    if (_seconds>59) {
        _seconds=0;
        _minutes++;
        if (_minutes>59) {
            _minutes=0;
            _hours++;
            if (_hours>23) {
                _hours=0;
                _day++;
                if (_month == 2) { //february?
                    if (leapYear(_year)) {
                        _dayT=29;
                    } else {
                        _dayT=28;
                    }
                } else {
                    _dayT=daysPerMonth[_month-1];
                }
                if (_day>_dayT) {
                    _day=1;
                    _month++;
                    if (_month>12) {
                        _month=1;
                        _year++;
                    }
                }
            }
        }
    }
}


//controlla se l'anno corrente è bisestile
boolean leapYear(int yearT) {
    if (((yearT % 4) == 0) && ((yearT % 100) != 0) || ((yearT % 400) == 0)) {
        return true;
    } else {
        return false;
    }
}

Ovviamente la precisione è quel che è, dipendendo dal risonatore ceramico dell'Arduino UNO, però può essere d'aiuto per tanti piccoli compiti. Se ricercate precisioni più elevate, studiatevi il mio progetto Micrologio.

Testato

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72


Il weekday ?  :smiley-yell:

No!  ]:D

Quote

Bel lavoro  :)


Grazie.  :P
Sono quel genere di cose che si fanno per passare il tempo....  :smiley-sweat:

leo72

Ho aggiornato il leOS alla versione 0.1.3.
Ho aggiunto un paio di sketch di esempio per mostrare le funzionalità di questo scheduler nonché ho aggiunto una nuova funzionalità: la possibilità di aggiungere un task in modalità "pausa", che non viene cioè eseguito immediatamente dopo l'aggiunta ma solo quando l'utente lo riattiva esplicitamente col metodo restartTask().
Questa funzionalità è a mio avviso molto utile per aggiungere ad esempio un task che possa manifestare immediatamente la sua attività, ad esempio pilotando un LED o un transistor. Ciò si può ottenere aggiungendo la parola chiave PAUSED ai parametri passati al metodo addTask. Esempio:
Code: [Select]

myOS.addTask(funzione, intervallo, PAUSED);

Per avviare il task basta dare:
Code: [Select]

myOS.restartTask(funzione);

quando lo si ritiene opportuno.

Ricordo che la sintassi di addTask è:
Code: [Select]
addTask(nomeFunzione, intervallo[, stato])
stato è opzionale e può assumere 3 valori predefiniti:
PAUSED: per aggiungere un task con esecuzione sospesa
SCHEDULED: opzione di default, aggiunge un task con esecuzione attiva
ONETIME: aggiunge un task attivo da eseguire solo 1 volta

Uno dei 2 nuovi sketch di esempio serve a mostrare la nuova funzionalità. L'altro mostra invece una cosa carina che può fare il leOS, ossia attivare/disattivare un task da un altro task.

N.B.:
Il leOS 0.1.3 è disponibile da adesso solo sul mio sito. Ho tolto il download dal 1° post del thread per avere un contatore globale dei download e perché spesso mi dimenticavo di aggiornare il pacchetto su uno dei 2 posti dov'era pubblicato (il forum o il mio sito).

Go Up