Pages: 1 ... 8 9 [10] 11 12 ... 31   Go Down
Author Topic: leOS - un semplice OS per schedulare piccoli task  (Read 39587 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22993
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Versione 0.0.8.
Adesso c'è anche il comando modifyTask, per cambiare a runtime i parametri di un task. Si può cambiare sia l'intervallo del task, sia trasformare un task da one-time a normale che viceversa (ovviamente si può trasformare un task one-time in normale sono se ancora non è stato eseguito, perché viene immediatamente cancellato dopo il run).

myOS.modifyTask(funzione, intervallo [, ONETIME|SCHEDULED]);

* leOS-0.0.8.zip (24.17 KB - downloaded 14 times.)
Logged


Marche
Offline Offline
Edison Member
*
Karma: 34
Posts: 2276
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bravo Leo, appena posso lo provo sicuramente. Grazie!
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22993
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ora mi chiedo cosa comporta questa implementazione?
mi rispondo: nulla perchè non possiamo cambiare F_CPU a run-time, stessa cosa per starter.
Che ne dici, mi sfugge qualcosa?

Ciao.
Non ti sfugge nulla, ti rispondo dicendoti solo che... ci sono già passato  smiley-lol smiley-lol
L'altro giorno stavo studiando il codice del leOS per vedere se riuscivo ad ottimizzarlo un po' ed anch'io ho notato che invece delle direttive per il compilatore avevo usato semplicifi if..else per impostare il timer 2. Ho pensato quindi che forse, sostituendo le direttive (#if...#elif... ecc..) riuscivo a salvare qualche altro byte. Invece, con mia grande sorpresa, dopo il cambio ho potuto constatare che i byte del firmware erano sempre uguali, sia nel primo che nel secondo caso.
A questo punto mi è venuto da pensare che le ottimizzazioni introdotte in fase di compilazione tolgono dal codice tutte le parti non utilizzate. Quindi, un if su costanti viene probabilmente analizzato e le scelte non possibili (giustamente hai notato che F_CPU non può essere modificato) vengono scartate e non incluse.

Sicuramente in una versione futura adotterò le direttive perché mi pare più omogeneo col resto del codice, però è buffo "ammirare" questi comportanti del compilatore.
Logged


0
Online Online
Shannon Member
****
Karma: 132
Posts: 10502
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

confermo le conclusioni di leo, e consiglio di mantenere le normali if che sono più leggibili a mio avviso (perchè riconosciute dall'ide)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ora mi chiedo cosa comporta questa implementazione?
mi rispondo: nulla perchè non possiamo cambiare F_CPU a run-time, stessa cosa per starter.
Che ne dici, mi sfugge qualcosa?

Ciao.
Non ti sfugge nulla, ti rispondo dicendoti solo che... ci sono già passato  smiley-lol smiley-lol
L'altro giorno stavo studiando il codice del leOS per vedere se riuscivo ad ottimizzarlo un po' ed anch'io ho notato che invece delle direttive per il compilatore avevo usato semplicifi if..else per impostare il timer 2. Ho pensato quindi che forse, sostituendo le direttive (#if...#elif... ecc..) riuscivo a salvare qualche altro byte. Invece, con mia grande sorpresa, dopo il cambio ho potuto constatare che i byte del firmware erano sempre uguali, sia nel primo che nel secondo caso.
A questo punto mi è venuto da pensare che le ottimizzazioni introdotte in fase di compilazione tolgono dal codice tutte le parti non utilizzate. Quindi, un if su costanti viene probabilmente analizzato e le scelte non possibili (giustamente hai notato che F_CPU non può essere modificato) vengono scartate e non incluse.

Sicuramente in una versione futura adotterò le direttive perché mi pare più omogeneo col resto del codice, però è buffo "ammirare" questi comportanti del compilatore.

Si in effetti dovresti controllare il codice dei file .s e .i che sono prodotti dal compilatore se passi a questo
l'argomento -save-temps. Oppure andare a sbirciare il codice nella cartella /var/tmp/ecc....

Se il compilatore evita di creare la variabile prescaler e se trasforma le if in #if è un compilatore
intelligente e inoltre mi legge nel pensiero. Però non è del tutto senza senzo, cioè il compilatore sa che
F_CPU è una costante che non può cambiare e quindi seleziona il codice da compilare, come se operase
il preprocessore.

Altro suggerimento:

Di questa classe se ne dovrebbe creare solo una instanza, cioè all'interno del codice qualunque tentativo di
creare una seconda istanza dobvrebbe avere come risultato il ritorno della precedente instanza.

In questo caso si usa il pattern singleton, che vede il costruttore privato ed il metodo publico leOS *instance(), che ritorna sempre la stessa istanza di classe.

Ho modicato il codice ma non l'ho potuto provare. Ho usato l'operatore "new" non so se funziona.

Se funziona in ogni posto in ogni modulo puoi chiamare leOS *sys_leOS = leOS::instance(); è questo ti ritorna sempre lo stesso puntatore. In questo caso devi sostituire "." con "->".

Pezzi di codice modifcati:
Code:
// file leOS.h

class leOS {
public:
//public methods
static leOS *instance() {  // get singleton instance
        if (!m_instance) {
            m_instance = new leOS; // operator "new" should work
            // m_instance->setTimer(); // Fix me
        }
        return m_instance;

//leOS(); now this is private ctor
        void begin(void);
        void (*voidFuncPtr)(void);
uint8_t addTask(void (*)(void), unsigned long, uint8_t oneTimeTask=NULL);
uint8_t removeTask(void (*)(void));
uint8_t pauseTask(void (*)(void));
        uint8_t restartTask(void (*)(void));
uint8_t modifyTask(void (*)(void), unsigned long, uint8_t oneTimeTask=NULL);

private:
        //private methods
leOS(); // private ctor
        void setTimer();
        uint8_t setTask(void (*)(void), uint8_t, unsigned long taskInterval=NULL);
static leOS *m_instance;
};

// file leOS.cpp
leOS *leOS::m_instance = 0;

//class constructor
leOS::leOS(void) {
_initialized = 0;
}

Ciao.

Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10502
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la new funziona dall'ide 1.0

ma usando una dichiarazione di CLASSE statica dovresti risolvere tutto senza uso di puntatori..
quindi

static class leOS { [...] }

ciò costrige a rendere un pò tutto static, ma non è un problema.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22993
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Stasera con calma provo le vostre idee.
E soprattutto verifico l'impatto sul consumo di Flash. Già ora, con i nuovi metodi, sono arrivato a consumare 0,5 kB in più  smiley-sweat smiley-sweat
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22993
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ovviamente dico "stasera", poi non resisto  smiley-yell
Ho fatto una prova con il codice di Mauro... altri 0,5 kB di firmware in più  smiley-twist
No, non è fattibile.
Logged


Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@leo bravo bravo,aggiungi solo funzioni..  smiley

@mauro: i compilatori di solito fanno un bel po' di ottimizzazioni,quindi uno può anche saltarne alcune x rendere più leggibile il codice  smiley x es. gcc calcola e elimina le if ,se è possibile, in compile-time..inoltre se gli dai un bel -O3 ti fa prediction,scambi indici e verso percorrenza dei cicli,cambiamento ordine di esecuzione delle istruzioni,considerazioni su cache,alcune espansioni inline...se x esempio per fare un delay scrivessi for(i=0;i<10000;i++)a=0; alcuni compilatori ti cancellano di brutto tutta la riga..e poi ti chiedi come mai non fa il ritardo smiley

per le ottimizzazioni di dimensione,sempre in gcc c'è -Os..
« Last Edit: July 02, 2012, 03:29:26 pm by m_ri » Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10502
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

già con le ottimizzazioni attuali elimina i cicli inutili, e anche variabili usate solo per assegnazioni (non i registri, bada bene)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tutto verissiomo, io volevo rispondere articolatamente ma il sito non lo permette, ricevo sempre internal error.

Ok ciao.
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22993
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora.... sono qualche ora di inc....ture, sono riuscito a sistemare il supporto per l'Arduino Leonardo/Atmega32U4.
In allegato la versione 0.1.0 che compila e gira perfettamente con questa scheda e sul suo micro.

E ora... buonanotte!  smiley-sleep smiley-sleep

* leOS-0.1.0.zip (24.21 KB - downloaded 10 times.)
« Last Edit: July 03, 2012, 04:22:08 am by leo72 » Logged


0
Online Online
Shannon Member
****
Karma: 132
Posts: 10502
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

leo, com'è stà leo? (lo sai che andrò avanti a fare queste tristi battute finchè campo?  smiley-mr-green smiley-mr-green smiley-mr-green)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@maurotec: comunque fai bene a ricordare che a volte bisogna ottimizzare..purtroppo il compilatore non è pensante,quindi..

ora che ci penso,il fatto di usare static è un'ulteriore ottimizzazione( evita ogni volta di passare il parametro implicito this)..
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22993
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

leo, com'è stà leo? (lo sai che andrò avanti a fare queste tristi battute finchè campo?  smiley-mr-green smiley-mr-green smiley-mr-green)
Guarda, la Leo è qui con me. D'altronde è stato ammmmore a prima vista  smiley-lol smiley-lol
PS.
devo ricordarmi di scrivere a Massimo per richiedere i diritti sul nome  smiley-yell smiley-yell smiley-money smiley-money
Logged


Pages: 1 ... 8 9 [10] 11 12 ... 31   Go Up
Jump to: