Bonjour,
Dans la très grande majorité des cas, on a pas à se poser de telles questions, on écrit un code en C/C++, on le compile avec l'IDE et on le téléverse dans un Arduino.
Je constate qu'il existe 9 articles sur l'assembleur sur le site de Locoduino:
https://www.locoduino.org/spip.php?article280Ce premier article compare un blink.c à un blink\main.asm, introduit également l'assembleur inline (quelques lignes d'assembleur ajoutées dans un programme écrit en C/C++).
Cette intro présentant l'assembleur comme étant plutôt réservé aux experts, et ajoute un moment: "
L’idéal est donc d’utiliser le langage C en appelant certaines fonctions écrites en assembleur uniquement lorsque cela présente un avantage (respect d’un timing bien particulier par exemple)."
On peut s'intéresser au fonctionnement d'une CPU par simple curiosité. Mieux comprendre son fonctionnement sera utile dans ces cas particuliers.
L'article de Locoduino précise aussi que "
Chaque microcontrôleur possède son assembleur [...] si vous voulez écrire un programme en assembleur : si vous changez de microcontrôleur, il faudra réécrire le programme au moins en partie, voire en totalité !"
C'est le sujet de la portabilité. Les AVR dont différents des esp32, différents aussi des Teensy ou des STM32 (tous différents aussi de cette CPU virtuelle). Si le besoin est un code avancé avec un timing précis à base de quelques lignes d'assembleur, il faudra adapter les lignes selon la CPU qu'on souhaite utiliser. Là encore, comprendre le fonctionnement d'une CPU (de façon générale) sera utile.
On connaît tous la fonction Delay(), en millisecondes, c'est des premières qu'on découvre avec blink.c. Pour un délais très court, on peut utiliser l'instruction ou OP code "NOP": ne rien faire pendant un cycle d'horloge. Pour un timing précis et court, le code en assembleur inline pourrait parfois être aussi simple que:
asm("nop; nop; nop; nop; nop; nop;");
//Or
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
Ici, pour un timing simple, on pourrait avoir à adapter le nombre de NOP selon la clock/quartz de la CPU cible.
Dans l'article 4 de Locoduino, en conclusion, je lis: "
C’est donc dans les cas de projets très pointus que vous aurez besoin de programmer en assembleur, ou bien tout simplement parce que cela vous plaît et que ça représente un nouveau challenge dans votre connaissance des microcontrôleurs."
https://www.locoduino.org/spip.php?article283L'article 6 est intitulé "Mélanger assembleur et C/C++" et reste encore orienté timing:
https://www.locoduino.org/spip.php?article287Un appel d'une fonction écrite en assembleur, depuis du C/C++. Dans leur ensemble, ces premiers articles présentent également l'assembleur comme étant optimisé en terme d'instructions, pour du code court, optimisé, maitrisé et rapide.
Dans une application basse consommation, pour économiser l'énergie, on pourrait avoir envie d'utiliser de l'assembleur et ce afin de remettre au plus vite la CPU en veille entre deux périodes d'activités. Ce qui rejoint l'intro de l'article 6:
"
Après avoir lu les articles précédents, vous êtes maintenant capables de concevoir des routines écrites en assembleur au sein de programmes plus complexes écrits en C/C++. En opérant ainsi, vous exploitez la convivialité et l’efficacité du langage C/C++ tout en lui apportant un outil supplémentaire capable d’offrir un code plus compact, s’exécutant plus rapidement et respectant un timing très précis. ..."
https://www.locoduino.org/spip.php?article289