Aller au contenu


Photo
- - - - -

Variable 8 bits et dépassement


  • Veuillez vous connecter pour répondre
14 réponses à ce sujet

#1 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 690 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 24 juin 2018 - 05:21

@Serveurperso pour faire suite à la discussion commencée dans le sujet de path  Hector :

Qu'est ce que tu appelles le wrap ? Le dépassement de la taille de la variable ? Comment ça se gère?



#2 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 24 juin 2018 - 05:33

ça https://fr.wikipedia...sement_d'entieret ça permet des puissantes optimisations sur beaucoup d'algos

 

exemple en 8 bits non signé 255 + 1 = 0


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#3 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 690 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 24 juin 2018 - 05:49

Je ne vois pas bien comment tu gères le dépassement, comment tu sais que zéro c'est 0 ou 256. Et le microcontrôleur ne lève pas une exception, ou du moins un flag d'erreur ?

#4 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 24 juin 2018 - 05:58

T'es encore perché dans les langages de haut niveau:) En C ou C++ quand t'as tout les 11111111 dans une variable de type de base 8-bits (uint8_t) et que t'ajoute 1 ça fait le résultat "100000000" cependant comme le premier 1 dépasse des 8-bits ça fait simplement zéro.

En signé ça reboucle de 127 à -128 et réciproquement.

 

Ce comportement est valable pour des type signé ou non signés 8, 16, 32, 64 etc. bits


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#5 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 24 juin 2018 - 06:16

C'est grâce à ça que les roues de mon robot peuvent tourner dans le même sens pendant un temps "illimité" en stockant simplement les positions des encodeurs dans 16-bits.

 

J'ai pas mis 8-bits car sur 256 il n'y à pas assez d'espace de stockage pour calculer par exemple la largeur de l'erreur possible (retard entre la consigne et la position effective).

 

Pas besoin de 32-bits car dans les mathématique que j'utilise rien n'a besoin de plus de 65536 d'espace

Et aussi en 32 bits le wrap ne se produit pas assez souvent pour être certain que l’algorithme se comporte de façon transparente pendant le wrap justement.

 

Pourtant sur un microcontrôleur 32 bits tout peux travailler en 32 bits sans différences de vitesse mais comme je veux garder mon code portable et optimisé au maximum sur d'autres puces (comme de l'Arduino en AVR 8-bits) je préfère toujours bosser avec l'espace minimum pour les variable.

 

Un code dont les variables "tournent en rond" fréquemment sur 8 ou 16 bits est forcément plus fiable qu'un code ayant 32 bits d'espace ou le wrap ne se produit presque jamais car ce "presque" être source d'une belle surprise !

 

Un tableau de 256 de taille (0 à 255) dont l'index est stocké sur 8 bits ne débordera jamais et le code C ne pourra jamais planter de façon bizarre (écriture en dehors d'un tableau = possibilité d'écrasement aléatoire d'autres variables en mémoire).


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#6 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 690 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 24 juin 2018 - 07:18

Le haut niveau est bien mon problème, aller du haut vers le bas est plus difficile. Et quand je vois ton travail je suis admiratif et un peu jaloux 🙂. Pour en revenir au dépassement, tu ne comptes pas le nombre de dépassement du coup si tu calcules une vitesse tu fait une comparaison du nombre de tick écoulés,quand tu repasses par zéro, tu as une vitesse négative.

#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 905 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 24 juin 2018 - 08:43

en fait dans la plus pars des cas tu fais en sorte que ça ne déborde pas en utilisant une taille de variable adaptée =)

 

 

Mathématiquement ça se représente avec l'opérateur " Modulo " 

quand tu es en 8 bits non signés tous tes résultats sont " Modulo 256 " 

soit i appartenant à  [0, 255]   (i modulo 256 ) = i 

 

si tu débordes d'un côté ou de l'autre tu soustrais ou ajoutes 256 pour que le résultat soit toujours compris entre 0 et 255. 

 

