Débuter en C++ avec Arduino : Opérations sur bits. Décalage. Masquage. Forçage à 0 ou à 1. Lecture

Поделиться
HTML-код
  • Опубликовано: 12 сен 2024

Комментарии • 48

  • @kacemmahdar8451
    @kacemmahdar8451 3 года назад +4

    Très bien, méthodes et explications sont très professionnelles, merci à vous pour l'aide que vous apportez à tout le monde.
    Continuez bien M.E.PEREONNIN et ça fait plaisir d'écouter et de suivre vos vidéos .

  •  3 года назад +8

    Bonjour, merci encore pour cette vidéo très intéressante, comme toujours. Depuis mon adolescence, quand j'ai commencé à programmer en assembleur sur 6502 (Apple ][), puis après sur 68000 (Amiga), j'ai alors vu qu'il était différent d'un processeur à l'autre. Mais j'ai surtout vu que certaines choses étaient plus "efficaces" que d'autres. C'est pourquoi depuis je vais préférer faire des décalages plutôt que de multiplier/diviser par un multiple de 2, car cela se traduit souvent en 1 instruction assembleur. Je viens de regarder sur AVR (Arduino) cela correspond à l'instruction LSL ou LSR (Logical Shift Left/Right). Alors que la multiplication/division fait parfois même appel à la bibliothèque mathématique. Je n'ai pas vérifié comment c'était compilé désormais, mais il y a quelques années, ça pouvait faire la différence. Les masquages (AND) sont aussi très utiles. De même, quand je souhaite faire une boucle de 10 itérations par exemple, je vais préférer faire une boucle de 9 à 0 car le registre d'état identifie automatiquement la valeur 0 sans devoir comparer explicitement, alors que si on veut aller de 1 à 10 par exemple, la valeur de la boucle va devoir être comparée à 10 à chaque itération. Je vais préférer aussi le i++ à i=i+1 pour les mêmes raisons. Je sais, on parle de quelques cycles d'horloges et de quelques octets de code, mais c'était fort utile quand il fallait faire un programme qui tournait vite et qui tienne dans le secteur de boot d'une disquette (512 octets). Maintenant, la grande majorité des développeurs n'ont plus ce réflexe car la mémoire ne coûte plus rien, et je vois régulièrement des int (voir long) qui ne contiennent que 0/1!! Quel gâchis de bits :) Il m'arrive d'ailleurs de réécrire des bibliothèques Arduino pour qu'elles n'utilisent pas de float mais que des entiers, cela diminue de façon drastique la mémoire nécessaire, typiquement je préfère stocker une température en dixième de degrés, dans un entier, que dans un float et de mettre la virgule au bon endroit lors de l'affichage. Pour les curieux, voici la liste des instructions que l'Arduino comprend: ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf

    • @EricPeronnin
      @EricPeronnin  3 года назад +2

      Bonjour Valery. Oui, j'aurais pu préciser aussi que les divisions et multiplications suivants les puissances de 2 peuvent se faire de façon très profitable avec des décalages. C'est d'ailleurs toujours ce que je fais.

    •  3 года назад

      @@EricPeronnin oui merci de m'avoir corrigé: j'ai écris à tord *multiple* de 2 alors qu'il faut lire *puissance* de 2. Et voilà, je vais recopier 100 fois "je relis mes commentaires avant de les publier." 😑

    • @antoinedevos3765
      @antoinedevos3765 3 года назад +1

      Merci popur cet "e-book" d'instructions

  • @cyrillethierry9515
    @cyrillethierry9515 3 года назад +2

    Génial, j'ai déjà bidouillé les ports pour comprendre comment m'affranchir des bibliothèques toutes faites (ex IRremote, ou capteur ultrason) pour lesquels digitalread/digitalwrite sont trop lents, avec cette vidéo très intéressante je sens que l'on commence à se diriger vers le cœur de l'atmega328 et la manipulation des ports I/O. J'ai hâte de voir la suite !!

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Merci pour le commentaire et bien vu : vous avez donné le sujet de la prochaine vidéo.

  • @OusmaneBalde-i2k
    @OusmaneBalde-i2k 10 месяцев назад +1

    wouahhh c'est excelent!!!!!!!!

  • @walidbenaz2650
    @walidbenaz2650 8 месяцев назад

    Tres bonne demonstration, merci beaucoup

  • @antoinedevos3765
    @antoinedevos3765 3 года назад +1

    Cela m'en rappelle des souvenirs.
    Juste génialissimement expliqué (peut-être pas en français correct !).
    Merci pour ce tutoriel.

  • @lokividrson1901
    @lokividrson1901 3 года назад +2

    J’ai hâte de voir l’application concrète de ces opérations sur Arduino!

  • @wilfriedGermain-i5t
    @wilfriedGermain-i5t Год назад

    Bravo pour les vidéos extrêmement utiles et intéressantes. Bon là pour le coup je vais rester sur un bon vieil assembleur c'est beaucoup plus simple pour utiliser les ressources internes du MCU ; évidemment pour des fonctions complexes le langage évolué est plus confortable, car une simple division à virgule en assembleur c'est un bon casse tête…
    Merci pour votre partage de connaissances.

  • @samuelbertin9381
    @samuelbertin9381 2 года назад

    Bonjour ! merci! très intéressent ! SUPER :-)

  • @Victurf
    @Victurf 3 года назад +1

    Excellente présentation, claire et très utile! Merci

  • @sylvainmasson4457
    @sylvainmasson4457 3 года назад +2

    Merci Éric pour cette vidéo très bien expliqué encore une fois.
    J’ajouterais une petite précision. Dans les exemples, A est non signé. Dans le cas d’une variable signé avec un décalage à droite c’est le bit de signe et non zéro qui remplit les bits plus significatives.

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Effectivement, j'aurais du préciser cela. Le fait de travailler sur les registres du uC donc non signés par définition fait que j'ai oublié ce détail.

    •  3 года назад

      C'est effectivement une bonne question, je ne sais pas le choix du compilateur car au niveau assembleur AVR, les 2 sont possibles: ASR (Arithmetic Shift Right) conserve le bit de signe lors du décalage à droite, alors que LSR (Logical Shift Right) le bit de signe (le bit 7) est mis à 0. Dans ces deux cas, le bit 0 se retrouve dans le bit de retenu (C, Carry) du registre d'état.

    • @sylvainmasson4457
      @sylvainmasson4457 3 года назад +1

      @ Le compilateur fait le choix selon le type de variable. Il choisira ASR pour une variable signé et LSR pour une variable non signé.

  • @mikl5228
    @mikl5228 3 года назад +1

    J'ai enfin compris comment envoyer octet par octet un float sur 4octets avec les décalages... Merci pour ce travail

  • @-papy3755
    @-papy3755 3 года назад +1

    Bonsoir, merci pour cette vidéo très intéressante .

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Merci à vous. La suite proposera une application en plus d'expliquer comment sont gérés les ports d'entrées/sorties.

  • @gilleshenri9529
    @gilleshenri9529 3 года назад +1

    explication au top et très intéressante

  • @antoinelecoq1444
    @antoinelecoq1444 2 года назад +1

    merci beaucoup. super clair.

  • @MrArpSolina
    @MrArpSolina 3 года назад +1

    Bonjour, je pense qu'il aurait été possible d'optimiser encore l'accès aux registres et d'éviter tous ces décalages qui consomment du temps CPU. En effet, par exemple au lieu de définir
    PCINT8 0, PCINT9 1, PCINT10 2, PCINT11 3, PCINT12 4, PCINT13 5, PCINT14 6,
    les ingénieurs Arduino auraient pu définir ceci:
    PCINT8 1, PCINT9 2, PCINT10 4, PCINT11 8, PCINT12 16, PCINT13 32, PCINT14 64,
    et déclarer toutes ces définitions de manipulation de bits sans devoir faire des décalages. Par exemple:
    #define bitSet(value, bits) (value |= (bits))
    et pouvoir ainsi donner plusieurs bits en paramètre:
    bitSet(PCMSK1, PCINT9 | PCINT12 | PCINT13)

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Bonjour. Pour effectuer plusieurs changements de bits, on peut écrire directement des lignes de code du type :
      PCINT = (1

  • @elihoungo4552
    @elihoungo4552 3 года назад +2

    Tres bon video
    Merci

  • @fabientuizat1129
    @fabientuizat1129 3 года назад +1

    plus precis que peek poke !! merci

  • @denisjouffroy1879
    @denisjouffroy1879 3 года назад +1

    Bonjour, je programme de la logique automate sur Arduino et j'utilise beaucoup de boolean. Je fais avec des schémas contacts . C'est très lisible mais chaque boolean me prend un octet de mémoire. Je cherche une façon de programmer qui soit aussi lisible tout en consommant moins de mémoire. Si vous pouvez m'aider, me donner une piste ? Merci
    Ps: j'apprécie la clarté de vos explications

  • @qweroth
    @qweroth 3 года назад +1

    Bonjour, merci pour toutes vos vidéos c'est toujours super intéressant et super bien expliqué. Concernant les opérations sur les bits, n'est ce pas plus rapide de passer directement en assembleur avec des instructions comme CBR ou CBI ?

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Bonsoir. Le compilateur C fournit un code semblable à celui que vous pouvez écrire directement en assembleur. CBR et CBI seront utilisés de la même façon.

  • @tanguymarion6368
    @tanguymarion6368 3 года назад +1

    Sinon il est possible d'utiliser le "+" à la place du " | " du style PCMSK1 |= (1

    • @EricPeronnin
      @EricPeronnin  3 года назад +2

      Ca marche quand on sait ce qu'on fait et dans ce cas précis. Dès qu'il y a "chevauchement", c'est la cata. Donc pour les débutants qui ne maitrisent pas ces aspects, je ne peux pédagogiquement pas faire état de cela dans une vidéo.

    • @tanguymarion6368
      @tanguymarion6368 3 года назад

      @@EricPeronnin mais il peut être judicieux de prévenir que ce type d’écriture existe dans le cas où les personnes auront à lire des morceaux de code écrits sous cette forme 😁

  • @frederickluck5298
    @frederickluck5298 3 года назад +1

    Bonsoir
    Merci pour ces vidéos
    Je ne suis pas débutant et je me pose une. Question : pourquoi ne pas faire les opérations directement avec un octet code en binaire je trouve que l’on aurait un visuel plus souple et en temps certainement un gain également puisque l’on gagne le temps des décalage
    Encore merci

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Bonsoir Frédéric,
      l'utilisation des décalages est due à l'exploitation de la définition des différents bits des registres, ce qui permet de savoir de façon claire quels sont les bits que l'on veut modifier puisque leurs noms apparaissent clairement.
      Pour les autres opérations, on peut effectivement travailler une notation binaire du type 0b00100011 par exemple.

  • @pierrebaldellon4207
    @pierrebaldellon4207 3 года назад +1

    Bonjour et merci pour cette vidéo, j'avais complètement oublié comment on faisait depuis mon BTS. Justement j'en avais besoin pour faire de la programmation sur Arduino. Est ce les opérateurs genre bitread etc sont valable dans Arduino Ide ? Cordialement

    • @EricPeronnin
      @EricPeronnin  3 года назад +1

      Bonjour. Oui bien sûr. Ils font parti de Arduino.h donc sont disponibles quelque soit l'environnement

    • @pierrebaldellon4207
      @pierrebaldellon4207 3 года назад

      @@EricPeronnin merci de votre réponse

  • @lealola9219
    @lealola9219 2 года назад

    J'ai un contrôle et je ne comprends pas toujours pas. Sur Les masques et les décalages en c/c++

  • @stephanehenault4390
    @stephanehenault4390 3 года назад +1

    La vidéo est claire mais j'ai pas compris à sert les Registre

    • @EricPeronnin
      @EricPeronnin  3 года назад +2

      Pour les registres, on en parle dans la prochaine vidéo avec l'utilisation des registres pour les entrées et sorties. Mais avant cela, il fallait les bases sur les manipulations binaires.