Go Down

Topic: Dove iniziare per programmare SAM3U (Read 6 times) previous topic - next topic

Janos


MauroTec

Ora non voglio fare polemica, ancora di più se si tratta di Astro.
La digitalWrite impiega tanto tempo anche perchè fa una cosa che richiede tempo, ora ho un ricordo lontano ma mi pare che legga dalla flash per ricavare i dati delle porte.

Io non credo che il C++ sia tanto più lento rispetto al C, dipende tutto da cosa ci fai e come lo fai, esiste la possibilità di scrivere codice fatto male sia in c che c++, quindi alla fine se si è in grado di scrivere buon codice in c o in c++ le differenze di velocità di esecuzione e minima. Spesso scrivere codice facile da usare comporta una lentezza in esecuzione, arduino core ne è l'esempio. Nota che anche in c può essere usato il paradigma della programmazione ad oggetti. Leggi questo libro http://books.google.it/books?id=UnpIKZmodSAC&pg=PA308&dq=design+pattern+C%2B%2B&hl=it&sa=X&ei=JGeTT8KdL8XP4QT1w8TQDw&ved=0CDkQuwUwATha#v=onepage&q=design%20pattern%20C%2B%2B&f=false

Arm e avr32 possono essere programmati in C++ con le Qt lib di Nokia, tramite l'ide qtcreator e così è possibile scegliere tra tante classi efficienti, certo se usi una lista di mappe ovviamente questo è codice che richiede tempo per essere eseguito, però grazie alle qt le stringhe, mappe e altre classi sono di tipo implicit shared e questo a fronte di un consumo di ram in più porta velocità e flessibilità di uso.

Non ho un arm e neanche un avr32 ma uso le qt da tempo e ne ho studiato il codice interno almeno in parte e se avessi la necessità di usare un arm lo farei con su un kernel linux e le qt.

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

leo72

Questa cosa della digitalWrite mi ha incuriosito e sono andato a guardarmi il codice.
La digitalWrite esegue prima una conversione tra numero del pin passato come parametro e pin fisico del micro mediante delle macro, poi nel caso sia un pin agganciato ad un timer, spenge l'eventuale segnale PWM, poi disattiva gli interrupt, modifica lo stato del pin, ed infine riattiva gli interrupt.
Insomma, un bel po' di lavoro. Ecco perché alla fine è così lenta. Ma si tratta tutte di operazioni necessarie per come è strutturato l'Arduino, che è tutto "sui generis" e non deve dare nulla per scontato.

Se io manipolo i pin del micro, sono ad un livello di competenza tale per cui so anche le implicazioni che ha sullo stato del pin la presenza di un segnale PWM. Ma se io non so neanche come lo genero, questo segnale PWM, come posso sapere che se ho un timer agganciato a quel pin, ho un segnale ad onda quadra che esce da lì? Quindi "dietro le quinte" il core mi stacca in automatico quel segnale, mi controlla varie cose e mi fa apparire tutto bello e preciso come voglio io, 0V se metto LOW e 5V se metto HIGH. Ovviamente al costo di diverse operazioni compiute senza che l'utente se ne accorga.

MauroTec

In effetti c'è il modo di fare quello che fa la digitalWrite in modo preventivo e poi usare le macro per impostare la porta, questo torna utile quando c'è la necessità di cambiare stato di uno o più bit molto più velocemente di come lo fa digitalWrite.

Cioè si tratta di scrivere codice per fare la cosa in due fasi, ricavi l'indirizzo della/e porta/e e su questi operi con bitwise, questo non significa che digitalWrite è codice cattivo, piùttosto è il reference ad essere pessimo perchè non fa menzione al tempo impiegato da ogni funzione e non spiega come aggirare i vari problemi ecc, e questo mi sta bene anche perchè da modo di publicare libri con buona probabilità di acquisto.

Certo che usare un ARM senza un sistema operativo è compito duro e devi avere un valido motivo per farlo. Su un arm c'è spazio per i thread, processi, eventi ecc.

Chissa se c'è un RTOS per arm in GPL o equivalente?
Ciao. 
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Janos

Cioè mi stai consigliando che sarebbe meglio installare un kernel linux anche sulla SAM3U, che è un microcontrollore?

Go Up