2017-08-19 4 views
-5

Ich muss ein I2C-Gerät knallen und stieß auf diesen Code auf Wikipedia.Was macht diese C++ Funktion?

#define I2CSPEED 100 

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

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

Ich bin verwirrt, was

v; 

tut. Wie lange dauert diese Verzögerung?

Antwort

5

Wahrscheinlich war dies für eine Plattform, wo der Zugriff auf eine volatile Variable eine tatsächliche Speicherleseoperation erzwingt. Wenn dies der Fall ist, dauert die Schleife wahrscheinlich mindestens 100 Speicherlesevorgänge. Je nachdem, wie die CPU ausgelegt ist, kann es länger dauern.

Beachten Sie, dass auf den meisten x86-CPUs, die typische Computer wahrscheinlich verwenden, keine tatsächlichen Lesevorgänge vorhanden sind. Aber vermutlich war das für so etwas wie ein Raspberry Pi.

Die Wikipedia page that contains this same code macht klar, dass es Pseudo-C ist und nicht als Code gedacht ist, den Sie tatsächlich ausführen würden, sondern eher eine Anleitung zum Schreiben von Code. Wenn Sie diesen Code tatsächlich verwenden würden, sollten Sie diese Schleife wahrscheinlich durch eine geeignete Verzögerungsfunktion für Ihre Plattform ersetzen.

0

Es hängt von der Geschwindigkeit des Mikroprozessors/Microcontrollers, der Anzahl der Anweisungen und der Anzahl der Zyklen in jeder Anweisung ab. Sie können die Verzögerung nach dem Generieren der Assembly-Anweisung aus diesem C/C++ - Code berechnen. Sie können die Gesamtzahl der Zyklen berechnen, die zur Ausführung des obigen Codes benötigt werden, und sie mit einer Zykluszeit multiplizieren (1/Frequenz).