Compréhension code

Bonjour,

Je débute un projet sur Arduino, je dois reprendre un projet réalisé par une autre personne et l'améliorer.
Au tout début du code, il y a :

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

Je ne comprends pas à quoi ces lignes servent.

Merci d'avance pour votre aide

Bonjour

cbi permet de mettre à zéro un bit (='ClearBit') dans un registre
sbi permet de mettre à un bit (='Set Bit') dans un registre

sfr (='spécial function register') désigne l'adresse du registre que l'on veut manipuler
bit représente le rang du bit que l'on veut modifier

D'accord je vois à peu près merci !

ces lignes définissent des "macros"(raccourci pour macro-instruction).

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

indique au compilateur de remplacer (c'est du traitement de texte pur) tout expression de type cbi(x,y) par le machin compliqué à droite. Cette expression mets à 0 le bit y une adresse qui dépend de x. D'où le nom cbi = clear bit.
L'autre macro met un bit à 1 (sbi = set bit)

De plus, on ne veut pas que ces macros soient définies si elles le sont déjà. Ce serait une erreur de compilation. Comment ça, déjà définies ? Ca peut arriver si, avant d'écrire ces macros, on inclut un fichier .h qui, lui-même les définit. Pour éviter l'erreur de compil, on entoure la définition (#define) de la macro par

#ifndef UNE_MACRO // seulement si UNE_MACRO n'est pas defini ( not defined )
  #define UNE_MACRO(x) ce que tu veux fonction de x
#endif // fermer la condition #ifndef

Très clair merci beaucoup ! :slight_smile: