2017-08-19 6 views
-5

J'ai besoin de mordre un périphérique I2C et je suis tombé sur ce code sur Wikipedia.Que fait cette fonction C++?

#define I2CSPEED 100 

void I2C_delay(void) { 
    volatile int v; 
    int i; 

    for (i = 0; i < I2CSPEED/2; ++i) { 
    v; 
    } 
} 

Je suis confus sur ce

v; 

fait. Combien de temps dure ce délai?

Répondre

5

Probablement c'était pour une plate-forme où l'accès à une variable volatile force une opération de lecture de mémoire réelle. Si cela est vrai, la boucle prendra probablement au moins 100 lectures en mémoire. Cela peut prendre plus de temps, en fonction de la conception du processeur.

Notez que sur la plupart des processeurs x86 que les ordinateurs typiques sont susceptibles d'utiliser, il n'y aura pas de mémoire réelle lue ici. Mais probablement c'était pour quelque chose comme un Raspberry Pi.

Le Wikipedia page that contains this same code indique clairement qu'il s'agit d'un pseudo-C et qu'il ne s'agit pas d'un code que vous utilisez réellement, mais plutôt d'un guide d'écriture de code. Si vous utilisiez réellement ce code, vous devriez probablement remplacer cette boucle par une fonction de délai appropriée pour votre plate-forme.

0

Cela dépend de la vitesse du microprocesseur/microcontrôleur, du nombre d'instructions et du nombre de cycles dans chaque instruction. Vous pouvez calculer le délai après la génération de l'instruction d'assemblage à partir de ce code C/C++. Vous pouvez calculer le nombre total de cycles effectués pour exécuter le code ci-dessus et le multiplier par un temps de cycle (1/Fréquence).