Scusate il post lungo, ma vista la piega che ha preso il thread, mi sembrava bello condividere qualche esperienza.
Anche io consiglio a
Macelettronic di imparare a programmare
bene, anche perché al giorno d'oggi è difficile fare elettronica senza.
Il fatto è che, come dice
xyz, se il micro non ce la fa a svolgere il "lavoro" in tempo, sei comunque fregato.
Se si può, dovrai rilassare i tempi, cioè aumentare il periodo con cui esegui le operazioni ripetitive...
Se pensiamo ad applicazioni di controllo, avere una temporizzazione certa è come avere delle buone fondamenta. Se inizi a fare sul serio ti accorgi che non puoi accettare di non sapere che tempo di campionamento hai (con precisione alta), se il tuo timer dura esattamente 1 secondo, ecc ecc.
Questa cosa (come tante altre), poi, diventa un modo di fare, una di quelle cose che fai senza pensarci, come un artigiano serio e di esperienza ha le sue "procedure". E' un limite? Non credo...
(*)Per contro, la cosa peggiore è non sapere cosa stia succedendo dentro il micro, nel senso di perdere di vista la sequenza e la temporizzazione. Considerando che a volte (per limiti del sistema di debugging o per altri motivi) non è possibile mettere breakpoint durante il funzionamento, bisogna fare il possibile per evitare situazioni dubbie
(**).
Ribadisco quello che dicevo qualche giorno fa, cioè che per me è meglio imparare a fare le cose per bene (e quindi ad imparare da chi è "del mestiere", almeno all'inizio) anche quando
apparentemente non fa differenza rispetto ad una soluzione raffazzonata.
Attenzione che abbiamo considerato il caso in cui ci sia un solo interrupt legato ad un timer, mentre se ci sono altri interrupt la cosa si complica non poco. Andrebbero gestiti, tra l'altro, in base a delle priorità.
Nelle applicazioni che ho visto, eventuali altri interrupt erano principalmente "one-shot", come ad esempio il superamento di qualche soglia, che va ad interrompere il normale funzionamento. In ogni caso, ci potrà essere un solo interrupt che occupa la maggior parte del tempo, mentre le altre routine di servizio dovranno essere abbastanza brevi.
Alcuni microcontrollori hanno una gestione molto fine e flessibile (ma anche complicata) delle priorità, un esempio che conosco (anche se non ho mai dovuto mettere le mani più di tanto nella configurazione degli interrupt) è il TI C2000.
(*) Mio padre era un artigiano molto appassionato del suo lavoro. Nonostante cercasse sempre soluzioni creative, aveva delle "abitudini" o "procedure", piccoli dettagli che seguiva senza nemmeno pensarci (ad esempio, disponeva i pezzi da lavorare in un certo verso). A cosa serviva? A non fare errori banali.
Visto che stiamo parlando, in fin dei conti, di "buone pratiche" nella programmazione di microcontrollori in C/C++...
Siccome sono rimasto "scottato" una volta, quando definisco una costante numerica uso sempre le parentesi, e spesso metto ".0" dietro l'intero:
- Codice: Seleziona tutto
#define NUM (1.0/10.0)
#define DEN (2.0)
#define QUOTIENT (NUM/DEN)
Meglio mettere le parentesi dove non serve, che rischiare di farne a meno dove serve...
(**) Nel dubbio, ad esempio se si pensa che la routine di interrupt duri troppo, si può sempre fare una verifica con l'oscilloscopio, alzando ed abbassando un pin del micro...