Su un microcontrollore (più specificamente, su una scheda Arduino Uno che utilizza il microcontrollore ATmega 328P) normalmente userei un loop infinito per controllare gli ingressi ecc (in Arduino land, questa è normalmente la funzione loop ()). Se lascio questa funzione vuota, tuttavia, non causa alcun problema.
Pattern di programmazione classico, con un ciclo principale ...
Su un desktop / laptop con una CPU Intel i7, ecc. se eseguissi un ciclo infinito simile (senza niente da fare o molto poco da fare), la CPU sarebbe bloccata a ~ 100% e in genere le ventole ecc. ( un ritardo potrebbe essere aggiunto per evitare ciò, ad esempio).
... potremmo scrivere diversi cicli principali.
Questo stesso loop principale sarebbe una cattiva pratica anche su un microcontrollore, perché anche quello esegue la CPU di quello a pieno carico, il che brucia energia. Non farlo, soprattutto se usi la batteria.
I moderni core della CPU hanno meccanismi di sincronizzazione. Ciò consente alle persone di implementare qualcosa come "lascia che l'esecuzione di questo ciclo dorma fino a quando non è trascorso 1 ms o finché questa condizione non è cambiata".
Questo è fondamentalmente il fulcro di qualsiasi sistema operativo multi-task - e praticamente tutti i sistemi operativi che meritano quel nome lo sono ormai. Sui microcontrollori, troverai spesso i cosiddetti RTOS (sistemi operativi in tempo reale), che garantiscono quanto puoi essere sicuro che l'esecuzione di qualcosa sia iniziata dopo così tanti nanosecondi, perché è tipico del caso d'uso di microcontrollori, mentre sui desktop e sulle CPU dei server di solito si trovano sistemi operativi multiprocessing simultanei completi che offrono meno garanzie sui tempi, ma offrono un insieme molto più ampio di funzionalità e astrazione dell'ambiente hardware e software.
Non conosco l'ambiente di esecuzione di Arduino abbastanza bene da rilasciare affermazioni qualificate al riguardo, sto cercando questo mentre scrivo: Arduino non sembra progettato per questo - si aspetta davvero che tu giri alacremente. Poiché non ha funzionalità di "rendimento", la "pulizia" che esegue tra le chiamate al tuo loop
non può essere chiamata quando usi la funzione delay
incorporata. Uffa! Cattivo design.
Quello che faresti in un design sensibile alla potenza e / o alla latenza, useresti un RTOS per il tuo microcontrollore - FreeRTOS è piuttosto popolare, per la serie ARM Cortex-M, mbed ha molta trazione, io personalmente come ChibiOS (ma non penso che sia una buona scelta quando si passa dagli schizzi di Arduino), la Linux Foundation sta spingendo Zephyr (su cui sono in conflitto); in realtà, c'è una vasta gamma di scelte e il produttore del tuo microcontrollore di solito ne supporta uno o più tramite i loro IDE.
Perché questo apparentemente è ok su un microcontrollore ma di solito non lo si desidera su un microprocessore?
Non è proprio OK, è un modello di progettazione insolito, infatti, per i microcontrollori, che tipicamente fanno le cose a intervalli regolari o reagiscono a stimoli esterni. Non è normale che tu voglia "usare più CPU possibile" su un microcontrollore continuamente.
Ci sono eccezioni a questo modello, ed esistono sia nell'MCU che nel mondo dei processori server / desktop; quando sai di avere praticamente sempre, ad es. dati di rete da elaborare in un'appliance di commutazione, o quando sai che il tuo gioco potrebbe già precalcolare un po 'di mondo di cui potresti aver bisogno o meno in pochi istanti, troverai questi cicli di rotazione. In alcuni driver hardware, troverai "spin lock", il che significa che la CPU interroga continuamente un valore fino a quando non è cambiato (ad esempio, l'hardware ha terminato la configurazione e può essere utilizzato ora), ma generalmente è solo una soluzione di emergenza, e dovrai spiegare perché lo stai facendo quando cerchi di inserire tale codice in Linux, per esempio.
Ho ragione a pensare che l'ATmega funziona effettivamente al 100% e che, essendo così a bassa potenza, non causa problemi di calore evidenti?
Sì. L'ATMega non è, per gli standard moderni, a bassa potenza, ma è abbastanza a bassa potenza perché il calore non diventi un problema.