Go Down

Topic: leOS: problemi con BMP085 (Read 1 time) previous topic - next topic

BaBBuino

Leo il tuo leOS è un mezzo bidone! :D

Lo sto implementando nel mio mega-schetch un pezzo per volta, una funzione per volta (levando i delay()). La prima e seconda funzione vanno bene, ma alla terza funzione, quella che legge il BMP085 già va in tilt.

Uso la libreira Adafruit per il BMP085. Che tu sappia usa qualche timer in conflitto con il leOS?

leo72


Leo il tuo leOS è un mezzo bidone! :D

Queste sono le soddisfazioni della vita  :smiley-yell:

Quote


Lo sto implementando nel mio mega-schetch un pezzo per volta, una funzione per volta (levando i delay()). La prima e seconda funzione vanno bene, ma alla terza funzione, quella che legge il BMP085 già va in tilt.

Uso la libreira Adafruit per il BMP085. Che tu sappia usa qualche timer in conflitto con il leOS?

Vedo che la lib usa una funzione di delay (quella della toolchain Avr) e la Wire.
La Wire mi sa che è incompatibile con il leOS perché usa gli interrupt. La delay Avr non so su cosa si basi.

BaBBuino

Mannaggia... allora farò un mezzo-e-mezzo.

leOS dove funziona, e delay() dove non si può.

Leo ma secondo te qualunque libreria di questo tipo mi darebbe problemi? Anche un coso serio come FreeRTOS?

leo72


Leo ma secondo te qualunque libreria di questo tipo mi darebbe problemi? Anche un coso serio come FreeRTOS?

Più che FreeRTOS, usa ChibiOS/RT. Di entrambi esiste un port per Arduino correntemente mantenuto:
http://arduino.cc/forum/index.php/topic,145716.0.html
ma ChibiOS/RT pare offrire più features ed impattare meno sulla memoria rispetto a FreeRTOS.

Esistono però dei problemi anche con essi, non sono perfetti al 100%.
Ad esempio, il delay è una di quelle cose che dà noia agli RTOS perché blocca i thread a bassa priorità.

Usare il looper invece?
Il looper è uno scheduler come il leOS che, però, non è basato su interrupt. E' meno preciso e può "perdere dei colpi" però non blocca nulla perché usa i millis di Arduino.

BaBBuino

Looper? Però devo installare l'accrocchio su una macchina abbastanza "importante" e deve stare acceso 24 ore al giorno.

Millisec tira le cuoia dopo 47 giorni, e la macchina mi si pianta...

leo72


Looper? Però devo installare l'accrocchio su una macchina abbastanza "importante" e deve stare acceso 24 ore al giorno.

Millisec tira le cuoia dopo 47 giorni, e la macchina mi si pianta...

Allora usa secTimer che ti ho consigliato nell'altro thread, va in overflow dopo un centinaio d'anni  ;)

leo72


Janos

#7
Mar 18, 2013, 01:02 pm Last Edit: Mar 18, 2013, 02:40 pm by Janos Reason: 1

Millisec tira le cuoia dopo 47 giorni, e la macchina mi si pianta...


Guarda che non ti devi preoccupare che millis() vada in overflow. Quando fai una somma il risultato che ottieni (omettendo il flag carry) è modulo "n", nel caso di millis() è modulo 32. Semplificando il discorso, se millis andasse a 8 bit, quello che ottieni appartiene sempre all'intervallo 0-255. Se fai 250+10 ottieni 260-256 = 4.

Ora, supponendo che tu abbia letto che millis() vale 250 e l'istante dopo vale 4, quando te fai 4-250 in teoria otterresti (se fossero numeri con segno)-246, ma visto che non lo sono e il risultato che ottieni è sempre compreso nell'intervallo 0-255 quello che ottieni facendo 4-250 è -246+256 = 10, guarda caso il numero di millisecondi che ti interessa.

L'unico problema che potresti avere con l'overflow di millis() è se te leggi millis() ora e poi lo rileggi dopo che è andato in overflow 2 volte...

P.S.

Leo il tuo leOS è un mezzo bidone! :D

Scusami ma l'esperienza e la competenza di Leo mi sembrano fuori discussione, ed inoltre non mi sembra carino offendere l'operato di un'altra persona che si è messo a lavorare gratuitamente per fornire alla comunità di Arduino una libreria utile come leOS. Ovvio, non è un RTOS, quindi ha i suoi limiti, ma sta a te conoscerli e valutare se fa al caso tuo o meno. Inoltre, se pensi di aver trovato un baco, perché non lo risolvi e lo dici a Leo così che lo possa sistemare?

leo72


L'unico problema che potresti avere con l'overflow di millis() è se te leggi millis() ora e poi lo rileggi dopo che è andato in overflow 2 volte...

Detto in altre parole, bisogna che l'intervallo sia inferiore al modulo

Quote

Scusami ma l'esperienza e la competenza di Leo mi sembrano fuori discussione, ed inoltre non mi sembra carino offendere l'operato di un'altra persona che si è messo a lavorare gratuitamente per fornire alla comunità di Arduino una libreria utile come leOS. Ovvio, non è un RTOS, quindi ha i suoi limiti, ma sta a te conoscerli e valutare se fa al caso tuo o meno. Inoltre, se pensi di aver trovato un baco, perché non lo risolvi e lo dici a Leo così che lo possa sistemare?

Guarda che non me la sono mica presa, l'ho presa per battuta e difatti ho risposto ad essa come tale.  ;)

Janos

#9
Mar 18, 2013, 05:04 pm Last Edit: Mar 18, 2013, 05:08 pm by Janos Reason: 1

Detto in altre parole, bisogna che l'intervallo sia inferiore al modulo

Giustissimo, ma detto così mi smonti tutta la spiegazione... Ho fatto una supercazzola sdraiata a destra e te me l'hai sintetizzata in 10 parole...  =(

P.S.
Me lo ero immaginato che non te la eri presa, però ugualmente non mi era sembrato un commento felice...

BaBBuino

Cioè, se le continue verifiche su Millis, non superano i 47 giorni (cioè non faccio un controllo ora e l'altro tra 48 giorni) il millis non dà problemi?

A Leo devo tirare un pò le balle ogni tanto, se no si rilassa! :D

Janos

:D

Dipende come lo utilizzi. Se utilizzi in maniera differenziale (ovvero del tipo millis() - tempoPrec >= intervallo) non hai problemi.

leo72


Cioè, se le continue verifiche su Millis, non superano i 47 giorni (cioè non faccio un controllo ora e l'altro tra 48 giorni) il millis non dà problemi?

Se fai un controllo del tipo
Code: [Select]
if (millis - vecchio_millis > intervallo)
non incorri nel problema di millis.

Quote

A Leo devo tirare un pò le balle ogni tanto, se no si rilassa! :D

]:D

Go Up