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 .
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
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." 😑
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 !!
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.
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.
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.
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)
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
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 ?
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.
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.
@@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 😁
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
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.
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
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.
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 .
Merci
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
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.
@@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." 😑
Merci popur cet "e-book" d'instructions
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 !!
Merci pour le commentaire et bien vu : vous avez donné le sujet de la prochaine vidéo.
wouahhh c'est excelent!!!!!!!!
Tres bonne demonstration, merci beaucoup
Cela m'en rappelle des souvenirs.
Juste génialissimement expliqué (peut-être pas en français correct !).
Merci pour ce tutoriel.
Merci Antoine.
J’ai hâte de voir l’application concrète de ces opérations sur Arduino!
Ca arrive 😁
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.
Bonjour ! merci! très intéressent ! SUPER :-)
Excellente présentation, claire et très utile! Merci
Merci à vous
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.
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.
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.
@ Le compilateur fait le choix selon le type de variable. Il choisira ASR pour une variable signé et LSR pour une variable non signé.
J'ai enfin compris comment envoyer octet par octet un float sur 4octets avec les décalages... Merci pour ce travail
Merci pour votre retour.
Bonsoir, merci pour cette vidéo très intéressante .
Merci à vous. La suite proposera une application en plus d'expliquer comment sont gérés les ports d'entrées/sorties.
explication au top et très intéressante
Merci bien
merci beaucoup. super clair.
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)
Bonjour. Pour effectuer plusieurs changements de bits, on peut écrire directement des lignes de code du type :
PCINT = (1
Tres bon video
Merci
plus precis que peek poke !! merci
Merci
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
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 ?
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.
Sinon il est possible d'utiliser le "+" à la place du " | " du style PCMSK1 |= (1
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.
@@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 😁
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
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.
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
Bonjour. Oui bien sûr. Ils font parti de Arduino.h donc sont disponibles quelque soit l'environnement
@@EricPeronnin merci de votre réponse
J'ai un contrôle et je ne comprends pas toujours pas. Sur Les masques et les décalages en c/c++
La vidéo est claire mais j'ai pas compris à sert les Registre
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.