Différences entre versions de « MicroPython-Hack-assembleur »
Ligne 40 : | Ligne 40 : | ||
== Accepter des arguments == | == Accepter des arguments == | ||
+ | Une fonction assembleur Inline peut accepter jusqu'à 3 arguments. Si ils sont utilisés, ces arguments doivent être nommés {{fname|r0}}, {{fname|r1}} et {{fname|r2}} pour refléter les registres et les conventions d'appel. | ||
− | + | Voici une fonction qui additionne ces arguments: | |
− | |||
− | |||
<nowiki>@micropython.asm_thumb | <nowiki>@micropython.asm_thumb | ||
Ligne 49 : | Ligne 48 : | ||
add(r0, r0, r1)</nowiki> | add(r0, r0, r1)</nowiki> | ||
− | + | Cette fonction exécute le calcul {{fname|1=r0 = r0 + r1}}. Etant donné que le résultat est placé dans le registre {{fname|r0}}, ce sera donc la valeur qui sera retournée. | |
+ | |||
+ | Essayez la commande {{fname|asm_add(1, 2)}} qui devrait retourner la valeur 3. | ||
== Les boucles == | == Les boucles == |
Version du 19 avril 2015 à 09:37
introduction
Dans ce tutoriel, vous allez apprendre comment écrire de l'assembleur (inline assembler) en Micro Python.
Il s'agit d'un tutoriel avancé destiné à ceux qui connaissent déjà un peu les microcontroleur et le langage assembleur. |
Micro Python inclus un assembleur inline. Il vous permettra d'écrire des routines assembleur comme si c'était des fonctions micro python, et vous pouvez l'appeler comme si cela était des fonction Python normale.
Retourner une valeur
Les fonctions assembleur Inline sont annotées avec une fonction de décoration spéciale. Commençons par l'exemple le plus simple:
@micropython.asm_thumb def fun(): movw(r0, 42)
Vous pouvez placer de code dans un script ou le taper sur une invite REPL. Cette fonction ne prend aucun argument et retourne le nombre 42. r0 est un registre, et la valeur dans ce registre lorsque la fonction se termine, est la valeur qui est retournée par la fonction.
Micro Python interprète toujours r0 comme un entier (type int) et converti cette valeur en objet int (integer) pour la fonction appelante.
Si vous exécutez print(fun()) vous verrez apparaître la valeur 42.
Accéder aux périphériques
Pour un exemple un peu plus compliqué, essayons maintenant d'allumer une LED:
@micropython.asm_thumb def led_on(): movwt(r0, stm.GPIOA) movw(r1, 1 << 13) strh(r1, [r0, stm.GPIO_BSRRL])
Ce code utilise quelques nouveaux concepts:
- stm est un module qui offre un ensemble de constante pour facilement accéder plus facilement aux différents registres du microcontrôleur de la PyBoard. Essayer d'exécuter import stm puis help(stm) sur l'invite REPL. Cela vous fournira toutes les constantes disponibles.
- stm.GPIOA est l'adresse, en mémoire, du périphérique GPIOA. Sur la carte PyBoard, la LED rouge est sur le "port A", broche PA13.
- movwt déplace un nombre 32-bit dans un registre (un word). C'est une fonction bien pratique qui exécute les deux fonctions basiques suivantes: movw suivit de movt. Le movt décale (shift) la valeur de 16 bits (à droite).
- strh stocke un half-word (16 bits, la moitier d'un Word). L'instruction ci-avant stocke les 16-bits de poids faible de r1 à l'adresse mémoire r0 + stm.GPIO_BSRRL. Cela à pour effet de placer toutes les broches du port A au niveau haut (HIGH) pour les bit correspondant activé dans le registre r0. Dans l'exemple ci-dessus, le 13ieme bit dans r0 est activé, donc PA13 est placé au niveau haut (high) ce qui à pour effet d'allumer la LED rouge.
Accepter des arguments
Une fonction assembleur Inline peut accepter jusqu'à 3 arguments. Si ils sont utilisés, ces arguments doivent être nommés r0, r1 et r2 pour refléter les registres et les conventions d'appel.
Voici une fonction qui additionne ces arguments:
@micropython.asm_thumb def asm_add(r0, r1): add(r0, r0, r1)
Cette fonction exécute le calcul r0 = r0 + r1. Etant donné que le résultat est placé dans le registre r0, ce sera donc la valeur qui sera retournée.
Essayez la commande asm_add(1, 2) qui devrait retourner la valeur 3.
Les boucles
We can assign labels with label(my_label), and branch to them using b(my_label), or a conditional branch like bgt(my_label).
The following example flashes the green LED. It flashes it r0 times.
@micropython.asm_thumb def flash_led(r0): # get the GPIOA address in r1 movwt(r1, stm.GPIOA) # get the bit mask for PA14 (the pin LED #2 is on) movw(r2, 1 << 14) b(loop_entry) label(loop1) # turn LED on strh(r2, [r1, stm.GPIO_BSRRL]) # delay for a bit movwt(r4, 5599900) label(delay_on) sub(r4, r4, 1) cmp(r4, 0) bgt(delay_on) # turn LED off strh(r2, [r1, stm.GPIO_BSRRH]) # delay for a bit movwt(r4, 5599900) label(delay_off) sub(r4, r4, 1) cmp(r4, 0) bgt(delay_off) # loop r0 times sub(r0, r0, 1) label(loop_entry) cmp(r0, 0) bgt(loop1)
Source: Inline assembler écrit par/written by Damien P.George
Traduit par Meurisse D. pour MCHobby.be - Translated by Meurisse D. for MCHobby.be
Traduit avec l'autorisation de micropython.org - Translated with the authorisation of micropython.org
Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : « Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.
L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.