Sur un microcontrôleur (plus précisément, sur une carte Arduino Uno utilisant le microcontrôleur ATmega 328P), j'utiliserais normalement une boucle infinie pour vérifier les entrées, etc. (dans Arduino land, c'est normalement la fonction loop ()). Si je laisse cette fonction vide cependant, cela ne pose aucun problème.
Modèle de programmation classique, ayant une boucle principale…
Sur un ordinateur de bureau / ordinateur portable avec un processeur Intel i7, etc., si je exécutais une boucle infinie similaire (sans rien à faire, ou très peu à faire), cela épinglerait le processeur à ~ 100% et ferait généralement tourner les ventilateurs, etc. ( un délai pourrait être ajouté pour éviter cela, par exemple).
… il se peut que nous écrivions différentes boucles principales.
Cette même boucle principale serait également une mauvaise pratique sur un microcontrôleur, car cela fait également fonctionner le processeur de celui-ci à pleine charge - ce qui consomme de l'énergie. Ne faites pas cela, surtout si vous êtes sur batterie.
Les cœurs de processeur modernes ont des mécanismes de synchronisation. Cela permet aux gens d'implémenter quelque chose comme "laisser l'exécution de cette boucle dormir jusqu'à ce qu'une ms se soit écoulée, ou jusqu'à ce que cette condition ait changé".
C'est fondamentalement au cœur de tout système d'exploitation multi-tâches - et fondamentalement tous les systèmes d'exploitation qui méritent ce nom le sont maintenant. Sur les microcontrôleurs, vous trouverez souvent des RTOS (systèmes d'exploitation en temps réel), qui garantissent à quel point vous pouvez être sûr que l'exécution de quelque chose a commencé après tant de nanosecondes, car c'est typique du cas d'utilisation. des microcontrôleurs, alors que sur les ordinateurs de bureau et les processeurs de serveur, vous trouverez généralement des systèmes d'exploitation multitraitement simultanés à part entière qui offrent moins de garanties de synchronisation, mais offrent un ensemble beaucoup plus large de fonctionnalités et d'abstraction d'environnement matériel et logiciel.
Je ne connais pas assez bien l'environnement d'exécution Arduino pour faire des déclarations qualifiées à ce sujet, je recherche ceci au moment où j'écris: Arduino ne semble pas conçu pour cela - il s'attend vraiment à ce que vous tourniez simplement occupé. Comme il n'a pas de fonctionnalité "yield", le "ménage" qu'il effectue entre les appels à votre boucle
ne peut pas être appelé lorsque vous utilisez la fonction intégrée delay
. Pouah! Mauvaise conception.
Ce que vous feriez dans une conception tenant compte de la puissance et / ou de la latence, vous utiliseriez un RTOS pour votre microcontrôleur - FreeRTOS est assez populaire, pour la série ARM Cortex-M, mbed a beaucoup de traction, je personnellement comme ChibiOS (mais je ne pense pas que ce soit un bon choix lors du passage des croquis Arduino), la Fondation Linux pousse Zephyr (sur lequel je suis en conflit); vraiment, il y a une multitude de choix, et le fabricant de votre microcontrôleur prend généralement en charge un ou plusieurs via leurs IDE.
Pourquoi cela semble-t-il correct sur un microcontrôleur mais n'est généralement pas souhaité sur un microprocesseur?
Ce n'est pas vraiment OK, c'est un modèle de conception inhabituel, en fait, pour les microcontrôleurs, qui font généralement les choses à intervalles réguliers ou réagissent à des stimuli externes. Il n'est pas habituel que vous vouliez "utiliser autant de CPU que possible" sur un microcontrôleur en continu.
Il y a des exceptions à ce modèle, et elles existent aussi bien dans le MCU que dans le monde des processeurs serveur / bureau; quand vous savez que vous avez pratiquement toujours par exemple données réseau à traiter dans une appliance de commutation, ou lorsque vous savez que votre jeu pourrait déjà pré-calculer un peu de monde dont vous pourriez ou non avoir besoin dans quelques instants, vous trouverez ces boucles de rotation. Dans certains pilotes matériels, vous trouverez des "verrous de rotation", ce qui signifie que le processeur interroge en permanence une valeur jusqu'à ce qu'elle ait changé (par exemple, le matériel est configuré et peut être utilisé maintenant), mais il s'agit généralement d'une solution d'urgence uniquement, et vous devrez expliquer pourquoi vous faites cela lorsque vous essayez d'obtenir un tel code sous Linux, par exemple.
Ai-je raison de penser que l'ATmega fonctionne en fait à 100% et que, du fait de sa faible puissance, cela ne pose pas de problèmes de chaleur évidents?
Oui. L'ATMega n'est pas, selon les normes modernes, de faible puissance, mais il est suffisamment faible pour que la chaleur ne devienne pas un problème.