Go Down

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

leo72

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]);

pelletta

Bravo Leo, appena posso lo provo sicuramente. Grazie!

leo72


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  XD XD
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.

lesto

confermo le conclusioni di leo, e consiglio di mantenere le normali if che sono più leggibili a mio avviso (perchè riconosciute dall'ide)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

MauroTec



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  XD XD
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: [Select]

// 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.

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

lesto

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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

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:

leo72

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ù  ]:D
No, non è fattibile.

m_ri

#143
Jul 02, 2012, 10:17 pm Last Edit: Jul 02, 2012, 10:29 pm by m_ri Reason: 1
@leo bravo bravo,aggiungi solo funzioni..  :)

@mauro: i compilatori di solito fanno un bel po' di ottimizzazioni,quindi uno può anche saltarne alcune x rendere più leggibile il codice  :) 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 :)

per le ottimizzazioni di dimensione,sempre in gcc c'è -Os..

lesto

già con le ottimizzazioni attuali elimina i cicli inutili, e anche variabili usate solo per assegnazioni (non i registri, bada bene)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

MauroTec

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

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

leo72

#146
Jul 03, 2012, 01:01 am Last Edit: Jul 03, 2012, 11:22 am by leo72 Reason: 1
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:

lesto

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:)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

m_ri

@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)..

leo72


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  XD XD
PS.
devo ricordarmi di scrivere a Massimo per richiedere i diritti sul nome  :smiley-yell: :smiley-yell: $) $)

Go Up