Étape 5: Macros
Les macros sont très semblables à des programmes dont nous avons parlé dans la dernière étape, sauf qu’ils prennent des « arguments ». En d’autres termes, les macros sont essentiellement des « fonctions ». En fait, la principale différence entre le langage assembleur et toutes les langues « de haut niveau » que les gens utilisent est que quelqu'un a compilé un tas de fonctions fréquemment utilisées dans les macros. Ici, nous allons utiliser les macros pour atteindre les mêmes fins, avec une différence importante, nos macros seront là dans le code pour nous de voir et modifier comme on les aime.
Notre philosophie dans ces tutoriels de programmation consiste à se débarrasser de tous les « boîtes noires » et de savoir ce qui se passe dans les coulisses. Nous ne voulons rien qui se passe à moins que nous connaissons à ce sujet et lui avez déjà dit de le faire. C’est pourquoi c’est ce qu’on appelle « Command Line Assembly Language Programming ». Nous utilisons la ligne de commande au lieu de certains Java based IDE comme l’arduino un (en fait, j’utilise la ligne de commande même avec programmation arduino). Une fenêtre de l’ide java est comme une boîte noire pour moi. Je pourrai jamais être absolument certain qu’il n’ya pas de suppositions étant faites dans les coulisses lors de la communication de mes instructions au microcontrôleur, et je n’aime pas ça. Je n’aime pas comment pléthorique et cpu consommant de java est. En fait, c’est aussi pourquoi nous utilisons « avra » plutôt que de l’assembleur ATmel IDE. Je me rends compte que lorsque vous êtes un codeur expert ou un débutant complet, vous le savez déjà, ou vous ne se souciez pas, ce qui se passe dans les coulisses, mais ici nous sacrifierons la commodité pour éviter noir-boxness et l’adiposité.
Maintenant, ce sont quand même les macros ? Eh bien vous avez peut-être remarqué lors de la lecture à travers le programme que nous utilisons la sous-routine de « retard » dans tous les sens. Non seulement de l’intérieur de la main, mais de l’intérieur d’autres sous-routines ainsi. Cela conduit à spaghetti et nous n’aimons pas spaghetti. (tracer des lignes entre chaque bloc de sous-routine de code dans votre diagramme quand un bloc appelle une autre et vous verrez rapidement que la sous-routine de « retard » provoque le diagramme ressembler à un plat de spaghetti)
Voici comment le « retard » est généralement appelé :
Vous voyez que nous tout d’abord définir les variable (c'est-à-dire travail Registre) « millisecondes » à la valeur 25 et puis nous appelons la sous-routine « retard ». La sous-routine va retarder de 25 ms et ensuite revenir. En dehors de spaghetti, un autre problème avec cette façon de faire les choses est que si nous oublions définir la valeur de millisecondes immédiatement avant que nous appelons la sous-routine nous n’aurons aucune idée de ce que sera le retard. Ce sera n’importe quelle valeur nous mettons en millisecondes ailleurs. Il s’agit d’une façon risquée d’écrire du code. Donc pour résoudre tout cela nous suffit d’écrire une « macro ». Ici ' tis :
C’est une directive de l’assembleur que nous mettons au sommet de notre programme que le même retarde les choses que nous avions dans notre sous-routine de tarder, ça s’appelle le retard, mais c’est la différence importante que nous avons défini les variables « millisecondes » dedans ! Le symbole (signe zéro) représente tout ce que nous plaçons à côté de retard lorsque nous l’appelons. Voici comment nous l’appelons ensuite. Si nous voulions un retard de 25 ms quelque part dans notre programme nous écrivons simplement
et l’assembleur remplacera le dans la macro avec 25 et nous obtenons notre attente de 25 ms.
Pourquoi, Eh bien vous pouvez écrire les macros qui ont beaucoup plus d’arguments si vous le souhaitez. Dans ce cas, vous utiliseriez et et ainsi de suite. Lorsque vous appelez la fonction vous devez fournir tous les arguments correspondant à ces @ choses dans la macro.
Je pense que maintenant vous pouvez voir comment ils ont fait la commande de « delay(20) » du langage Arduino de droite ?
Exercice 2: ajouter une macro dans le programme et changer toutes les sous-routines afin qu’ils appellent la macro au lieu d’une sous-routine de retard. (Remarque ! Dans l’un des incidents, vous devrez chercher autour de comprendre ce que le retard est censé pour être ! J’ai délibérément laissé de côté les millisecondes de ldi dans ce cas)