動作クロックと待ち時間

計算で求めたように、ESP32は約4.17ナノ秒に1回処理を行っています。

ここで注意しておかなければならないのは、「C言語のコマンド1行が1クロックで処理されるわけではない」ということです。実際にプログラム例05-1を実行して、オシロスコープで点滅速度を観測してみると、LEDが点灯して消灯するまでには300ナノ秒程度かかっており、ループの繰り返しの周期は9マイクロ秒程度でした。つまり、LEDが点灯しているのは1周期中わずか3%の時間だけです。消灯から再度点灯までに2000クロックもかかっている計算になりますが、これは、loop関数の終了から再呼び出しまでの間にArduinoフレームワークの背後でシリアル通信関係の処理が行われており、それに時間がかかっているためです。また、点灯および消灯の処理を行うdigitalWrite関数も、70クロック程度かかっている計算になります。かなりのクロック数がかかっているように見えますが、それでも人間の目で点滅が認識できるよりも遥かに速い速度であり、LEDは常時点灯しているように見えるのです。

そこで、LEDの点灯と消灯の間に待ち時間を入れれば、LEDが点滅しているように見せることができます。

それでは、待ち時間を入れたフローチャートを考えてみましょう。フローチャートが描けたら、次に進んで答え合わせをしてみましょう。

シリアル通信による時間待ち

ところで、以下のようにloop関数の中にシリアル出力を追加してみましょう。

/*
 * loop 関数
 */
void loop() {
  /* ここにプログラム中で繰り返し実行したい処理を上から順に記述していきます */

  Serial.println("LEDの点灯");
  digitalWrite(0, HIGH); // LEDを点灯

  Serial.println("LEDの消灯");
  digitalWrite(0, LOW);  // LEDを消灯
}
Code language: Arduino (arduino)

このプログラムを実行すると、LEDがちらついて見えるようになります。これは、Serial.println関数がシリアル通信関連の処理を行うのにある程度時間がかかり(通常は40マイクロ秒程度ですが、数回に1回、10ミリ秒ほどかかる場合があるようです)、LEDがON/OFFする間に、待ち時間のように振る舞っているためです。

前の記事

LEDの点滅 – プログラム例1

次の記事

時間待ち関数