Ce qui est cool c'est que si jamais tu fais des calcule dont le résultat intermédiaire dépasse de la variable c'est pas grave tant que tu sais que le résultat attendu est bien compris dans la taille de variable utilisée. 



Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#8 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 24 juin 2018 - 08:43

Pourquoi faire "compter le nombre de fois ou ça reboucle" ?

 

Imagine une calculatrice à roue (voir la vidéo du weekend de Micmaths à ce sujet lol )

 

Tu peux additionner et soustraire autant que tu veux bien au delà de la limite d'affichage de la machine, tant que que résultat final y rentre sans déborder : il sera nickel juste !

 

Chez moi un résultat final qui déborde revient à une erreur d'asservissement de >65536 impulsions ce qui signifie une cinquantaine de rotations complètes de roues (65536 / ROUECPR dans notre code avec jojo), et c'est impossible à atteindre car elle est clampé à ERREURMAX

En gros mon PID essai de rattraper l'erreur tant que celle ci est <ERREURMAX sinon seule une erreur = à ERREURMAX sera rattrapée et une alerte visuelle apparaît sur l'interface du robot (= roue bloquée provoquant une erreur > 15 degrés et un énorme pic de consommation).


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#9 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 690 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 24 juin 2018 - 09:01

Je ne suis pas sûr de tout comprendre, je vais regarder la vidéo voir si ça m'aide. 



#10 Forthman

Forthman

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 919 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 24 juin 2018 - 10:01

une question m'interroge...

plutôt que de vérifier "manuellement" s'il y a dépassement de la capacité, n'existe-t-il pas une fonction pour lire le flag d'overflow ?

 

J'y connais rien en prog arm, mais sur x86 détecter le débordement est facile à gérer

Flag Overflow = débordement

Flag Carry = débordement positif

 

Donc si Overflow mais pas de Carry = débordement négatif



#11 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 905 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 24 juin 2018 - 10:35

Il n'y a pas de flags de ce type juste sur des variables ... 

Il y a des flags de ce type sur certains registre du type timer ou autre mais là ça dépend de ce qui est utilisé.


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#12 Forthman

Forthman

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 919 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 24 juin 2018 - 11:04

ah... c'est vraiment dommage que les opérations (au moins l'addition et la soustraction) ne puissent pas renvoyer l'information d'overflow,

ça simplifierait vraiment le code...



#13 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 690 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 25 juin 2018 - 06:27

Si la nuit m'a bien porté conseil, ce que je comprend, c'est tu prends un type de variable de taille raisonnable afin de pouvoir reproduise facilement un dépassement de capacité et être sûr que ça ne cause aucun soucis ; dépassement de capacité que tu évites malgré tout de faire mais qui est géré dans ton programme en vérifiant une certaine cohérence des valeurs.

#14 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 905 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 25 juin 2018 - 07:23

Si la nuit m'a bien porté conseil, ce que je comprend, c'est tu prends un type de variable de taille raisonnable afin de pouvoir reproduise facilement un dépassement de capacité et être sûr que ça ne cause aucun soucis ; dépassement de capacité que tu évites malgré tout de faire mais qui est géré dans ton programme en vérifiant une certaine cohérence des valeurs.

 

Alors oui la plus part du temps on utilise une variable de taille raisonnable afin d'être sûr qu'il y ait pas de dépassement. 

Dans d'autre cas on choisit volontairement de jouer avec le dépassement. 

Exemple concret tu peux choisir de représenter 360° sur 8 bits. 

0 = 0°

128 = 180°

255 = 359°  

 

si tu fais  359° + 1° ça dépasse de 360° mais tu reviens sur 0° 

Ce qui équivaut à 255 + 1 = 256 = 0 ... 

 

 
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#15 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 690 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 25 juin 2018 - 08:15

Je pense avoir saisie.C'est vrai que dans mon quotidien on ne se pose pas la question, même si je me pose la question pour une éventuelle optimisation on me répond qu'on va pas chipoter, vu la puissance des machines.






0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users