今回も Arduino のフレームワークの話題です。
前回、タイマー割り込みでイベントグループを使ってみました。
timerAttachInterrupt()という関数を使って割り込み処理関数を登録します。
割り込み処理関数の中で、
xEventGroupSetBits() を使ってしまって、その後 xEventGroupSetBitsFromISR() を使うように訂正しました。
その後「待てよ、それでは本当に登録した関数は割り込み処理なのかな?」という疑問が湧いてきました。
そこで今回はその中を軽く覗いてみました。
この記事は JTAG でデバッグすることを前提にして書いています。
環境構築については こちら をご覧になってください。
投稿時の開発環境を記しておきます。
PC:
Windows10 OS
開発ボード :
ESP32-DevKitCーVE
(Soc : ESP32-D0WD-V3)
デバッガー(H/W):
FT2232D
デバッガー (S/W) :
Visual Studio Code + PlatformIO + Arduino Framework
Arduinoフレームワーク
Arduinoフレームワークはいろいろな機能が提供されていて便利な反面、ソースコードレベルのデバッグができない等欠点もあります。
例えば timerAttachInterrupt()の中をステップ実行していくと、timer_isr_callback_add()が見つかります。
その中をステップ実行しようとするとC言語レベルのソースコードデバッグができなくなります。
ESP-IDFフレームワーク
そんな時には、ESP-IDFフレームワークが役に立つことがあります。
ESP-IDFフレームワークでプロジェクトを作り、timer_isr_callback_add() の中を探ってみました。
以下の順番で関数が呼ばれて、割り込みのベクターテーブルに関数が登録されることを確認できました。
timer_isr_callback_add()
timer_isr_register()
esp_intr_alloc_intrstatus()
interrupt_controller_hal_set_int_handler()
xt_set_interrupt_handler()
ということで、timerAttachInterrupt()で登録される関数は割り込み処理関数であることを確認できました。
AttachInterrupt ですから、あたりまえと言えばあたりまえなのですけどね。
また「ベクターテーブルはRAM上に置かれていて書き換えができる」という発見もありました。
時には ESP-IDF が役に立つことがあります。皆さまもぜひ使ってみてください。