フレームワークとプログラムの書き方
本コースでは、「Arduinoフレームワーク」というフレームワークの提供する関数(複数の処理をまとめたもの)や定数を用いてプログラムを作成していきます。
以下はArduinoフレームワークにおいて「GPIO21ピンを出力ピンに設定」するプログラム処理の例です。
pinMode(21, OUTPUT); // GPIO21ピンを出力ピンに設定
Code language: JavaScript (javascript)
C言語では、プログラムの処理の最後は「;」(セミコロン)を付けます。セミコロンは処理の終わりを表します。プログラムで何かしら処理を記述した際は、必ず最後にセミコロンを付けます。
レジスタ操作と関数
マイコンの動作の制御は、マイコンのレジスタに値を書き込んだりレジスタから値を読み取ったりすることによって行なわれます。
以下は、ESP32のGPIO21ピンを出力ピンに設定したい場合の、レジスタを操作するプログラム処理の例です。
*(unsigned int*)0x3FF44020 |= 0x00200000; // GPIO21ピンを出力ピンに設定
Code language: Arduino (arduino)
上記の例では、GPIO0〜GPIO31ピンの出力ピンとしての機能の有効化を制御する0x3FF44020番地レジスタの、GPIO21ピンに相当する21番ビットに、出力ピン機能の有効化を設定する値「1」を書き込んでいます。
なお、上記の例ではレジスタの番地、書き込む値とも、16進数で書かれています。レジスタの番地0x3FF44020の前に付いている「*(unsigned int*)」は、「この数値はレジスタの番地なので、その番地にアクセスしてください」というおまじないです。「|=」は、「後ろに続く数値の、値が1になっているビット(0x00200000の場合は21番ビット)を、前の値(今の場合はレジスタの0x3FF44020番地の値)でも1にしてください」というおまじないです。
プログラムの作成は、このようにレジスタを番地を指定して直接アクセスする処理を書いていくことによっても原理的には可能ですが、文字通り数値である番地の操作を延々と書いていかなければなりません。このようなプログラミングは非常に手間がかかるとともに書き間違い等も生じやすく、さらに後から見て何をしているのか解読困難なプログラムになってしまいます。
このような困難と非効率を回避するために、「ライブラリ」や「フレームワーク」が提供されています。
「ライブラリ」では、レジスタとのやりとり(およびその他の処理)が容易に行えるように、「関数」と呼ばれる複数の処理をまとめて行う命令や、種々の定数が用意されています。
「フレームワーク」では、マイコンを動かすのに必要な種々のライブラリがまとめて提供されるとともに、プログラムの大雑把な骨組みも提供されており、プログラムの作成者は自分が実現したい処理に集中することが可能です。
ESP32のプログラム開発は「Arduinoフレームワーク」で行うことができ、簡潔で効率的なプログラム開発が可能になっています。
先ほどの「GPIO21ピンを出力ピンに設定」するプログラム処理の例を見てみましょう。
pinMode(21, OUTPUT); // GPIO21ピンを出力ピンに設定
Code language: Arduino (arduino)
Arduinoフレームワークにおいては、例えば入出力設定は上記のように「pinMode」という関数で行うことができます。関数の2番目の引数「OUTPUT」は、フレームワークが提供している出力ピン設定を意味する定数です。この関数を実行するだけで、必要なレジスタの設定が行われるのです(pinMode関数の実際の処理内容は上記のレジスタ操作例と多少異なりますが、最終的には0x3FF44020番地レジスタの21番ビットが「1」になります)。