M5StickCのdefine宣言を調べる

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

M5StickCをArduino IDEで開発する場合に、最初から定義されているdefineを調べてみました。

defineの階層

  • M5StickCライブラリ
  • M5StickCボード
  • ESP32プラットフォーム

Arduino IDEでは、上記の3層にわかれています。一番上のライブラリはM5StickC.hのファイルで、自分で読み込む必要があるライブラリです。

真ん中のボードは、Ardiono IDEで選択するボードで「M5Stick-C」という表記になっていると思います。ボードごとにコンパイルや転送オプションを変更しています。

一番下にあるプラットフォームはESP32で、基本的な関数はすべてここで定義されています。

全部出してみる

defineの宣言を知るためには、コンパイラのオプションでプリプロセッサの結果を出力するのが一番正確です。

調べたいスケッチを環境設定の「より詳細な情報を表示する」でコンパイルを選択してから、コンパイルを実行するとコンソールにコンパイル時のコマンドラインが表示されると思います。

スケッチをコンパイルしています...

上記の次の行がスケッチのコンパイルですので、コピーしてきて引数を書き換えます。

  • 「-c」を「-dM -E -x c++」に書き換え
  • 最後の-o以降を削る

上記の変更をして実行してみるとプロンプトにdefineの一覧が出力されます。ただしWindows環境で試すと、コマンドラインの文字数制限にひっかかるのでそのままだと実行できません。

バッチファイルにコマンドを書いて実行するのが、かんたんだと思います。

ただし、この結果出力を見たところ1万行以上出力されたので、とてもじゃないですがぜんぶ見ることができません。

ざっとみたところ、気になったものを紹介します。

#define B0 0
#define B00 0
#define B000 0
#define B0000 0
#define B00000 0
#define B000000 0
#define B0000000 0
#define B00000000 0
#define B00000001 1
#define B0000001 1

2進数でこんな感じのがずらっと255まで並んでいました。なにに使うんだろう。。。

あとは関数系のマクロが大量に入っていました。

#define GPIO_PIN0_CONFIG 0x00000003
#define GPIO_PIN0_CONFIG_M ((GPIO_PIN0_CONFIG_V)<<(GPIO_PIN0_CONFIG_S))
#define GPIO_PIN0_CONFIG_S 11
#define GPIO_PIN0_CONFIG_V 0x3
#define GPIO_PIN0_INT_ENA 0x0000001F
#define GPIO_PIN0_INT_ENA_M ((GPIO_PIN0_INT_ENA_V)<<(GPIO_PIN0_INT_ENA_S))
#define GPIO_PIN0_INT_ENA_S 13
#define GPIO_PIN0_INT_ENA_V 0x1F
#define GPIO_PIN0_INT_TYPE 0x00000007
#define GPIO_PIN0_INT_TYPE_M ((GPIO_PIN0_INT_TYPE_V)<<(GPIO_PIN0_INT_TYPE_S))
#define GPIO_PIN0_INT_TYPE_S 7
#define GPIO_PIN0_INT_TYPE_V 0x7
#define GPIO_PIN0_PAD_DRIVER (BIT(2))
#define GPIO_PIN0_PAD_DRIVER_M (BIT(2))
#define GPIO_PIN0_PAD_DRIVER_S 2
#define GPIO_PIN0_PAD_DRIVER_V 0x1
#define GPIO_PIN0_REG (DR_REG_GPIO_BASE + 0x0088)

こんなのが0から99まで入っていて、似たようなのも大量にありました。

参考ページ

ただし、上記はgccでコンパイルしていますが、esp32はg++なのでコマンドが若干違います。

気になった単語抜き出し

M5

#define ARDUINO_BOARD "M5Stick_C"
#define ARDUINO_M5Stick_C 1
#define ARDUINO_VARIANT "m5stick_c"
#define M5_BUTTON_HOME 37
#define M5_BUTTON_RST 39
#define M5_IR 9
#define M5_LED 10
#define _M5DISPLAY_H_ 
#define _M5STICKC_H_ 
#define m5 M5

ボードとライブラリで宣言されたdefineだと思います。どこでなにを宣言しているのかは後ほど調べたいと思います。

ESP32

#define ARDUINO_ARCH_ESP32 1
#define ESP32 1
#define ESP_FAIL -1
#define ESP_OK 0
#define ESP_PLATFORM 1

