Différences entre versions de « MicroPython-Hack-assembleur »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(10 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
{{MicroPython-Hack-Prepare-NAV}}
 
{{MicroPython-Hack-Prepare-NAV}}
 
{{traduction}}
 
  
 
== introduction ==
 
== introduction ==
{{bloc-etroit|text=Here you will learn how to write inline assembler in Micro Python.
+
{{bloc-etroit|text=Dans ce tutoriel, vous allez apprendre comment écrire de l'assembleur (''inline assembler'') en Micro Python.
  
Note: this is an advanced tutorial, intended for those who already know a bit about microcontrollers and assembly language.
+
{{ambox|text=Il s'agit d'un tutoriel avancé destiné à ceux qui connaissent déjà un peu les microcontroleur et le langage assembleur.}}
  
Micro Python includes an inline assembler. It allows you to write assembly routines as a Python function, and you can call them as you would a normal Python function.}}
+
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 ==
 
== Retourner une valeur ==
{{bloc-etroit|text=Inline assembler functions are denoted by a special function decorator. Let’s start with the simplest example:
+
{{bloc-etroit|text=Les fonctions assembleur Inline sont annotées avec une fonction de décoration spéciale. Commençons par l'exemple le plus simple:
  
 
  <nowiki>@micropython.asm_thumb
 
  <nowiki>@micropython.asm_thumb
Ligne 17 : Ligne 15 :
 
     movw(r0, 42)</nowiki>
 
     movw(r0, 42)</nowiki>
  
You can enter this in a script or at the REPL. This function takes no arguments and returns the number 42. {{fname|r0}} is a register, and the value in this register when the function returns is the value that is returned. Micro Python always interprets the {{fname|r0}} as an integer, and converts it to an integer object for the caller.
+
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. {{fname|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.  
  
If you run {{fname|print(fun())}} you will see it print out 42.}}
+
Micro Python interprète toujours {{fname|r0}} comme un entier (type {{fname|int}}) et converti cette valeur en objet {{fname|int}} (integer) pour la fonction appelante.
 +
 
 +
Si vous exécutez {{fname|print(fun())}} vous verrez apparaître la valeur 42.}}
  
 
== Accéder aux périphériques ==
 
== Accéder aux périphériques ==
For something a bit more complicated, let’s turn on an LED:
+
Pour un exemple un peu plus compliqué, essayons maintenant d'allumer une LED:
  
 
  <nowiki>@micropython.asm_thumb
 
  <nowiki>@micropython.asm_thumb
Ligne 30 : Ligne 30 :
 
     strh(r1, [r0, stm.GPIO_BSRRL])</nowiki>
 
     strh(r1, [r0, stm.GPIO_BSRRL])</nowiki>
  
This code uses a few new concepts:
+
Ce code utilise quelques nouveaux concepts:
 +
 
 +
* {{fname|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 {{fname|import stm}} puis {{fname|help(stm)}} sur l'invite REPL. Cela vous fournira toutes les constantes disponibles.
 +
* {{fname|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.
 +
* {{fname|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: {{fname|movw}} suivit de {{fname|movt}}. Le {{fname|movt}} décale (''shift'') la valeur de 16 bits (''à droite'').
 +
* {{fname|strh}} stocke un ''half-word'' (16 bits, la moitier d'un ''Word''). L'instruction ci-avant stocke les 16-bits de poids faible de {{fname|r1}} à l'adresse mémoire {{fname|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 {{fname|r0}}. Dans l'exemple ci-dessus, le 13ieme bit dans {{fname|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 {{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
 +
def asm_add(r0, r1):
 +
    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 ==
 +
Nous pouvons assigner un libellé (''label'' en anglais) a l'aide de {{fname|label(mon_label)}}, et faire sauter l'exécution du code vers l'étiquette (''to branch'' en anglais) en utilisant {{fname|b(mon_label)}}, ou un branchement conditionnel tel que {{fname|bgt(mon_label)}}.
 +
 
 +
L'example de code suivant fait clignoter la LED vertes. La LED clignotera {{fname|r0}} fois.
 +
 
 +
<nowiki>@micropython.asm_thumb
 +
def flash_led(r0):
 +
    # placer l'adresse GPIOA dans r1
 +
    movwt(r1, stm.GPIOA)
 +
 
 +
    # obtenir un masque de bits pour PA14 (broche de la LED #2)
 +
    movw(r2, 1 << 14)
 +
 
 +
    b(loop_entry)
 +
 
 +
    label(loop1)
 +
 
 +
    # allumer la LED
 +
    strh(r2, [r1, stm.GPIO_BSRRL])
 +
 
 +
    # attendre un moment
 +
    movwt(r4, 5599900)
 +
    label(delay_on)
 +
    sub(r4, r4, 1)
 +
    cmp(r4, 0)
 +
    bgt(delay_on)
 +
 
 +
    # éteindre la LED
 +
    strh(r2, [r1, stm.GPIO_BSRRH])
  
* {{fname|stm}} is a module which provides a set of constants for easy access to the registers of the pyboard’s microcontroller. Try running {{fname|import stm}} and then {{fname|help(stm)}} at the REPL. It will give you a list of all the available constants.
+
    # Attendre un peu
* {{fname|stm.GPIOA}} is the address in memory of the GPIOA peripheral. On the pyboard, the red LED is on port A, pin PA13.
+
    movwt(r4, 5599900)
* {{fname|movwt}} moves a 32-bit number into a register. It is a convenience function that turns into 2 thumb instructions: {{fname|movw}} followed by {{fname|movt}}. The {{fname|movt}} also shifts the immediate value right by 16 bits.
+
    label(delay_off)
* {{fname|strh}} stores a half-word (16 bits). The instruction above stores the lower 16-bits of {{fname|r1}} into the memory location {{fname|r0 + stm.GPIO_BSRRL}}. This has the effect of setting high all those pins on port A for which the corresponding bit in {{fname|r0}} is set. In our example above, the 13th bit in {{fname|r0}} is set, so PA13 is pulled high. This turns on the red LED.
+
    sub(r4, r4, 1)
 +
    cmp(r4, 0)
 +
    bgt(delay_off)
  
 +
    # boucler r0 fois
 +
    sub(r0, r0, 1)
 +
    label(loop_entry)
 +
    cmp(r0, 0)
 +
    bgt(loop1)</nowiki>
  
 
{{MicroPython-Hack-ASM-TRAILER}}
 
{{MicroPython-Hack-ASM-TRAILER}}

Version actuelle datée du 19 avril 2015 à 09:47


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

introduction

Dans ce tutoriel, vous allez apprendre comment écrire de l'assembleur (inline assembler) en Micro Python.

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

Nous pouvons assigner un libellé (label en anglais) a l'aide de label(mon_label), et faire sauter l'exécution du code vers l'étiquette (to branch en anglais) en utilisant b(mon_label), ou un branchement conditionnel tel que bgt(mon_label).

L'example de code suivant fait clignoter la LED vertes. La LED clignotera r0 fois.

@micropython.asm_thumb
def flash_led(r0):
    # placer l'adresse GPIOA dans r1
    movwt(r1, stm.GPIOA)

    # obtenir un masque de bits pour PA14 (broche de la LED #2)
    movw(r2, 1 << 14)

    b(loop_entry)

    label(loop1)

    # allumer la LED
    strh(r2, [r1, stm.GPIO_BSRRL])

    # attendre un moment
    movwt(r4, 5599900)
    label(delay_on)
    sub(r4, r4, 1)
    cmp(r4, 0)
    bgt(delay_on)

    # éteindre la LED
    strh(r2, [r1, stm.GPIO_BSRRH])

    # Attendre un peu
    movwt(r4, 5599900)
    label(delay_off)
    sub(r4, r4, 1)
    cmp(r4, 0)
    bgt(delay_off)

    # boucler r0 fois
    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.