esp32でタイマー割り込みを使用するプログラムを書いた。 LEDを色んなパターンで点滅させ、状態を表示するプログラム。 割り込みを使えばプログラムが長い処理を行っている最中でも 状態を表示できる。
"esp32 timer 割り込み"で検索すると いろいろ情報が出てくるが多くのサンプルプログラムは 同じ。こんな感じ。
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が起きていないので 自分としては問題解決したことにする。 この件に関し何かご存じの方がいらっしゃったら 教えていただければ幸いである。