たくさんあったので、抜粋です。

ESP32のESP-IDFライブラリの実行結果は0だと正常終了で、それ以外だとエラーみたいで、これ以外にもエラーコードがたくさん定義されていました。

宣言場所を探す

libraries\M5StickC\src\utility\Config.h

#define M5_IR      9
#define M5_LED     10
#define M5_BUTTON_HOME 37
#define M5_BUTTON_RST  39
#define BUTTON_A_PIN 37
#define BUTTON_B_PIN 39
// UART
#define USE_SERIAL Serial

上記がM5StickCライブラリの宣言です。BUTTON_A_PINってのも宣言されているんですね。

packages\esp32\hardware\esp32.0.4\boards.txt

m5stick-c.build.variant=m5stick_c
m5stick-c.build.board=M5Stick_C

上記の設定値が自動的にdefine宣言されるようです。

#define ARDUINO_BOARD "M5Stick_C"
#define ARDUINO_M5Stick_C 1
#define ARDUINO_VARIANT "m5stick_c"

これに対応しているはずですが、ARDUINO_M5Stick_Cはm5stick-c.build.boardの値で自動宣言されるようです。

packages\esp32\hardware\esp32.0.4\variants\m5stick_c\pins_arduino.h

#define EXTERNAL_NUM_INTERRUPTS 16
#define NUM_DIGITAL_PINS        40
#define NUM_ANALOG_INPUTS       16
#define analogInputToDigitalPin(p)  (((p)<20)?(esp32_adc2gpio[(p)]):-1)
#define digitalPinToInterrupt(p)    (((p)<40)?(p):-1)
#define digitalPinHasPWM(p)         (p < 34)
static const uint8_t TX = 1;
static const uint8_t RX = 3;
static const uint8_t SDA = 32;
static const uint8_t SCL = 33;
static const uint8_t SS    = 5;
static const uint8_t MOSI  = 15;
static const uint8_t MISO  = 36;
static const uint8_t SCK   = 13;
static const uint8_t G9 = 9;
static const uint8_t G10 = 10;
static const uint8_t G37 = 37;
static const uint8_t G39 = 39;
static const uint8_t G32 = 32;
static const uint8_t G33 = 33;
static const uint8_t G26 = 26;
static const uint8_t G36 = 36;
static const uint8_t G0 = 0;
static const uint8_t DAC1 = 25;
static const uint8_t DAC2 = 26;
static const uint8_t ADC1 = 35;
static const uint8_t ADC2 = 36;

あとM5StickCに関係あるのが、上記ファイルです。SDAとSCLのデフォルトなどはこの値を取得していると思います。

基本的にはここの値は使わないで、自分で指定するほうが安全だと思います。

環境判定用define

ESP32プラットフォーム

#ifdef ARDUINO_ARCH_ESP32
#include "???.h"
#endif
もしくは
#if defined(ARDUINO_ARCH_ESP32)
#include "???.h"
#endif

ARDUINO_ARCH_ESP32が宣言されているかで確認するのが一般的みたいです。AdafruitのライブラリだとESP32で確認していますが、公式ライブラリはARDUINO_ARCH_ESP32を使っていました。

M5StickCボード

#ifdef ARDUINO_M5Stick_C
#include "???.h"
#endif
もしくは
#if defined(ARDUINO_M5Stick_C)
#include "???.h"
#endif

ARDUINO_M5Stick_Cが宣言されているかで確認できますが、あまりボードの判定はしていないみたいです。

M5StickCライブラリ

#ifdef _M5STICKC_H_
#include "???.h"
#endif
もしくは
#if defined(_M5STICKC_H_)
#include "???.h"
#endif

_M5STICKC_H_の宣言で確認できますが、こちらもあまり使わないかな?

まとめ

実際のところESP32かの確認は必要ですが、あまりボードの違いは少ないので判定している例は少なかったです。

しかしながら1万以上もdefineがされていたとは。。。

2進数のはArduino本家のbinary.hをそのままESP32に持ってきているから、入っているみたいです。

コメント

  1. 匿名 より:

    2進数リテラルはANSI-Cには存在しない為、Arduino環境としてどんなコンパイラが来るか分からないので便宜上定義されていると思われます。