h_nari @ 熊本市のブログ。電子工作、プログラミング、ゲーム、TV、 政治、インターネットなどに日々の思い付きを、 うだうだ~と書いていきたい。
このブログにはコメント欄を設けておりません。 記事への御意見、ご質問はtwitter @h_nari宛に お願い致します。


アーカイブ


アマゾン・ベストセラー

メタ情報
RSS
Login

ESP32のタイマー割り込み

esp32でタイマー割り込みを使用するプログラムを書いた。 LEDを色んなパターンで点滅させ、状態を表示するプログラム。 割り込みを使えばプログラムが長い処理を行っている最中でも 状態を表示できる。

"esp32 timer 割り込み"で検索すると いろいろ情報が出てくるが多くのサンプルプログラムは 同じ。こんな感じ。


volatile int timeCounter1;
hw_timer_t *timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR onTimer(){
  portENTER_CRITICAL_ISR(&timerMux);
  timeCounter1++;
  portEXIT_CRITICAL_ISR(&timerMux);
}
void setup() {
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 1000000, true);
  timerAlarmEnable(timer);
}
void loop() {
  if (timeCounter > 0) {
    portENTER_CRITICAL(&timerMux);
    timeCounter1--;
    portEXIT_CRITICAL(&timerMux);
  }
}

このプログラムを参考にタイマー割り込み処理を組み込み 動作させると以下のErrorが発生し、再起動してしまう。

Guru Meditation Error: Core  1 panic'ed (Cache disabled but cached memory region accessed)

このメッセージで検索すると、どうやら割り込みハンドラに IRAM_ATTRを指定していない時に発生する ものらしい。 しかしIRAM_ATTRは付けている。 割り込みハンドラをサンプルプログラムと同等の小さなものに 変更してみるとErrorは発生しない。 自分のプログラムでErrorが発生する場合も、かならず発生する わけではなくタイマー割り込みの周期を短くすると発生しやすく 長くするとしにくくなる傾向がみられる。

いろいろ試しているうちに、あるアイデアを思いつく。 自分の割り込みハンドラではswitch文を使用している。 switch文はテーブル参照のような形にコンパイルされる場合も ある。 switch文を if .. else if .. 形式に書き直せば Errorが起きないのではなかろうか....

で、試すとErrorは起きない。解決したのだろうか? もともとErrorも発生したりしなかったりするので たまたま起きていないだけかもしれない。 徹底的に調べれば良いのかもしれないが、 そこまで気力が起きない。

自分が使いたかった動作ではErrorが起きていないので 自分としては問題解決したことにする。 この件に関し何かご存じの方がいらっしゃったら 教えていただければ幸いである。